--- /dev/null
+//\r
+// CardLib - CardStack class\r
+//\r
+// Freeware\r
+// Copyright J Brown 2001\r
+//\r
+#include <windows.h>\r
+#include <stdlib.h>\r
+\r
+#include "cardstack.h"\r
+\r
+Card &CardStack::operator[] (size_t index)\r
+{\r
+ if(index >= (size_t)nNumCards) index = nNumCards - 1;\r
+ return cardlist[nNumCards - index - 1];\r
+}\r
+\r
+const Card &CardStack::operator[] (size_t index) const\r
+{\r
+ if(index >= (size_t)nNumCards) index = nNumCards - 1;\r
+ return cardlist[nNumCards - index - 1];\r
+}\r
+\r
+// Subscripting operator for a constant sequence\r
+//\r
+/*Card CardStack::operator[] (size_t index) const\r
+{\r
+ return cardlist[index];\r
+}*/\r
+\r
+//\r
+// Subscripting operator for a non-const sequence\r
+//\r
+/*CardStack::ref CardStack::operator[] (size_t index)\r
+{\r
+ return ref(this, index);\r
+}*/\r
+\r
+void CardStack::Clear()\r
+{\r
+ nNumCards = 0;\r
+}\r
+\r
+void CardStack::NewDeck()\r
+{\r
+ nNumCards = 52;\r
+\r
+ for(int i = 0; i < 52; i++)\r
+ cardlist[i].nValue = i;\r
+}\r
+\r
+void CardStack::Shuffle()\r
+{\r
+ int src, dest;\r
+ Card temp;\r
+\r
+ //shuffle 8 times..\r
+ for(int i = 0; i < 8; i++)\r
+ for(dest = nNumCards - 1; dest > 0; dest--)\r
+ {\r
+ //want to do this:\r
+ // bad: src = rand() % (dest + 1)\r
+ // good: src = rand() / (RAND_MAX / (dest+1) + 1)\r
+ \r
+ //positions from 0 to dest\r
+ src = rand() / (RAND_MAX / (dest+1) + 1);\r
+ \r
+ //swap the cards\r
+ temp = cardlist[src];\r
+ cardlist[src] = cardlist[dest];\r
+ cardlist[dest] = temp;\r
+ }\r
+}\r
+\r
+void CardStack::Reverse()\r
+{\r
+ for(int i = 0; i < nNumCards / 2; i++)\r
+ {\r
+ Card temp = cardlist[i];\r
+ cardlist[i] = cardlist[nNumCards - i - 1];\r
+ cardlist[nNumCards - i - 1] = temp;\r
+ }\r
+}\r
+\r
+void CardStack::Push(const Card card)\r
+{\r
+ if(nNumCards < MAX_CARDSTACK_SIZE)\r
+ cardlist[nNumCards++] = card;\r
+}\r
+\r
+void CardStack::Push(const CardStack &cardstack)\r
+{\r
+ if(nNumCards + cardstack.nNumCards < MAX_CARDSTACK_SIZE)\r
+ {\r
+ int num = cardstack.NumCards();\r
+ \r
+ for(int i = 0; i < num; i++)\r
+ cardlist[nNumCards++] = cardstack.cardlist[i];\r
+ }\r
+}\r
+\r
+CardStack& CardStack::operator += (Card card)\r
+{\r
+ Push(card);\r
+ return *this;\r
+}\r
+\r
+CardStack& CardStack::operator += (CardStack &cs)\r
+{\r
+ Push(cs);\r
+ return *this;\r
+}\r
+\r
+CardStack CardStack::operator + (Card card)\r
+{\r
+ CardStack poo = *this;\r
+ poo.Push(card);\r
+ return poo;\r
+}\r
+\r
+CardStack CardStack::operator + (CardStack &cs)\r
+{\r
+ CardStack poo = *this;\r
+ poo.Push(cs);\r
+ return poo;\r
+}\r
+\r
+\r
+Card CardStack::Pop()\r
+{\r
+ if(nNumCards > 0)\r
+ return cardlist[--nNumCards];\r
+ else\r
+ return 0;\r
+}\r
+\r
+CardStack CardStack::Pop(int items)\r
+{\r
+ if(items <= nNumCards && nNumCards > 0)\r
+ {\r
+ CardStack cs(*this, nNumCards - items);\r
+\r
+ nNumCards -= items;\r
+\r
+ return cs;\r
+ }\r
+ else\r
+ {\r
+ return CardStack();\r
+ }\r
+}\r
+\r
+Card CardStack::Top()\r
+{\r
+ if(nNumCards > 0)\r
+ return cardlist[nNumCards - 1];\r
+ else\r
+ return 0;\r
+}\r
+\r
+CardStack CardStack::Top(int items)\r
+{\r
+ if(items <= nNumCards && nNumCards > 0)\r
+ {\r
+ return CardStack (*this, nNumCards - items);\r
+ }\r
+ else\r
+ {\r
+ return CardStack();\r
+ }\r
+\r
+}\r
+\r
+Card CardStack::RemoveCard(size_t index)\r
+{\r
+ if(nNumCards == 0 || index >= (size_t)nNumCards)\r
+ return 0;\r
+\r
+ //put index into reverse range..\r
+ index = nNumCards - index - 1;\r
+\r
+ Card temp = cardlist[index];\r
+\r
+ nNumCards--;\r
+\r
+ for(size_t i = index; i < (size_t)nNumCards; i++)\r
+ {\r
+ cardlist[i] = cardlist[i+1];\r
+ }\r
+\r
+ return temp;\r
+}\r
+\r
+void CardStack::InsertCard(size_t index, Card card)\r
+{\r
+ if(nNumCards == MAX_CARDSTACK_SIZE)\r
+ return;\r
+\r
+ if(index > (size_t)nNumCards)\r
+ return;\r
+\r
+ if((size_t)nNumCards == index)\r
+ {\r
+ cardlist[nNumCards] = card;\r
+ nNumCards++;\r
+ return;\r
+ }\r
+\r
+ //put index into reverse range..\r
+ index = nNumCards - index - 1;\r
+\r
+ nNumCards++;\r
+\r
+ //make room for the card\r
+ for(size_t i = nNumCards; i > index; i--)\r
+ {\r
+ cardlist[i] = cardlist[i - 1];\r
+ }\r
+\r
+ cardlist[index] = card;\r
+}\r
+\r
+\r
+void CardStack::Print()\r
+{\r
+// for(int i = 0; i < nNumCards; i++)\r
+// cout << cardlist[i].HiVal() << " ";\r
+}\r
+\r
+CardStack::CardStack(CardStack ©this, size_t fromindex)\r
+{\r
+ nNumCards = copythis.nNumCards - fromindex;\r
+\r
+ for(int i = 0; i < nNumCards; i++)\r
+ cardlist[i] = copythis.cardlist[fromindex + i];\r
+}\r
+\r