Reactos
1//
2// CardLib - CardStack class
3//
4// Freeware
5// Copyright J Brown 2001
6//
7
8#include "cardlib.h"
9
10Card &CardStack::operator[] (size_t index)
11{
12 if(index >= (size_t)nNumCards) index = nNumCards - 1;
13 return cardlist[nNumCards - index - 1];
14}
15
16const Card &CardStack::operator[] (size_t index) const
17{
18 if(index >= (size_t)nNumCards) index = nNumCards - 1;
19 return cardlist[nNumCards - index - 1];
20}
21
22// Subscripting operator for a constant sequence
23//
24/*Card CardStack::operator[] (size_t index) const
25{
26 return cardlist[index];
27}*/
28
29//
30// Subscripting operator for a non-const sequence
31//
32/*CardStack::ref CardStack::operator[] (size_t index)
33{
34 return ref(this, index);
35}*/
36
37void CardStack::Clear()
38{
39 nNumCards = 0;
40}
41
42void CardStack::NewDeck()
43{
44 nNumCards = 52;
45
46 for(int i = 0; i < 52; i++)
47 cardlist[i].nValue = i;
48}
49
50void CardStack::Shuffle()
51{
52 int src, dest;
53 Card temp;
54
55 //shuffle 8 times..
56 for(int i = 0; i < 8; i++)
57 for(dest = nNumCards - 1; dest > 0; dest--)
58 {
59 //want to do this:
60 // bad: src = rand() % (dest + 1)
61 // good: src = rand() / (RAND_MAX / (dest+1) + 1)
62
63 //positions from 0 to dest
64 src = rand() / (RAND_MAX / (dest+1) + 1);
65
66 //swap the cards
67 temp = cardlist[src];
68 cardlist[src] = cardlist[dest];
69 cardlist[dest] = temp;
70 }
71}
72
73void CardStack::Reverse()
74{
75 for(int i = 0; i < nNumCards / 2; i++)
76 {
77 Card temp = cardlist[i];
78 cardlist[i] = cardlist[nNumCards - i - 1];
79 cardlist[nNumCards - i - 1] = temp;
80 }
81}
82
83void CardStack::Push(const Card card)
84{
85 if(nNumCards < MAX_CARDSTACK_SIZE)
86 cardlist[nNumCards++] = card;
87}
88
89void CardStack::Push(const CardStack &cardstack)
90{
91 if(nNumCards + cardstack.nNumCards < MAX_CARDSTACK_SIZE)
92 {
93 int num = cardstack.NumCards();
94
95 for(int i = 0; i < num; i++)
96 cardlist[nNumCards++] = cardstack.cardlist[i];
97 }
98}
99
100CardStack& CardStack::operator += (Card card)
101{
102 Push(card);
103 return *this;
104}
105
106CardStack& CardStack::operator += (CardStack &cs)
107{
108 Push(cs);
109 return *this;
110}
111
112CardStack CardStack::operator + (Card card)
113{
114 CardStack poo = *this;
115 poo.Push(card);
116 return poo;
117}
118
119CardStack CardStack::operator + (CardStack &cs)
120{
121 CardStack poo = *this;
122 poo.Push(cs);
123 return poo;
124}
125
126
127Card CardStack::Pop()
128{
129 if(nNumCards > 0)
130 return cardlist[--nNumCards];
131 else
132 return 0;
133}
134
135CardStack CardStack::Pop(int items)
136{
137 if(items <= nNumCards && nNumCards > 0)
138 {
139 CardStack cs(*this, nNumCards - items);
140
141 nNumCards -= items;
142
143 return cs;
144 }
145 else
146 {
147 return CardStack();
148 }
149}
150
151Card CardStack::Top()
152{
153 if(nNumCards > 0)
154 return cardlist[nNumCards - 1];
155 else
156 return 0;
157}
158
159CardStack CardStack::Top(int items)
160{
161 if(items <= nNumCards && nNumCards > 0)
162 {
163 return CardStack (*this, nNumCards - items);
164 }
165 else
166 {
167 return CardStack();
168 }
169
170}
171
172Card CardStack::RemoveCard(size_t index)
173{
174 if(nNumCards == 0 || index >= (size_t)nNumCards)
175 return 0;
176
177 //put index into reverse range..
178 index = nNumCards - index - 1;
179
180 Card temp = cardlist[index];
181
182 nNumCards--;
183
184 for(size_t i = index; i < (size_t)nNumCards; i++)
185 {
186 cardlist[i] = cardlist[i+1];
187 }
188
189 return temp;
190}
191
192void CardStack::InsertCard(size_t index, Card card)
193{
194 if(nNumCards == MAX_CARDSTACK_SIZE)
195 return;
196
197 if(index > (size_t)nNumCards)
198 return;
199
200 if((size_t)nNumCards == index)
201 {
202 cardlist[nNumCards] = card;
203 nNumCards++;
204 return;
205 }
206
207 //put index into reverse range..
208 index = nNumCards - index - 1;
209
210 nNumCards++;
211
212 //make room for the card
213 for(size_t i = nNumCards; i > index; i--)
214 {
215 cardlist[i] = cardlist[i - 1];
216 }
217
218 cardlist[index] = card;
219}
220
221
222void CardStack::Print()
223{
224// for(int i = 0; i < nNumCards; i++)
225// cout << cardlist[i].HiVal() << " ";
226}
227
228CardStack::CardStack(CardStack ©this, size_t fromindex)
229{
230 nNumCards = copythis.nNumCards - fromindex;
231
232 for(int i = 0; i < nNumCards; i++)
233 cardlist[i] = copythis.cardlist[fromindex + i];
234}
235