2 // CardLib - CardStack class
5 // Copyright J Brown 2001
10 #include "cardstack.h"
12 Card
&CardStack::operator[] (size_t index
)
14 if(index
>= (size_t)nNumCards
) index
= nNumCards
- 1;
15 return cardlist
[nNumCards
- index
- 1];
18 const Card
&CardStack::operator[] (size_t index
) const
20 if(index
>= (size_t)nNumCards
) index
= nNumCards
- 1;
21 return cardlist
[nNumCards
- index
- 1];
24 // Subscripting operator for a constant sequence
26 /*Card CardStack::operator[] (size_t index) const
28 return cardlist[index];
32 // Subscripting operator for a non-const sequence
34 /*CardStack::ref CardStack::operator[] (size_t index)
36 return ref(this, index);
39 void CardStack::Clear()
44 void CardStack::NewDeck()
48 for(int i
= 0; i
< 52; i
++)
49 cardlist
[i
].nValue
= i
;
52 void CardStack::Shuffle()
58 for(int i
= 0; i
< 8; i
++)
59 for(dest
= nNumCards
- 1; dest
> 0; dest
--)
62 // bad: src = rand() % (dest + 1)
63 // good: src = rand() / (RAND_MAX / (dest+1) + 1)
65 //positions from 0 to dest
66 src
= rand() / (RAND_MAX
/ (dest
+1) + 1);
70 cardlist
[src
] = cardlist
[dest
];
71 cardlist
[dest
] = temp
;
75 void CardStack::Reverse()
77 for(int i
= 0; i
< nNumCards
/ 2; i
++)
79 Card temp
= cardlist
[i
];
80 cardlist
[i
] = cardlist
[nNumCards
- i
- 1];
81 cardlist
[nNumCards
- i
- 1] = temp
;
85 void CardStack::Push(const Card card
)
87 if(nNumCards
< MAX_CARDSTACK_SIZE
)
88 cardlist
[nNumCards
++] = card
;
91 void CardStack::Push(const CardStack
&cardstack
)
93 if(nNumCards
+ cardstack
.nNumCards
< MAX_CARDSTACK_SIZE
)
95 int num
= cardstack
.NumCards();
97 for(int i
= 0; i
< num
; i
++)
98 cardlist
[nNumCards
++] = cardstack
.cardlist
[i
];
102 CardStack
& CardStack::operator += (Card card
)
108 CardStack
& CardStack::operator += (CardStack
&cs
)
114 CardStack
CardStack::operator + (Card card
)
116 CardStack poo
= *this;
121 CardStack
CardStack::operator + (CardStack
&cs
)
123 CardStack poo
= *this;
129 Card
CardStack::Pop()
132 return cardlist
[--nNumCards
];
137 CardStack
CardStack::Pop(int items
)
139 if(items
<= nNumCards
&& nNumCards
> 0)
141 CardStack
cs(*this, nNumCards
- items
);
153 Card
CardStack::Top()
156 return cardlist
[nNumCards
- 1];
161 CardStack
CardStack::Top(int items
)
163 if(items
<= nNumCards
&& nNumCards
> 0)
165 return CardStack (*this, nNumCards
- items
);
174 Card
CardStack::RemoveCard(size_t index
)
176 if(nNumCards
== 0 || index
>= (size_t)nNumCards
)
179 //put index into reverse range..
180 index
= nNumCards
- index
- 1;
182 Card temp
= cardlist
[index
];
186 for(size_t i
= index
; i
< (size_t)nNumCards
; i
++)
188 cardlist
[i
] = cardlist
[i
+1];
194 void CardStack::InsertCard(size_t index
, Card card
)
196 if(nNumCards
== MAX_CARDSTACK_SIZE
)
199 if(index
> (size_t)nNumCards
)
202 if((size_t)nNumCards
== index
)
204 cardlist
[nNumCards
] = card
;
209 //put index into reverse range..
210 index
= nNumCards
- index
- 1;
214 //make room for the card
215 for(size_t i
= nNumCards
; i
> index
; i
--)
217 cardlist
[i
] = cardlist
[i
- 1];
220 cardlist
[index
] = card
;
224 void CardStack::Print()
226 // for(int i = 0; i < nNumCards; i++)
227 // cout << cardlist[i].HiVal() << " ";
230 CardStack::CardStack(CardStack
©this
, size_t fromindex
)
232 nNumCards
= copythis
.nNumCards
- fromindex
;
234 for(int i
= 0; i
< nNumCards
; i
++)
235 cardlist
[i
] = copythis
.cardlist
[fromindex
+ i
];