#include <cassert>

#include <virtualtetrahedron.h>


virtualtetrahedron::virtualtetrahedron()
{
  v[0]=0;
  v[1]=1;
  v[2]=2;
  v[3]=3;
}

bool const virtualtetrahedron::validstate() const 
{
  uint k;
  uint i;
  bool valid;
  for (k=0; k<4; ++k)
  {
    valid=false;
    for (i=0; (i<4)&&(valid==false); ++i)
    {
      if (v[i]==k)
        valid=true;
    }
     
    if (valid==false)
      return false;
  }
  
  return true; 
}

void virtualtetrahedron::anticlockwise()
{
  uint k = v[0];
  v[0] = v[1];
  v[1] = v[2];
  v[2] = k;
}

void virtualtetrahedron::clockwise()
{
  uint k = v[2];
  v[2] = v[1];
  v[1] = v[0];
  v[0] = k;
}

void virtualtetrahedron::left()
{
  uint a = v[0];
  uint b = v[2];
  uint c = v[3];
  uint d = v[1];

  v[0] = a;
  v[1] = b;
  v[2] = c;
  v[3] = d;
}

void virtualtetrahedron::right()
{
  uint a = v[2];
  uint b = v[1];
  uint c = v[3];
  uint d = v[0];

  v[0] = a;
  v[1] = b;
  v[2] = c;
  v[3] = d;
}

void virtualtetrahedron::down()
{
  uint a = v[1];
  uint b = v[0];
  uint c = v[3];
  uint d = v[2];

  v[0] = a;
  v[1] = b;
  v[2] = c;
  v[3] = d;
}


  // v[0..2] anticlockwise, v[3]=base
void virtualtetrahedron::set(uintc base)
{
  switch (base)
  {
    case 0:
      v[0] = 2;
      v[1] = 1;
      v[2] = 3;
      break;

    case 1:
      v[0] = 2;
      v[1] = 3;
      v[2] = 0;
      break;

    case 2:
      v[0] = 1;
      v[1] = 0;
      v[2] = 3;
      break;

    case 3:
      v[0] = 1;
      v[1] = 2;
      v[2] = 0;
      break;

    default:
      assert(false);
      return;
  }

  v[3] = base;
}

ostream & operator << (ostream& os, virtualtetrahedron const & x)
{
  os << x.v[0] << " " << x.v[1] << " " << x.v[2] << " " << x.v[3];
  return os;
}



