- /* 
-   Copyright (c) 2011-2013 Ronald de Man 
- */ 
-   
- #ifndef TBCORE_H 
- #define TBCORE_H 
-   
- #ifndef _WIN32 
- #include <pthread.h> 
- #define SEP_CHAR ':' 
- #define FD int 
- #define FD_ERR -1 
- #else 
- #include <windows.h> 
- #define SEP_CHAR ';' 
- #define FD HANDLE 
- #define FD_ERR INVALID_HANDLE_VALUE 
- #endif 
-   
- #ifndef _WIN32 
- #define LOCK_T pthread_mutex_t 
- #define LOCK_INIT(x) pthread_mutex_init(&(x), NULL) 
- #define LOCK(x) pthread_mutex_lock(&(x)) 
- #define UNLOCK(x) pthread_mutex_unlock(&(x)) 
- #else 
- #define LOCK_T HANDLE 
- #define LOCK_INIT(x) do { x = CreateMutex(NULL, FALSE, NULL); } while (0) 
- #define LOCK(x) WaitForSingleObject(x, INFINITE) 
- #define UNLOCK(x) ReleaseMutex(x) 
- #endif 
-   
- #ifndef _MSC_VER 
- #define BSWAP32(v) __builtin_bswap32(v) 
- #define BSWAP64(v) __builtin_bswap64(v) 
- #else 
- #define BSWAP32(v) _byteswap_ulong(v) 
- #define BSWAP64(v) _byteswap_uint64(v) 
- #endif 
-   
- #define WDLSUFFIX ".rtbw" 
- #define DTZSUFFIX ".rtbz" 
- #define WDLDIR "RTBWDIR" 
- #define DTZDIR "RTBZDIR" 
- #define TBPIECES 6 
-   
- typedef unsigned long long uint64; 
- typedef unsigned int uint32; 
- typedef unsigned char ubyte; 
- typedef unsigned short ushort; 
-   
- const ubyte WDL_MAGIC[4] = { 0x71, 0xe8, 0x23, 0x5d }; 
- const ubyte DTZ_MAGIC[4] = { 0xd7, 0x66, 0x0c, 0xa5 }; 
-   
- #define TBHASHBITS 10 
-   
- struct TBHashEntry; 
-   
- typedef uint64 base_t; 
-   
- struct PairsData { 
-   char *indextable; 
-   ushort *sizetable; 
-   ubyte *data; 
-   ushort *offset; 
-   ubyte *symlen; 
-   ubyte *sympat; 
-   int blocksize; 
-   int idxbits; 
-   int min_len; 
-   base_t base[1]; // C++ complains about base[]... 
- }; 
-   
- struct TBEntry { 
-   char *data; 
-   uint64 key; 
-   uint64 mapping; 
-   ubyte ready; 
-   ubyte num; 
-   ubyte symmetric; 
-   ubyte has_pawns; 
- } 
- #ifndef _WIN32 
- __attribute__((__may_alias__)) 
- #endif 
- ; 
-   
- struct TBEntry_piece { 
-   char *data; 
-   uint64 key; 
-   uint64 mapping; 
-   ubyte ready; 
-   ubyte num; 
-   ubyte symmetric; 
-   ubyte has_pawns; 
-   ubyte enc_type; 
-   struct PairsData *precomp[2]; 
-   int factor[2][TBPIECES]; 
-   ubyte pieces[2][TBPIECES]; 
-   ubyte norm[2][TBPIECES]; 
- }; 
-   
- struct TBEntry_pawn { 
-   char *data; 
-   uint64 key; 
-   uint64 mapping; 
-   ubyte ready; 
-   ubyte num; 
-   ubyte symmetric; 
-   ubyte has_pawns; 
-   ubyte pawns[2]; 
-   struct { 
-     struct PairsData *precomp[2]; 
-     int factor[2][TBPIECES]; 
-     ubyte pieces[2][TBPIECES]; 
-     ubyte norm[2][TBPIECES]; 
-   } file[4]; 
- }; 
-   
- struct DTZEntry_piece { 
-   char *data; 
-   uint64 key; 
-   uint64 mapping; 
-   ubyte ready; 
-   ubyte num; 
-   ubyte symmetric; 
-   ubyte has_pawns; 
-   ubyte enc_type; 
-   struct PairsData *precomp; 
-   int factor[TBPIECES]; 
-   ubyte pieces[TBPIECES]; 
-   ubyte norm[TBPIECES]; 
-   ubyte flags; // accurate, mapped, side 
-   ushort map_idx[4]; 
-   ubyte *map; 
- }; 
-   
- struct DTZEntry_pawn { 
-   char *data; 
-   uint64 key; 
-   uint64 mapping; 
-   ubyte ready; 
-   ubyte num; 
-   ubyte symmetric; 
-   ubyte has_pawns; 
-   ubyte pawns[2]; 
-   struct { 
-     struct PairsData *precomp; 
-     int factor[TBPIECES]; 
-     ubyte pieces[TBPIECES]; 
-     ubyte norm[TBPIECES]; 
-   } file[4]; 
-   ubyte flags[4]; 
-   ushort map_idx[4][4]; 
-   ubyte *map; 
- }; 
-   
- struct TBHashEntry { 
-   uint64 key; 
-   struct TBEntry *ptr; 
- }; 
-   
- struct DTZTableEntry { 
-   uint64 key1; 
-   uint64 key2; 
-   struct TBEntry *entry; 
- }; 
-   
- #endif 
-   
-