Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Napoleon - utils.h

utils.h

Caricato da: Crybot
Scarica il programma completo

  1. #ifndef UTILS_H
  2. #define UTILS_H
  3. #include "defines.h"
  4. #include "constants.h"
  5. #include <string>
  6.  
  7. namespace Napoleon
  8. {
  9.     namespace Utils
  10.     {
  11.         namespace Square
  12.         {
  13.             int GetA1H8DiagonalIndex(int, int);
  14.             int GetA1H8DiagonalIndex(int);
  15.             int GetH1A8AntiDiagonalIndex(int, int);
  16.             int GetH1A8AntiDiagonalIndex(int);
  17.             int GetFileIndex(int);
  18.             int GetRankIndex(int);
  19.             int GetSquareIndex(int, int);
  20.             int Parse(std::string);
  21.             std::string ToAlgebraic(Napoleon::Square);
  22.         }
  23.  
  24.         namespace BitBoard
  25.         {
  26.             bool IsBitSet(Napoleon::BitBoard, int);
  27.             void Display(Napoleon::BitBoard);
  28.  
  29.             int PopCount(Napoleon::BitBoard bitBoard);
  30.             int BitScanForward( Napoleon::BitBoard bitBoard);
  31.             int BitScanForwardReset(Napoleon::BitBoard& bitBoard);
  32.         }
  33.  
  34.         namespace Piece
  35.         {
  36.             Byte GetPiece(char);
  37.             char GetInitial(Byte);
  38.             char GetInitial(Napoleon::Piece);
  39.             Color GetOpposite(Color);
  40.         }
  41.  
  42.         INLINE int BitBoard::BitScanForward(Napoleon::BitBoard bitBoard)
  43.                 {
  44. #ifdef __GNUG__
  45.             return __builtin_ctzll(bitBoard); // conta il numero di 0 precedenti al primo bit piu` significativo
  46.  
  47. #elif defined(_MSC_VER)
  48.             unsigned long index;
  49.             _BitScanForward64(&index, bitBoard);
  50.  
  51.             return (int)index;
  52.  
  53. #else
  54.                         return Constants::DeBrujinTable[((bitBoard & -bitBoard) * Constants::DeBrujinValue) >> 58];
  55. #endif
  56.         }
  57.  
  58.         INLINE int BitBoard::BitScanForwardReset(Napoleon::BitBoard& bitBoard)
  59.                 {
  60.                         Napoleon::BitBoard bb = bitBoard;
  61.                         bitBoard &= (bitBoard - 1);
  62. #ifdef __GNUG__
  63.                         return  __builtin_ctzll(bb); // conta il numero di 0 precedenti al primo bit piu` significativo
  64.  
  65. #elif defined(_MSC_VER)
  66.                         unsigned long index;
  67.                         _BitScanForward64(&index, bb);
  68.  
  69.                         return (int)index;
  70. #else
  71.                         return Constants::DeBrujinTable[((bb & -bb) * Constants::DeBrujinValue) >> 58];
  72. #endif
  73.                 }
  74.  
  75.         INLINE int BitBoard::PopCount(Napoleon::BitBoard bitBoard)
  76.         {
  77. #ifdef __GNUG__
  78.             return __builtin_popcountll(bitBoard);
  79. #else
  80.             bitBoard -= ((bitBoard >> 1) & 0x5555555555555555UL);
  81.             bitBoard = ((bitBoard >> 2) & 0x3333333333333333UL) + (bitBoard & 0x3333333333333333UL);
  82.             bitBoard = ((bitBoard >> 4) + bitBoard) & 0x0F0F0F0F0F0F0F0FUL;
  83.             return (int)((bitBoard * 0x0101010101010101UL) >> 56);
  84. #endif
  85.         }
  86.  
  87.         inline int Square::GetA1H8DiagonalIndex(int file, int rank)
  88.         {
  89.             return 7 + rank - file;
  90.         }
  91.  
  92.         inline int Square::GetA1H8DiagonalIndex(int squareIndex)
  93.         {
  94.             return 7 + GetRankIndex(squareIndex) - GetFileIndex(squareIndex);
  95.         }
  96.  
  97.         inline int Square::GetH1A8AntiDiagonalIndex(int file, int rank)
  98.         {
  99.             return rank + file;
  100.         }
  101.  
  102.         inline int Square::GetH1A8AntiDiagonalIndex(int squareIndex)
  103.         {
  104.             return GetRankIndex(squareIndex) + GetFileIndex(squareIndex);
  105.         }
  106.  
  107.         inline int Square::GetFileIndex(int squareIndex)
  108.         {
  109.             return squareIndex & 7;
  110.         }
  111.  
  112.         inline int Square::GetRankIndex(int squareIndex)
  113.         {
  114.             return squareIndex >> 3;
  115.         }
  116.  
  117.         inline int Square::GetSquareIndex(int file, int rank)
  118.         {
  119.             return file + 8 * rank;
  120.         }
  121.  
  122.         inline Color Piece::GetOpposite(Color color)
  123.         {
  124.             return Color(1 ^ color);
  125.         }
  126.     }
  127. }
  128. #endif // UTILS_H