Reactos
1//
2// CardCount is a helper library for CardStacks.
3//
4// When you initialize a CardCount object with a
5// cardstack, it keeps track of the number of cards
6// the stack contains.
7//
8// e.g. CardCount count(cardstack);
9//
10// Then you can do:
11//
12// int num_fives = count[5]
13//
14// count.Add(cardstack2); - combine with another stack
15//
16// int num_aces = count[1] - aces low
17// int num_aces = count[14] - aces high
18//
19// count.Clear();
20//
21
22#include "cardlib.h"
23#include "cardcount.h"
24
25CardCount::CardCount()
26{
27 Clear();
28}
29
30CardCount::CardCount(const CardStack &cs)
31{
32 Init(cs);
33}
34
35void CardCount::Clear()
36{
37 for(int i = 0; i < 13; i++)
38 count[i] = 0;
39}
40
41void CardCount::Add(const CardStack &cs)
42{
43 for(int i = 0; i < cs.NumCards(); i++)
44 {
45 Card card = cs[i];
46
47 int val = card.LoVal();
48 count[val - 1]++;
49 }
50}
51
52void CardCount::Sub(const CardStack &cs)
53{
54 for(int i = 0; i < cs.NumCards(); i++)
55 {
56 Card card = cs[i];
57 int val = card.LoVal();
58
59 if(count[val - 1] > 0)
60 count[val - 1]--;
61 }
62}
63
64void CardCount::Init(const CardStack &cs)
65{
66 Clear();
67 Add(cs);
68}
69
70int CardCount::operator [] (size_t index) const
71{
72 if(index < 1) return 0;
73 else if(index > 14) return 0; //if out of range
74 else if(index == 14) index = 1; //if a "ace-high"
75
76 return count[index - 1];
77}
78
79//
80// Decrement specified item by one
81//
82void CardCount::Dec(size_t index)
83{
84 if(index < 1) return;
85 else if(index > 14) return; //if out of range
86 else if(index == 14) index = 1; //if a "ace-high"
87
88 index -= 1;
89
90 if(count[index] > 0)
91 count[index]--;
92}