HexColor.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef HEXCOLOR_HPP
00007 #define HEXCOLOR_HPP
00008
00009 #include "Benzene.hpp"
00010
00011 _BEGIN_BENZENE_NAMESPACE_
00012
00013
00014
00015
00016
00017
00018
00019 typedef enum { BLACK=0, WHITE=1, EMPTY=2 } HexColor;
00020
00021
00022
00023
00024 static const HexColor FIRST_TO_PLAY = BLACK;
00025
00026
00027
00028
00029
00030 static const HexColor VERTICAL_COLOR = BLACK;
00031
00032
00033
00034
00035 static const HexColor DEAD_COLOR = BLACK;
00036
00037
00038
00039
00040
00041 static const int BLACK_AND_WHITE = 2;
00042
00043
00044
00045 static const int BLACK_WHITE_EMPTY = 3;
00046
00047
00048
00049
00050 class BWIterator
00051 {
00052 public:
00053 BWIterator()
00054 : m_color(BLACK)
00055 { }
00056
00057
00058 void operator++()
00059 {
00060 ++m_color;
00061 }
00062
00063
00064 HexColor operator*() const
00065 {
00066 return static_cast<HexColor>(m_color);
00067 }
00068
00069
00070 operator bool() const
00071 {
00072 return m_color <= WHITE;
00073 }
00074
00075 private:
00076 int m_color;
00077
00078
00079 BWIterator(const BWIterator&);
00080
00081
00082 BWIterator& operator=(const BWIterator&);
00083 };
00084
00085
00086 class ColorIterator
00087 {
00088 public:
00089 ColorIterator()
00090 : m_color(BLACK)
00091 { }
00092
00093
00094 void operator++()
00095 {
00096 ++m_color;
00097 }
00098
00099
00100 HexColor operator*() const
00101 {
00102 return static_cast<HexColor>(m_color);
00103 }
00104
00105
00106 operator bool() const
00107 {
00108 return m_color <= EMPTY;
00109 }
00110
00111 private:
00112 int m_color;
00113
00114
00115 ColorIterator(const ColorIterator&);
00116
00117
00118 ColorIterator& operator=(const ColorIterator&);
00119 };
00120
00121
00122
00123
00124 namespace HexColorUtil
00125 {
00126
00127
00128 inline bool isValidColor(HexColor color)
00129 {
00130 return (color == BLACK || color == WHITE) || (color == EMPTY);
00131 }
00132
00133
00134 inline bool isBlackWhite(HexColor color)
00135 {
00136 return (color == BLACK || color == WHITE);
00137 }
00138
00139
00140 inline std::string toString(HexColor color)
00141 {
00142 HexAssert(isValidColor(color));
00143 if (color == BLACK) return "black";
00144 if (color == WHITE) return "white";
00145 return "empty";
00146 }
00147
00148
00149 inline HexColor otherColor(HexColor color)
00150 {
00151 HexAssert(isValidColor(color));
00152 if (color == EMPTY) return EMPTY;
00153 return (color == WHITE) ? BLACK : WHITE;
00154 }
00155
00156 }
00157
00158
00159
00160
00161
00162 inline std::ostream& operator<<(std::ostream& os, HexColor color)
00163 {
00164 os << HexColorUtil::toString(color);
00165 return os;
00166 }
00167
00168
00169
00170 inline HexColor operator!(HexColor color)
00171 {
00172 return HexColorUtil::otherColor(color);
00173 }
00174
00175
00176
00177
00178 typedef enum { BLACK_ONLY, WHITE_ONLY, EMPTY_ONLY,
00179 NOT_BLACK, NOT_WHITE, NOT_EMPTY,
00180 ALL_COLORS, NUM_COLOR_SETS } HexColorSet;
00181
00182
00183 namespace HexColorSetUtil
00184 {
00185
00186
00187 inline bool isValid(HexColorSet colorset)
00188 {
00189 return (colorset >= BLACK_ONLY && colorset <= ALL_COLORS);
00190 }
00191
00192
00193 inline std::string toString(HexColorSet colorset)
00194 {
00195 HexAssert(isValid(colorset));
00196 if (colorset == BLACK_ONLY) return "black_only";
00197 if (colorset == WHITE_ONLY) return "white_only";
00198 if (colorset == EMPTY_ONLY) return "empty_only";
00199 if (colorset == NOT_BLACK) return "not_black";
00200 if (colorset == NOT_WHITE) return "not_white";
00201 if (colorset == NOT_EMPTY) return "not_empty";
00202 return "all_colors";
00203 }
00204
00205
00206 inline HexColorSet fromString(std::string str)
00207 {
00208 if (str == "black_only") return BLACK_ONLY;
00209 if (str == "white_only") return WHITE_ONLY;
00210 if (str == "empty_only") return EMPTY_ONLY;
00211 if (str == "not_black") return NOT_BLACK;
00212 if (str == "not_white") return NOT_WHITE;
00213 if (str == "not_empty") return NOT_EMPTY;
00214 if (str == "all_colors") return ALL_COLORS;
00215 HexAssert(false);
00216 return ALL_COLORS;
00217 }
00218
00219
00220 inline bool InSet(HexColor color, HexColorSet colorset)
00221 {
00222 HexAssert(HexColorUtil::isValidColor(color));
00223 HexAssert(HexColorSetUtil::isValid(colorset));
00224
00225 switch(colorset) {
00226 case BLACK_ONLY: return (color == BLACK);
00227 case WHITE_ONLY: return (color == WHITE);
00228 case EMPTY_ONLY: return (color == EMPTY);
00229 case NOT_BLACK: return (color != BLACK);
00230 case NOT_WHITE: return (color != WHITE);
00231 case NOT_EMPTY: return (color != EMPTY);
00232 case ALL_COLORS: return true;
00233 default:
00234 HexAssert(false);
00235 }
00236 return true;
00237 }
00238
00239
00240 inline HexColorSet Only(HexColor color)
00241 {
00242 HexAssert(HexColorUtil::isValidColor(color));
00243 if (color == BLACK)
00244 return BLACK_ONLY;
00245 else if (color == WHITE)
00246 return WHITE_ONLY;
00247 return EMPTY_ONLY;
00248 }
00249
00250
00251 inline HexColorSet NotColor(HexColor color)
00252 {
00253 HexAssert(HexColorUtil::isValidColor(color));
00254 if (color == BLACK)
00255 return NOT_BLACK;
00256 else if (color == WHITE)
00257 return NOT_WHITE;
00258 return NOT_EMPTY;
00259 }
00260
00261
00262
00263 inline HexColorSet ColorOrEmpty(HexColor color)
00264 {
00265 HexAssert(HexColorUtil::isValidColor(color));
00266 if (color == BLACK)
00267 return NOT_WHITE;
00268 else if (color == WHITE)
00269 return NOT_BLACK;
00270 return EMPTY_ONLY;
00271 }
00272
00273 }
00274
00275
00276
00277 _END_BENZENE_NAMESPACE_
00278
00279 #endif // HEXCOLOR_HPP