#ifndef TILE_H #define TILE_H #include #include #include class Tile { public: enum Type { // Face-down tile: Back, // Characters set: Man_1, Man_2, Man_3, Man_4, Man_5, Man_6, Man_7, Man_8, Man_9, // Circles set: Pin_1, Pin_2, Pin_3, Pin_4, Pin_5, Pin_6, Pin_7, Pin_8, Pin_9, // Bamboo set: Sou_1, Sou_2, Sou_3, Sou_4, Sou_5, Sou_6, Sou_7, Sou_8, Sou_9, // Winds: Ton, Nan, Xia, Pei, // Dragons: Chun, Haku, Hatsu }; enum Set { Honor, Man, Pin, Sou }; Type type; bool red; bool rotated; //! Default constructor. Tile(); //! Construct tile by type. Tile(Type t, bool re = false, bool ro = false); //! Construct tile by set and number. Tile(Set s, int num, bool re = false, bool ro = false); virtual ~Tile(){}; //! Get the numeric value of the tile (if one of the man/pin/sou-sets). int get_num() const; //! Get the set type of the tile (if one of the man/pin/sou-sets). Set get_set() const; //! Compare two tiles. Equal if type matches; flags are not compared. bool operator==(const Tile& other) const; //! Compare two tiles. Ordered by type, red < non-red. bool operator<(const Tile& other) const; //! Increment type. Useful for iterating over all possible types. Tile operator++(int); template void serialize(Archive & ar, const unsigned int version) { ar & type; ar & red; ar & rotated; } }; //! List of tiles. class Tiles : public std::vector { public: //! Sort the list of tiles. void sort(); template void serialize(Archive & ar, const unsigned int version) { ar & boost::serialization::base_object >(*this); } }; #endif