#include <cstdio>

class Color
{
public:
  float red, green, blue, alpha;
  Color() {  }       
  Color(float red, float green, float blue, float alpha);
  //Color(const Color& orig);

  void drawColor();
  void setColor(const Color& color);
  void exchangeColor(Color & color);
};
	
Color::Color(float red, float green, float blue, float alpha)
{
  Color::red = red;
  Color::green = green;
  Color::blue = blue;
  Color::alpha = alpha;
} 
const Color yellow = Color ( 1.0f, 1.0f, 0.0f, 1.0f );
const Color orange = Color ( 1.0f, 0.5f, 0.0f, 1.0f );
const Color green  = Color ( 0.0f, 1.0f, 0.0f, 1.0f );
const Color red    = Color ( 1.0f, 0.0f, 0.0f, 1.0f );
const Color blue   = Color ( 0.4f, 0.4f, 1.0f, 1.0f );
const Color black  = Color ( 0.0f, 0.0f, 0.0f, 1.0f );

enum Side
  {
    Front = 1, Left = 2, Back = 3, Right = 4, Top = 5, Bottom = 6
  };

enum Edge
  {
    ELeft, ETop, ERight, EBottom, Non
  };


class Stone{
public:
  Color color1, color2, color3;
  enum Side side;
  Edge edge1, edge2;
  bool StoneUsed;

  Stone();       
  Stone(Side side, Edge edge1, Edge edge2);

  void overrideStone(const Stone& stone );
  void exchangeColors(Stone& s);
  void switchEdgesXZ();
  void switchEdgesYZCorner();
  void switchEdgesXYCorner();
private:
  void getSideColor(Side side, Edge edge1, Edge edge2);
  void getEdgeColor(Side side, Edge edge1, Edge edge2);
  void getFrontCornerColors(Edge edge1, Edge edge2);
  void getLeftCornerColors(Edge edge1);
  void getRightCornerColors(Edge edge1);
  void getBackCornerColors(Edge edge1, Edge edge2);
  void getTopColors();
  void getBottomColors();
}; 

Stone :: Stone(Side side, Edge edge1, Edge edge2){
  Stone::side = side;
  Stone::edge1 = edge1;
  Stone::edge2 = edge2;

  printf("green = %f, %f, %f \n",green.red, green.green, green.blue);

  Stone::StoneUsed = true;

  //getSideColor(side,edge1,edge2);
} 

int main()
{
  Stone stone((Side()), (Edge()), (Edge()));
}
