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 BITBOARD_H
00025 #define BITBOARD_H
00026
00027 #ifndef USE_PCH
00028 #include <stdint.h>
00029 #endif
00030
00031 #include "Index.h"
00032
00033 #define DEBUG_BITBOARD_INITIALIZATION 0
00034
00035 #if DEBUG_BITBOARD_INITIALIZATION
00036 #include <cassert>
00037 #endif
00038
00039
00040
00041
00042 namespace cwchess {
00043
00044
00045
00046
00047
00048 typedef uint64_t mask_t;
00049
00050
00051 inline mask_t index2mask(Index index)
00052 {
00053 return CW_MASK_T_CONST(1) << index();
00054 }
00055
00056
00057 inline mask_t colrow2mask(int col, int row)
00058 {
00059 return CW_MASK_T_CONST(1) << (col + (row << 3));
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069 inline Index mask2index(mask_t mask)
00070 {
00071 Index result(index_pre_begin);
00072 result.next_bit_in(mask);
00073 return result;
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 struct BitBoardData {
00088
00089
00090
00091
00092
00093 mask_t M_bitmask;
00094 };
00095
00096 BitBoardData const a1 = { CW_MASK_T_CONST(0x1) };
00097 BitBoardData const b1 = { CW_MASK_T_CONST(0x2) };
00098 BitBoardData const c1 = { CW_MASK_T_CONST(0x4) };
00099 BitBoardData const d1 = { CW_MASK_T_CONST(0x8) };
00100 BitBoardData const e1 = { CW_MASK_T_CONST(0x10) };
00101 BitBoardData const f1 = { CW_MASK_T_CONST(0x20) };
00102 BitBoardData const g1 = { CW_MASK_T_CONST(0x40) };
00103 BitBoardData const h1 = { CW_MASK_T_CONST(0x80) };
00104 BitBoardData const a2 = { CW_MASK_T_CONST(0x100) };
00105 BitBoardData const b2 = { CW_MASK_T_CONST(0x200) };
00106 BitBoardData const c2 = { CW_MASK_T_CONST(0x400) };
00107 BitBoardData const d2 = { CW_MASK_T_CONST(0x800) };
00108 BitBoardData const e2 = { CW_MASK_T_CONST(0x1000) };
00109 BitBoardData const f2 = { CW_MASK_T_CONST(0x2000) };
00110 BitBoardData const g2 = { CW_MASK_T_CONST(0x4000) };
00111 BitBoardData const h2 = { CW_MASK_T_CONST(0x8000) };
00112 BitBoardData const a3 = { CW_MASK_T_CONST(0x10000) };
00113 BitBoardData const b3 = { CW_MASK_T_CONST(0x20000) };
00114 BitBoardData const c3 = { CW_MASK_T_CONST(0x40000) };
00115 BitBoardData const d3 = { CW_MASK_T_CONST(0x80000) };
00116 BitBoardData const e3 = { CW_MASK_T_CONST(0x100000) };
00117 BitBoardData const f3 = { CW_MASK_T_CONST(0x200000) };
00118 BitBoardData const g3 = { CW_MASK_T_CONST(0x400000) };
00119 BitBoardData const h3 = { CW_MASK_T_CONST(0x800000) };
00120 BitBoardData const a4 = { CW_MASK_T_CONST(0x1000000) };
00121 BitBoardData const b4 = { CW_MASK_T_CONST(0x2000000) };
00122 BitBoardData const c4 = { CW_MASK_T_CONST(0x4000000) };
00123 BitBoardData const d4 = { CW_MASK_T_CONST(0x8000000) };
00124 BitBoardData const e4 = { CW_MASK_T_CONST(0x10000000) };
00125 BitBoardData const f4 = { CW_MASK_T_CONST(0x20000000) };
00126 BitBoardData const g4 = { CW_MASK_T_CONST(0x40000000) };
00127 BitBoardData const h4 = { CW_MASK_T_CONST(0x80000000) };
00128 BitBoardData const a5 = { CW_MASK_T_CONST(0x100000000) };
00129 BitBoardData const b5 = { CW_MASK_T_CONST(0x200000000) };
00130 BitBoardData const c5 = { CW_MASK_T_CONST(0x400000000) };
00131 BitBoardData const d5 = { CW_MASK_T_CONST(0x800000000) };
00132 BitBoardData const e5 = { CW_MASK_T_CONST(0x1000000000) };
00133 BitBoardData const f5 = { CW_MASK_T_CONST(0x2000000000) };
00134 BitBoardData const g5 = { CW_MASK_T_CONST(0x4000000000) };
00135 BitBoardData const h5 = { CW_MASK_T_CONST(0x8000000000) };
00136 BitBoardData const a6 = { CW_MASK_T_CONST(0x10000000000) };
00137 BitBoardData const b6 = { CW_MASK_T_CONST(0x20000000000) };
00138 BitBoardData const c6 = { CW_MASK_T_CONST(0x40000000000) };
00139 BitBoardData const d6 = { CW_MASK_T_CONST(0x80000000000) };
00140 BitBoardData const e6 = { CW_MASK_T_CONST(0x100000000000) };
00141 BitBoardData const f6 = { CW_MASK_T_CONST(0x200000000000) };
00142 BitBoardData const g6 = { CW_MASK_T_CONST(0x400000000000) };
00143 BitBoardData const h6 = { CW_MASK_T_CONST(0x800000000000) };
00144 BitBoardData const a7 = { CW_MASK_T_CONST(0x1000000000000) };
00145 BitBoardData const b7 = { CW_MASK_T_CONST(0x2000000000000) };
00146 BitBoardData const c7 = { CW_MASK_T_CONST(0x4000000000000) };
00147 BitBoardData const d7 = { CW_MASK_T_CONST(0x8000000000000) };
00148 BitBoardData const e7 = { CW_MASK_T_CONST(0x10000000000000) };
00149 BitBoardData const f7 = { CW_MASK_T_CONST(0x20000000000000) };
00150 BitBoardData const g7 = { CW_MASK_T_CONST(0x40000000000000) };
00151 BitBoardData const h7 = { CW_MASK_T_CONST(0x80000000000000) };
00152 BitBoardData const a8 = { CW_MASK_T_CONST(0x100000000000000) };
00153 BitBoardData const b8 = { CW_MASK_T_CONST(0x200000000000000) };
00154 BitBoardData const c8 = { CW_MASK_T_CONST(0x400000000000000) };
00155 BitBoardData const d8 = { CW_MASK_T_CONST(0x800000000000000) };
00156 BitBoardData const e8 = { CW_MASK_T_CONST(0x1000000000000000) };
00157 BitBoardData const f8 = { CW_MASK_T_CONST(0x2000000000000000) };
00158 BitBoardData const g8 = { CW_MASK_T_CONST(0x4000000000000000) };
00159 BitBoardData const h8 = { CW_MASK_T_CONST(0x8000000000000000) };
00160
00161
00162 inline bool operator==(BitBoardData b1, BitBoardData b2) { return b1.M_bitmask == b2.M_bitmask; }
00163 inline bool operator!=(BitBoardData b1, BitBoardData b2) { return b1.M_bitmask != b2.M_bitmask; }
00164
00165
00166 inline BitBoardData operator|(BitBoardData x, BitBoardData y)
00167 {
00168 BitBoardData result;
00169 result.M_bitmask = x.M_bitmask | y.M_bitmask;
00170 return result;
00171 }
00172
00173
00174 inline BitBoardData operator&(BitBoardData x, BitBoardData y)
00175 {
00176 BitBoardData result;
00177 result.M_bitmask = x.M_bitmask & y.M_bitmask;
00178 return result;
00179 }
00180
00181
00182 inline BitBoardData operator^(BitBoardData x, BitBoardData y)
00183 {
00184 BitBoardData result;
00185 result.M_bitmask = x.M_bitmask ^ y.M_bitmask;
00186 return result;
00187 }
00188
00189
00190 inline BitBoardData operator~(BitBoardData x)
00191 {
00192 BitBoardData result;
00193 result.M_bitmask = ~x.M_bitmask;
00194 return result;
00195 }
00196
00197 BitBoardData const file_a = a1|a2|a3|a4|a5|a6|a7|a8;
00198 BitBoardData const file_b = b1|b2|b3|b4|b5|b6|b7|b8;
00199 BitBoardData const file_c = c1|c2|c3|c4|c5|c6|c7|c8;
00200 BitBoardData const file_d = d1|d2|d3|d4|d5|d6|d7|d8;
00201 BitBoardData const file_e = e1|e2|e3|e4|e5|e6|e7|e8;
00202 BitBoardData const file_f = f1|f2|f3|f4|f5|f6|f7|f8;
00203 BitBoardData const file_g = g1|g2|g3|g4|g5|g6|g7|g8;
00204 BitBoardData const file_h = h1|h2|h3|h4|h5|h6|h7|h8;
00205
00206 BitBoardData const rank_1 = a1|b1|c1|d1|e1|f1|g1|h1;
00207 BitBoardData const rank_2 = a2|b2|c2|d2|e2|f2|g2|h2;
00208 BitBoardData const rank_3 = a3|b3|c3|d3|e3|f3|g3|h3;
00209 BitBoardData const rank_4 = a4|b4|c4|d4|e4|f4|g4|h4;
00210 BitBoardData const rank_5 = a5|b5|c5|d5|e5|f5|g5|h5;
00211 BitBoardData const rank_6 = a6|b6|c6|d6|e6|f6|g6|h6;
00212 BitBoardData const rank_7 = a7|b7|c7|d7|e7|f7|g7|h7;
00213 BitBoardData const rank_8 = a8|b8|c8|d8|e8|f8|g8|h8;
00214
00215 BitBoardData const bdl_1 = h8;
00216 BitBoardData const bdl_2 = f8|g7|h6;
00217 BitBoardData const bdl_3 = d8|e7|f6|g5|h4;
00218 BitBoardData const bdl_4 = b8|c7|d6|e5|f4|g3|h2;
00219 BitBoardData const bdl_5 = a7|b6|c5|d4|e3|f2|g1;
00220 BitBoardData const bdl_6 = a5|b4|c3|d2|e1;
00221 BitBoardData const bdl_7 = a3|b2|c1;
00222 BitBoardData const bdl_8 = a1;
00223
00224 BitBoardData const bdr_1 = a7|b8;
00225 BitBoardData const bdr_2 = a5|b6|c7|d8;
00226 BitBoardData const bdr_3 = a3|b4|c5|d6|e7|f8;
00227 BitBoardData const bdr_4 = a1|b2|c3|d4|e5|f6|g7|h8;
00228 BitBoardData const bdr_5 = c1|d2|e3|f4|g5|h6;
00229 BitBoardData const bdr_6 = e1|f2|g3|h4;
00230 BitBoardData const bdr_7 = g1|h2;
00231
00232 BitBoardData const wdr_1 = a8;
00233 BitBoardData const wdr_2 = a6|b7|c8;
00234 BitBoardData const wdr_3 = a4|b5|c6|d7|e8;
00235 BitBoardData const wdr_4 = a2|b3|c4|d5|e6|f7|g8;
00236 BitBoardData const wdr_5 = b1|c2|d3|e4|f5|g6|h7;
00237 BitBoardData const wdr_6 = d1|e2|f3|g4|h5;
00238 BitBoardData const wdr_7 = f1|g2|h3;
00239 BitBoardData const wdr_8 = h1;
00240
00241 BitBoardData const wdl_1 = g8|h7;
00242 BitBoardData const wdl_2 = e8|f7|g6|h5;
00243 BitBoardData const wdl_3 = c8|d7|e6|f5|g4|h3;
00244 BitBoardData const wdl_4 = a8|b7|c6|d5|e4|f3|g2|h1;
00245 BitBoardData const wdl_5 = a6|b5|c4|d3|e2|f1;
00246 BitBoardData const wdl_6 = a4|b3|c2|d1;
00247 BitBoardData const wdl_7 = a2|b1;
00248
00249 #if DEBUG_BITBOARD_INITIALIZATION
00250 uint64_t const bitboard_initialization_magic = 1212121212121212121;
00251 uint64_t const bitboard_destructed_magic = 555555555555555555;
00252 #endif
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 class BitBoard : private BitBoardData {
00267 #if DEBUG_BITBOARD_INITIALIZATION
00268 private:
00269 uint64_t M_initialized;
00270 #endif
00271
00272 public:
00273 #if DEBUG_BITBOARD_INITIALIZATION
00274 BitBoard(void) : M_initialized(0) { }
00275 ~BitBoard(void) { M_initialized = bitboard_destructed_magic; }
00276
00277 bool is_initialized(void) const { return M_initialized == bitboard_initialization_magic; }
00278 #else
00279
00280
00281
00282
00283 BitBoard(void) { }
00284
00285 #endif
00286
00287
00288 BitBoard(BitBoard const& other)
00289 {
00290 #if DEBUG_BITBOARD_INITIALIZATION
00291 assert(other.is_initialized());
00292 M_initialized = bitboard_initialization_magic;
00293 #endif
00294 M_bitmask = other.M_bitmask;
00295 }
00296
00297
00298 BitBoard(Index const& index)
00299 {
00300 #if DEBUG_BITBOARD_INITIALIZATION
00301 M_initialized = bitboard_initialization_magic;
00302 #endif
00303 M_bitmask = index2mask(index);
00304 }
00305
00306
00307 BitBoard(BitBoardData data)
00308 {
00309 #if DEBUG_BITBOARD_INITIALIZATION
00310 M_initialized = bitboard_initialization_magic;
00311 #endif
00312 M_bitmask = data.M_bitmask;
00313 }
00314
00315
00316 BitBoard(int col, int row)
00317 {
00318 #if DEBUG_BITBOARD_INITIALIZATION
00319 M_initialized = bitboard_initialization_magic;
00320 #endif
00321 M_bitmask = colrow2mask(col, row);
00322 }
00323
00324
00325 explicit BitBoard(mask_t bitmask)
00326 {
00327 #if DEBUG_BITBOARD_INITIALIZATION
00328 M_initialized = bitboard_initialization_magic;
00329 #endif
00330 M_bitmask = bitmask;
00331 }
00332
00333
00334
00335
00336
00337
00338
00339 BitBoard& operator=(BitBoard const& bitboard)
00340 {
00341 #if DEBUG_BITBOARD_INITIALIZATION
00342 assert(bitboard.is_initialized());
00343 M_initialized = bitboard_initialization_magic;
00344 #endif
00345 M_bitmask = bitboard.M_bitmask;
00346 return* this;
00347 }
00348
00349
00350 BitBoard& operator=(BitBoardData bitboard)
00351 {
00352 #if DEBUG_BITBOARD_INITIALIZATION
00353 M_initialized = bitboard_initialization_magic;
00354 #endif
00355 M_bitmask = bitboard.M_bitmask;
00356 return* this;
00357 }
00358
00359
00360
00361
00362
00363
00364 friend bool operator==(BitBoard const& b1, BitBoard const& b2) { return b1.M_bitmask == b2.M_bitmask; }
00365 friend bool operator==(BitBoard const& b1, BitBoardData b2) { return b1.M_bitmask == b2.M_bitmask; }
00366 friend bool operator==(BitBoardData b1, BitBoard const& b2) { return b1.M_bitmask == b2.M_bitmask; }
00367 friend bool operator!=(BitBoard const& b1, BitBoard const& b2) { return b1.M_bitmask != b2.M_bitmask; }
00368 friend bool operator!=(BitBoard const& b1, BitBoardData b2) { return b1.M_bitmask != b2.M_bitmask; }
00369 friend bool operator!=(BitBoardData b1, BitBoard const& b2) { return b1.M_bitmask != b2.M_bitmask; }
00370
00371
00372
00373
00374
00375
00376
00377 void reset(void)
00378 {
00379 #if DEBUG_BITBOARD_INITIALIZATION
00380 M_initialized = bitboard_initialization_magic;
00381 #endif
00382 M_bitmask = 0;
00383 }
00384
00385
00386 void set(void)
00387 {
00388 #if DEBUG_BITBOARD_INITIALIZATION
00389 M_initialized = bitboard_initialization_magic;
00390 #endif
00391 M_bitmask = CW_MASK_T_CONST(0xffffffffffffffff);
00392 }
00393
00394
00395
00396
00397
00398
00399
00400 void reset(int col, int row) { M_bitmask& = ~colrow2mask(col, row); }
00401
00402
00403 void reset(Index const& index) { M_bitmask& = ~index2mask(index); }
00404
00405
00406 void reset(mask_t mask) { M_bitmask& = ~mask; }
00407
00408
00409 void reset(BitBoardData bitboard) { M_bitmask& = ~bitboard.M_bitmask; }
00410
00411
00412 void reset(BitBoard bitboard) { M_bitmask& = ~bitboard.M_bitmask; }
00413
00414
00415 void set(int col, int row) { M_bitmask |= colrow2mask(col, row); }
00416
00417
00418 void set(Index const& index) { M_bitmask |= index2mask(index); }
00419
00420
00421 void set(mask_t mask) { M_bitmask |= mask; }
00422
00423
00424 void set(BitBoardData bitboard) { M_bitmask |= bitboard.M_bitmask; }
00425
00426
00427 void set(BitBoard const& bitboard) { M_bitmask |= bitboard.M_bitmask; }
00428
00429
00430 void toggle(int col, int row) { M_bitmask ^= colrow2mask(col, row); }
00431
00432
00433 void toggle(Index const& index) { M_bitmask ^= index2mask(index); }
00434
00435
00436 void toggle(mask_t mask) { M_bitmask ^= mask; }
00437
00438
00439 void toggle(BitBoardData bitboard) { M_bitmask ^= bitboard.M_bitmask; }
00440
00441
00442 void toggle(BitBoard const& bitboard) { M_bitmask ^= bitboard.M_bitmask; }
00443
00444
00445
00446
00447
00448
00449
00450 bool test(void) const { return M_bitmask; }
00451
00452
00453 bool test(int col, int row) const { return M_bitmask & colrow2mask(col, row); }
00454
00455
00456 bool test(Index const& index) const { return M_bitmask & index2mask(index); }
00457
00458
00459 bool test(mask_t mask) const { return M_bitmask & mask; }
00460
00461
00462 bool test(BitBoardData bitboard) const { return M_bitmask & bitboard.M_bitmask; }
00463
00464
00465 bool test(BitBoard const& bitboard) const { return M_bitmask & bitboard.M_bitmask; }
00466
00467
00468 BitBoard operator~(void) const { return BitBoard(~M_bitmask); }
00469
00470
00471 #ifdef __x86_64
00472 operator void*(void) const { return reinterpret_cast<void*>(M_bitmask); }
00473 #else
00474
00475 operator void*(void) const { return M_bitmask ? (void*)1 : 0; }
00476 #endif
00477
00478
00479 mask_t operator()(void) const { return M_bitmask; }
00480
00481
00482
00483
00484
00485 BitBoard& operator|=(BitBoard const& bitboard) { M_bitmask |= bitboard.M_bitmask; return* this; }
00486 BitBoard& operator|=(BitBoardData bitboard) { M_bitmask |= bitboard.M_bitmask; return* this; }
00487 BitBoard& operator|=(mask_t bitmask) { M_bitmask |= bitmask; return* this; }
00488 friend BitBoard operator|(BitBoard const& bitboard1, BitBoard const& bitboard2) { return BitBoard(bitboard1.M_bitmask | bitboard2.M_bitmask); }
00489 friend BitBoard operator|(BitBoard const& bitboard1, BitBoardData bitboard2) { return BitBoard(bitboard1.M_bitmask | bitboard2.M_bitmask); }
00490 friend BitBoard operator|(BitBoardData bitboard1, BitBoard const& bitboard2) { return BitBoard(bitboard1.M_bitmask | bitboard2.M_bitmask); }
00491
00492
00493
00494
00495 BitBoard& operator&=(BitBoard const& bitboard) { M_bitmask& = bitboard.M_bitmask; return* this; }
00496 BitBoard& operator&=(BitBoardData bitboard) { M_bitmask& = bitboard.M_bitmask; return* this; }
00497 BitBoard& operator&=(mask_t bitmask) { M_bitmask& = bitmask; return* this; }
00498 friend BitBoard operator&(BitBoard bitboard1, BitBoard bitboard2) { return BitBoard(bitboard1.M_bitmask & bitboard2.M_bitmask); }
00499 friend BitBoard operator&(BitBoard bitboard1, BitBoardData bitboard2) { return BitBoard(bitboard1.M_bitmask & bitboard2.M_bitmask); }
00500 friend BitBoard operator&(BitBoardData bitboard1, BitBoard bitboard2) { return BitBoard(bitboard1.M_bitmask & bitboard2.M_bitmask); }
00501
00502
00503
00504
00505 BitBoard& operator^=(BitBoard const& bitboard) { M_bitmask ^= bitboard.M_bitmask; return* this; }
00506 BitBoard& operator^=(BitBoardData bitboard) { M_bitmask ^= bitboard.M_bitmask; return* this; }
00507 BitBoard& operator^=(mask_t bitmask) { M_bitmask ^= bitmask; return* this; }
00508 friend BitBoard operator^(BitBoard bitboard1, BitBoard bitboard2) { return BitBoard(bitboard1.M_bitmask ^ bitboard2.M_bitmask); }
00509 friend BitBoard operator^(BitBoard bitboard1, BitBoardData bitboard2) { return BitBoard(bitboard1.M_bitmask ^ bitboard2.M_bitmask); }
00510 friend BitBoard operator^(BitBoardData bitboard1, BitBoard bitboard2) { return BitBoard(bitboard1.M_bitmask ^ bitboard2.M_bitmask); }
00511
00512
00513 };
00514
00515 }
00516
00517 #endif // BITBOARD_H