#ifndef SEQUENCESEQUAL_H
#define SEQUENCESEQUAL_H

#include <typedefs.h>

/** Given two vectors of length 3, do they have the same elements in number
    and type independent of their order.  eg (2,1,1) is the same as (1,1,2). */
template< typename INDX>
boolc sequencesequal3(INDX const* va, INDX const* vb);

//<TODO> expand for 4 and general N

//---------------------------------------------------------
// Implementation


template< typename INDX, uint I0, uint I1, uint I2 >
class sequencesequal3helper
{
public:

  boolc eval(INDX const* va, INDX const* vb) const;
};


template< typename INDX, uint I0, uint I1, uint I2 >
boolc sequencesequal3helper<INDX,I0,I1,I2>::eval
(
  INDX const* va, 
  INDX const* vb
) const
{
  if (va[I0]==vb[I0])
  {
    if (va[I1]==vb[I1])
    {
      if (va[I2]==vb[I2])
        return true;
    
      return false;
    }

    if (va[I1]==vb[I2])
    {
      if (va[I2]==vb[I1])
        return true;
    
      return false;
    }
    
    return false;
  }

  return false;
}

template< typename INDX>
boolc sequencesequal3(INDX const* va, INDX const* vb)
{

  if (sequencesequal3helper<INDX,0,1,2>().eval(va,vb)==true)
    return true;

  if (sequencesequal3helper<INDX,2,1,0>().eval(va,vb)==true)
    return true;

  if (sequencesequal3helper<INDX,1,0,2>().eval(va,vb)==true)
    return true;

  return false;

/*

  if (va[0]==vb[0])
  {
    if (va[1]==vb[1])
    {
      if (va[2]==vb[2])
        return true;
    
      return false;
    }

    if (va[1]==vb[2])
    {
      if (va[2]==vb[1])
        return true;
    
      return false;
    }
    
    return false;
  }


  if (va[1]==vb[0])
  {
    if (va[0]==vb[1])
    {
      if (va[2]==vb[2])
        return true;
    
      return false;
    }

    if (va[0]==vb[2])
    {
      if (va[2]==vb[1])
        return true;
    
      return false;
    }
    
    return false;
  }


  if (va[2]==vb[0])
  {
    if (va[1]==vb[1])
    {
      if (va[0]==vb[2])
        return true;
    
      return false;
    }

    if (va[1]==vb[2])
    {
      if (va[0]==vb[1])
        return true;
    
      return false;
    }
    
    return false;
  }

  return false;
*/

}


#endif



