Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FLAGS_H
00025 #define FLAGS_H
00026
00027 #ifndef USE_PCH
00028 #include <stdint.h>
00029 #endif
00030
00031 namespace cwchess {
00032
00033
00034
00035
00036
00037 struct FlagsData {
00038 uint8_t M_bits;
00039 };
00040
00041 FlagsData const fl_none = { 0 };
00042
00043 uint8_t const fl_pawn_mask = { 120 };
00044
00045
00046 FlagsData const fl_pawn_can_take_queen_side = { 8 };
00047 FlagsData const fl_pawn_is_not_blocked = { 16 };
00048 FlagsData const fl_pawn_can_take_king_side = { 32 };
00049 FlagsData const fl_pawn_can_move_two_squares = { 64 };
00050
00051
00052 inline bool operator==(FlagsData f1, FlagsData f2) { return f1.M_bits == f2.M_bits; }
00053 inline bool operator!=(FlagsData f1, FlagsData f2) { return f1.M_bits != f2.M_bits; }
00054
00055
00056 inline FlagsData operator|(FlagsData x, FlagsData y)
00057 {
00058 FlagsData result;
00059 result.M_bits = x.M_bits | y.M_bits;
00060 return result;
00061 }
00062
00063
00064 inline FlagsData operator&(FlagsData x, FlagsData y)
00065 {
00066 FlagsData result;
00067 result.M_bits = x.M_bits & y.M_bits;
00068 return result;
00069 }
00070
00071
00072 inline FlagsData operator^(FlagsData x, FlagsData y)
00073 {
00074 FlagsData result;
00075 result.M_bits = x.M_bits ^ y.M_bits;
00076 return result;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085 class Flags : protected FlagsData {
00086 public:
00087
00088
00089
00090
00091 Flags(void) { }
00092
00093
00094 Flags(Flags const& flags) { M_bits = flags.M_bits; }
00095
00096
00097 Flags(FlagsData flags) { M_bits = flags.M_bits; }
00098
00099
00100
00101
00102
00103
00104
00105 Flags& operator=(Flags const& flags) { M_bits = flags.M_bits; return* this; }
00106
00107
00108 Flags& operator=(FlagsData flags) { M_bits = flags.M_bits; return* this; }
00109
00110
00111 void clear(void) { M_bits = 0; }
00112
00113
00114
00115
00116
00117
00118 friend bool operator==(Flags const& f1, Flags const& f2) { return f1.M_bits == f2.M_bits; }
00119 friend bool operator==(Flags const& f1, FlagsData f2) { return f1.M_bits == f2.M_bits; }
00120 friend bool operator==(FlagsData f1, Flags const& f2) { return f1.M_bits == f2.M_bits; }
00121 friend bool operator!=(Flags const& f1, Flags const& f2) { return f1.M_bits != f2.M_bits; }
00122 friend bool operator!=(Flags const& f1, FlagsData f2) { return f1.M_bits != f2.M_bits; }
00123 friend bool operator!=(FlagsData f1, Flags const& f2) { return f1.M_bits != f2.M_bits; }
00124
00125
00126
00127
00128
00129
00130
00131 Flags& operator|=(Flags const& flags) { M_bits |= flags.M_bits; return* this; }
00132
00133
00134 Flags& operator|=(FlagsData flags) { M_bits |= flags.M_bits; return* this; }
00135
00136
00137 Flags& operator&=(Flags const& flags) { M_bits& = flags.M_bits; return* this; }
00138
00139
00140 Flags& operator&=(FlagsData flags) { M_bits& = flags.M_bits; return* this; }
00141
00142
00143 Flags& operator^=(Flags const& flags) { M_bits ^= flags.M_bits; return* this; }
00144
00145
00146 Flags& operator^=(FlagsData flags) { M_bits ^= flags.M_bits; return* this; }
00147
00148
00149 void set(FlagsData flags) { M_bits |= flags.M_bits; }
00150
00151
00152 void reset(FlagsData flags) { M_bits& = ~flags.M_bits; }
00153
00154
00155
00156
00157
00158
00159
00160 void set_can_move_two_squares_if_not_blocked(void) { M_bits |= (M_bits & 16) << 2; }
00161
00162
00163
00164
00165
00166
00167
00168 uint8_t operator()(void) const { return M_bits; }
00169
00170
00171
00172 };
00173
00174 }
00175
00176 #endif // FLAGS_H