#pragma once
#include <utility/constants.h>
#if (defined(_WIN32) || defined(__CYGWIN__)) && ! defined(__clang__)
#define DLLEXPORT __declspec(dllexport)
#define STDCALL __stdcall
#else
#define DLLEXPORT
#define STDCALL
#endif
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#include <stdbool.h>
#endif
#define DDS_VERSION 20900
#define MAXNOOFBOARDS 200
#define MAXNOOFTABLES 40
#define RETURN_NO_FAULT 1
#define TEXT_NO_FAULT "Success"
#define RETURN_UNKNOWN_FAULT -1
#define TEXT_UNKNOWN_FAULT "General error"
#define RETURN_ZERO_CARDS -2
#define TEXT_ZERO_CARDS "Zero cards"
#define RETURN_TARGET_TOO_HIGH -3
#define TEXT_TARGET_TOO_HIGH "Target exceeds number of tricks"
#define RETURN_DUPLICATE_CARDS -4
#define TEXT_DUPLICATE_CARDS "Cards duplicated"
#define RETURN_TARGET_WRONG_LO -5
#define TEXT_TARGET_WRONG_LO "Target is less than -1"
#define RETURN_TARGET_WRONG_HI -7
#define TEXT_TARGET_WRONG_HI "Target is higher than 13"
#define RETURN_SOLNS_WRONG_LO -8
#define TEXT_SOLNS_WRONG_LO "Solutions parameter is less than 1"
#define RETURN_SOLNS_WRONG_HI -9
#define TEXT_SOLNS_WRONG_HI "Solutions parameter is higher than 3"
#define RETURN_TOO_MANY_CARDS -10
#define TEXT_TOO_MANY_CARDS "Too many cards"
#define RETURN_SUIT_OR_RANK -12
#define TEXT_SUIT_OR_RANK \
"currentTrickSuit or currentTrickRank has wrong data"
#define RETURN_PLAYED_CARD -13
#define TEXT_PLAYED_CARD "Played card also remains in a hand"
#define RETURN_CARD_COUNT -14
#define TEXT_CARD_COUNT "Wrong number of remaining cards in a hand"
#define RETURN_THREAD_INDEX -15
#define TEXT_THREAD_INDEX "Thread index is not 0 .. maximum"
#define RETURN_MODE_WRONG_LO -16
#define TEXT_MODE_WRONG_LO "Mode parameter is less than 0"
#define RETURN_MODE_WRONG_HI -17
#define TEXT_MODE_WRONG_HI "Mode parameter is higher than 2"
#define RETURN_TRUMP_WRONG -18
#define TEXT_TRUMP_WRONG "Trump is not in 0 .. 4"
#define RETURN_FIRST_WRONG -19
#define TEXT_FIRST_WRONG "First is not in 0 .. 2"
#define RETURN_PLAY_FAULT -98
#define TEXT_PLAY_FAULT "AnalysePlay input error"
#define RETURN_PBN_FAULT -99
#define TEXT_PBN_FAULT "PBN string error"
#define RETURN_TOO_MANY_BOARDS -101
#define TEXT_TOO_MANY_BOARDS "Too many Boards requested"
#define RETURN_THREAD_CREATE -102
#define TEXT_THREAD_CREATE "Could not create threads"
#define RETURN_THREAD_WAIT -103
#define TEXT_THREAD_WAIT "Something failed waiting for thread to end"
#define RETURN_THREAD_MISSING -104
#define TEXT_THREAD_MISSING "Multi-threading system not present"
#define RETURN_NO_SUIT -201
#define TEXT_NO_SUIT "Denomination filter vector has no entries"
#define RETURN_TOO_MANY_TABLES -202
#define TEXT_TOO_MANY_TABLES "Too many DD tables requested"
#define RETURN_CHUNK_SIZE -301
#define TEXT_CHUNK_SIZE "Chunk size is less than 1"
struct FutureTricks
{
int nodes;
int cards;
int suit[13];
int rank[13];
int equals[13];
int score[13];
};
struct Deal
{
int trump;
int first;
int currentTrickSuit[3];
int currentTrickRank[3];
unsigned int remainCards[DDS_HANDS][DDS_SUITS];
};
struct DealPBN
{
int trump;
int first;
int currentTrickSuit[3];
int currentTrickRank[3];
char remainCards[80];
};
struct Boards
{
int no_of_boards;
struct Deal deals[MAXNOOFBOARDS];
int target[MAXNOOFBOARDS];
int solutions[MAXNOOFBOARDS];
int mode[MAXNOOFBOARDS];
};
struct BoardsPBN
{
int no_of_boards; struct DealPBN deals[MAXNOOFBOARDS]; int target[MAXNOOFBOARDS]; int solutions[MAXNOOFBOARDS]; int mode[MAXNOOFBOARDS]; };
struct SolvedBoards
{
int no_of_boards; struct FutureTricks solved_board[MAXNOOFBOARDS]; };
struct DdTableDeal
{
unsigned int cards[DDS_HANDS][DDS_SUITS];
};
struct DdTableDeals
{
int no_of_tables;
struct DdTableDeal deals[MAXNOOFTABLES * DDS_STRAINS];
};
struct DdTableDealPBN
{
char cards[80];
};
struct DdTableDealsPBN
{
int no_of_tables;
struct DdTableDealPBN deals[MAXNOOFTABLES * DDS_STRAINS];
};
struct DdTableResults
{
int res_table[DDS_STRAINS][DDS_HANDS];
};
struct DdTablesRes
{
int no_of_boards;
struct DdTableResults results[MAXNOOFTABLES * DDS_STRAINS];
};
struct ParResults
{
char par_score[2][16];
char par_contracts_string[2][128];
};
struct AllParResults
{
struct ParResults par_results[MAXNOOFTABLES];
};
struct ParResultsDealer
{
int number;
int score;
char contracts[10][10];
};
struct ContractType
{
int under_tricks;
int over_tricks;
int level;
int denom;
int seats;
};
struct ParResultsMaster
{
int score;
int number;
struct ContractType contracts[10];
};
struct ParTextResults
{
char par_text[2][128];
bool equal;
};
struct PlayTraceBin
{
int number;
int suit[52];
int rank[52];
};
struct PlayTracePBN
{
int number;
char cards[106];
};
struct SolvedPlay
{
int number;
int tricks[53];
};
struct PlayTracesBin
{
int no_of_boards;
struct PlayTraceBin plays[MAXNOOFBOARDS];
};
struct PlayTracesPBN
{
int no_of_boards;
struct PlayTracePBN plays[MAXNOOFBOARDS];
};
struct SolvedPlays
{
int no_of_boards;
struct SolvedPlay solved[MAXNOOFBOARDS];
};
struct DDSInfo
{
int major, minor, patch;
char version_string[10];
int system;
int numBits;
int compiler;
int constructor;
int numCores;
int threading;
int noOfThreads;
char threadSizes[128];
char systemString[1024];
};
EXTERN_C DLLEXPORT auto STDCALL SetMaxThreads(
int userThreads) -> void;
EXTERN_C DLLEXPORT auto STDCALL SetThreading(
int code) -> int;
EXTERN_C DLLEXPORT auto STDCALL SetResources(
int maxMemoryMB,
int maxThreads) -> void;
EXTERN_C DLLEXPORT auto STDCALL FreeMemory() -> void;
EXTERN_C DLLEXPORT auto STDCALL SolveBoard(
struct Deal dl,
int target,
int solutions,
int mode,
struct FutureTricks * futp,
int threadIndex) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveBoardPBN(
struct DealPBN dlpbn,
int target,
int solutions,
int mode,
struct FutureTricks * futp,
int thrId) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcDDtable(
struct DdTableDeal tableDeal,
struct DdTableResults * tablep) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcDDtablePBN(
struct DdTableDealPBN tableDealPBN,
struct DdTableResults * tablep) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcAllTables(
struct DdTableDeals const * dealsp,
int mode,
int const trumpFilter[DDS_STRAINS],
struct DdTablesRes * resp,
struct AllParResults * presp) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcAllTablesPBN(
struct DdTableDealsPBN const * dealsp,
int mode,
int const trumpFilter[DDS_STRAINS],
struct DdTablesRes * resp,
struct AllParResults * presp) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveAllBoards(
struct BoardsPBN const * bop,
struct SolvedBoards * solvedp) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveAllBoardsBin(
struct Boards const * bop,
struct SolvedBoards * solvedp) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveAllChunks(
struct BoardsPBN const * bop,
struct SolvedBoards * solvedp,
int chunkSize) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveAllChunksBin(
struct Boards const * bop,
struct SolvedBoards * solvedp,
int chunkSize) -> int;
EXTERN_C DLLEXPORT auto STDCALL SolveAllChunksPBN(
struct BoardsPBN const * bop,
struct SolvedBoards * solvedp,
int chunkSize) -> int;
EXTERN_C DLLEXPORT auto STDCALL Par(
struct DdTableResults const * tablep,
struct ParResults * presp,
int vulnerable) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcPar(
struct DdTableDeal tableDeal,
int vulnerable,
struct DdTableResults * tablep,
struct ParResults * presp) -> int;
EXTERN_C DLLEXPORT auto STDCALL CalcParPBN(
struct DdTableDealPBN tableDealPBN,
struct DdTableResults * tablep,
int vulnerable,
struct ParResults * presp) -> int;
EXTERN_C DLLEXPORT auto STDCALL SidesPar(
struct DdTableResults const * tablep,
struct ParResultsDealer sidesRes[2],
int vulnerable) -> int;
EXTERN_C DLLEXPORT auto STDCALL DealerPar(
struct DdTableResults const * tablep,
struct ParResultsDealer * presp,
int dealer,
int vulnerable) -> int;
EXTERN_C DLLEXPORT auto STDCALL DealerParBin(
struct DdTableResults const * tablep,
struct ParResultsMaster * presp,
int dealer,
int vulnerable) -> int;
EXTERN_C DLLEXPORT auto STDCALL SidesParBin(
struct DdTableResults const * tablep,
struct ParResultsMaster sidesRes[2],
int vulnerable) -> int;
EXTERN_C DLLEXPORT auto STDCALL ConvertToDealerTextFormat(
struct ParResultsMaster const * pres,
char * resp) -> int;
EXTERN_C DLLEXPORT auto STDCALL ConvertToSidesTextFormat(
struct ParResultsMaster const * pres,
struct ParTextResults * resp) -> int;
EXTERN_C DLLEXPORT auto STDCALL AnalysePlayBin(
struct Deal dl,
struct PlayTraceBin play,
struct SolvedPlay * solved,
int thrId) -> int;
EXTERN_C DLLEXPORT auto STDCALL AnalysePlayPBN(
struct DealPBN dlPBN,
struct PlayTracePBN playPBN,
struct SolvedPlay * solvedp,
int thrId) -> int;
EXTERN_C DLLEXPORT auto STDCALL AnalyseAllPlaysBin(
struct Boards const * bop,
struct PlayTracesBin const * plp,
struct SolvedPlays * solvedp,
int chunkSize) -> int;
EXTERN_C DLLEXPORT auto STDCALL AnalyseAllPlaysPBN(
struct BoardsPBN const * bopPBN,
struct PlayTracesPBN const * plpPBN,
struct SolvedPlays * solvedp,
int chunkSize) -> int;
EXTERN_C DLLEXPORT auto STDCALL GetDDSInfo(
struct DDSInfo * info) -> void;
EXTERN_C DLLEXPORT auto STDCALL ErrorMessage(
int code,
char line[80]) -> void;