1 /*
2  * Copyright (C) 1999-2006
3  *           Michael Maurer <mjmaurer@yahoo.com>
4  *           Brian Goetz <brian@quiotix.com>
5  *           Loic Dachary <loic@dachary.org>
6  *
7  * This program gives you software freedom; you can copy, convey,
8  * propagate, redistribute and/or modify this program under the terms of
9  * the GNU General Public License (GPL) as published by the Free Software
10  * Foundation (FSF), either version 3 of the License, or (at your option)
11  * any later version of the GPL published by the FSF.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program in a file in the toplevel directory called "GPLv3".
20  * If not, see <http://www.gnu.org/licenses/>.
21  */
22 /*
23    Note that this file has two #if .. #endif sections -- one for
24    StdDeck macros to prevent double-inclusion, and one to define the
25    generic Deck_ macros if DECK_ASTUD is defined
26 */
27 
28 #ifndef __DECK_ASTUD_H__
29 #define __DECK_ASTUD_H__
30 
31 #include "pokereval_export.h"
32 
33 /* MUST be lower than STRING_CARDS from lib/deck.c */
34 #define AStudDeck_N_CARDS      32
35 #define AStudDeck_MASK(index)  (AStudDeck_cardMasksTable[index])
36 
37 #define AStudDeck_Rank_7      StdDeck_Rank_7
38 #define AStudDeck_Rank_8      StdDeck_Rank_8
39 #define AStudDeck_Rank_9      StdDeck_Rank_9
40 #define AStudDeck_Rank_TEN    StdDeck_Rank_TEN
41 #define AStudDeck_Rank_JACK   StdDeck_Rank_JACK
42 #define AStudDeck_Rank_QUEEN  StdDeck_Rank_QUEEN
43 #define AStudDeck_Rank_KING   StdDeck_Rank_KING
44 #define AStudDeck_Rank_ACE    StdDeck_Rank_ACE
45 #define AStudDeck_Rank_FIRST  AStudDeck_Rank_7
46 #define AStudDeck_Rank_LAST   AStudDeck_Rank_ACE
47 #define AStudDeck_Rank_COUNT  8
48 #define AStudDeck_N_RANKMASKS (1 << AStudDeck_Rank_COUNT)
49 
50 #define AStudDeck_RANK(index)  (AStudDeck_Rank_FIRST \
51                                 + ((index) % AStudDeck_Rank_COUNT))
52 #define AStudDeck_SUIT(index)  ((index) / AStudDeck_Rank_COUNT)
53 #define AStudDeck_MAKE_CARD(rank, suit) ((suit * AStudDeck_Rank_COUNT) \
54                                          + ( rank - AStudDeck_Rank_FIRST ))
55 
56 #define AStudDeck_Suit_HEARTS   StdDeck_Suit_HEARTS
57 #define AStudDeck_Suit_DIAMONDS StdDeck_Suit_DIAMONDS
58 #define AStudDeck_Suit_CLUBS    StdDeck_Suit_CLUBS
59 #define AStudDeck_Suit_SPADES   StdDeck_Suit_SPADES
60 #define AStudDeck_Suit_FIRST    AStudDeck_Suit_HEARTS
61 #define AStudDeck_Suit_LAST     AStudDeck_Suit_SPADES
62 #define AStudDeck_Suit_COUNT    4
63 
64 typedef StdDeck_RankMask AStudDeck_RankMask;
65 
66 #define AStudDeck_CardMask          StdDeck_CardMask
67 #define AStudDeck_CardMask_SPADES   StdDeck_CardMask_SPADES
68 #define AStudDeck_CardMask_CLUBS    StdDeck_CardMask_CLUBS
69 #define AStudDeck_CardMask_DIAMONDS StdDeck_CardMask_DIAMONDS
70 #define AStudDeck_CardMask_HEARTS   StdDeck_CardMask_HEARTS
71 
72 #define AStudDeck_CardMask_NOT         StdDeck_CardMask_NOT
73 #define AStudDeck_CardMask_OR          StdDeck_CardMask_OR
74 #define AStudDeck_CardMask_AND         StdDeck_CardMask_AND
75 #define AStudDeck_CardMask_XOR         StdDeck_CardMask_XOR
76 #define AStudDeck_CardMask_ANY_SET     StdDeck_CardMask_ANY_SET
77 #define AStudDeck_CardMask_RESET       StdDeck_CardMask_RESET
78 #define AStudDeck_CardMask_UNSET       StdDeck_CardMask_UNSET
79 #define AStudDeck_CardMask_IS_EMPTY    StdDeck_CardMask_IS_EMPTY
80 
81 #ifdef USE_INT64
82 #define AStudDeck_CardMask_CARD_IS_SET(mask, index)                       \
83   (( (mask).cards_n & (AStudDeck_MASK(index).cards_n)) != 0 )
84 #else
85 #define AStudDeck_CardMask_CARD_IS_SET(mask, index)                       \
86   ((( (mask).cards_nn.n1 & (AStudDeck_MASK(index).cards_nn.n1)) != 0 )    \
87    || (( (mask).cards_nn.n2 & (AStudDeck_MASK(index).cards_nn.n2)) != 0 ))
88 #endif
89 
90 #define AStudDeck_CardMask_SET(mask, index)     \
91 do {                                            \
92   AStudDeck_CardMask _t1 = AStudDeck_MASK(index);         \
93   AStudDeck_CardMask_OR((mask), (mask), _t1);             \
94 } while (0)
95 
96 extern POKEREVAL_EXPORT AStudDeck_CardMask AStudDeck_cardMasksTable[AStudDeck_N_CARDS];
97 
98 extern POKEREVAL_EXPORT const char AStudDeck_rankChars[AStudDeck_Rank_LAST+1];
99 extern POKEREVAL_EXPORT const char AStudDeck_suitChars[AStudDeck_Suit_LAST+1];
100 
101 extern POKEREVAL_EXPORT int AStudDeck_cardToString(int cardIndex, char *outString);
102 extern POKEREVAL_EXPORT int AStudDeck_stringToCard(char *inString, int *outCard);
103 
104 #define AStudDeck_cardString(i) GenericDeck_cardString(&AStudDeck, (i))
105 #define AStudDeck_printCard(i)  GenericDeck_printCard(&AStudDeck, (i))
106 #define AStudDeck_printMask(m)  GenericDeck_printMask(&AStudDeck, ((void *) &(m)))
107 #define AStudDeck_maskString(m) GenericDeck_maskString(&AStudDeck, ((void *) &(m)))
108 #define AStudDeck_numCards(m) GenericDeck_numCards(&AStudDeck, ((void *) &(m)))
109 #define AStudDeck_maskToString(m, s) GenericDeck_maskToString(&AStudDeck, ((void *) &(m)), (s))
110 
111 extern POKEREVAL_EXPORT Deck AStudDeck;
112 
113 #endif
114 
115 
116 
117 #ifdef DECK_ASTUD
118 
119 #if defined(Deck_N_CARDS)
120 #include "deck_undef.h"
121 #endif
122 
123 #define Deck_N_CARDS      AStudDeck_N_CARDS
124 #define Deck_MASK         AStudDeck_MASK
125 #define Deck_RANK         AStudDeck_RANK
126 #define Deck_SUIT         AStudDeck_SUIT
127 
128 #define Rank_7            AStudDeck_Rank_7
129 #define Rank_8            AStudDeck_Rank_8
130 #define Rank_9            AStudDeck_Rank_9
131 #define Rank_TEN          AStudDeck_Rank_TEN
132 #define Rank_JACK         AStudDeck_Rank_JACK
133 #define Rank_QUEEN        AStudDeck_Rank_QUEEN
134 #define Rank_KING         AStudDeck_Rank_KING
135 #define Rank_ACE          AStudDeck_Rank_ACE
136 #define Rank_FIRST        AStudDeck_Rank_FIRST
137 #define Rank_COUNT        AStudDeck_Rank_COUNT
138 
139 #define Suit_HEARTS       AStudDeck_Suit_HEARTS
140 #define Suit_DIAMONDS     AStudDeck_Suit_DIAMONDS
141 #define Suit_CLUBS        AStudDeck_Suit_CLUBS
142 #define Suit_SPADES       AStudDeck_Suit_SPADES
143 #define Suit_FIRST        AStudDeck_Suit_FIRST
144 #define Suit_COUNT        AStudDeck_Suit_COUNT
145 
146 #define CardMask               AStudDeck_CardMask
147 #define CardMask_NOT           AStudDeck_CardMask_NOT
148 #define CardMask_OR            AStudDeck_CardMask_OR
149 #define CardMask_XOR           AStudDeck_CardMask_XOR
150 #define CardMask_AND           AStudDeck_CardMask_AND
151 #define CardMask_SET           AStudDeck_CardMask_SET
152 #define CardMask_CARD_IS_SET   AStudDeck_CardMask_CARD_IS_SET
153 #define CardMask_ANY_SET       AStudDeck_CardMask_ANY_SET
154 #define CardMask_RESET         AStudDeck_CardMask_RESET
155 #define CardMask_UNSET         AStudDeck_CardMask_UNSET
156 
157 #define CardMask_SPADES        AStudDeck_CardMask_SPADES
158 #define CardMask_HEARTS        AStudDeck_CardMask_HEARTS
159 #define CardMask_CLUBS         AStudDeck_CardMask_CLUBS
160 #define CardMask_DIAMONDS      AStudDeck_CardMask_DIAMONDS
161 
162 #define CurDeck AStudDeck
163 
164 #endif /* DECK_ASTUD */
165 
166