Introduced the NoPool placeholder class.
[tagua/yd.git] / src / variants / xchess / pool.h
blob11083e9b173529dd2675653fd84f89fdfb45c5eb
1 #ifndef XCHESS__POOL_H
2 #define XCHESS__POOL_H
4 template <typename Position>
5 class PoolReference {
6 typedef typename Position::Piece Piece;
7 typedef typename Piece::Color Color;
8 typedef typename Piece::Type Type;
9 public:
10 typedef std::map<Type, int> PlayerPool;
11 typedef std::map<Color, PlayerPool> Pool;
12 private:
13 PlayerPool* m_p_pool;
14 Color m_color;
15 public:
16 PoolReference(PlayerPool* p, Color color)
17 : m_p_pool(p)
18 , m_color(color) {
21 int size();
22 int insert(int idx, const Piece& p);
23 Piece get(int idx);
24 Piece take(int idx);
28 template <typename Position>
29 int PoolReference<Position>::size() {
30 if (!m_p_pool)
31 return 0;
33 int retv = 0;
34 for (typename PlayerPool::iterator i = m_p_pool->begin(); i != m_p_pool->end(); ++i)
35 retv += i->second;
36 return retv;
39 template <typename Position>
40 int PoolReference<Position>::insert(int idx, const Piece& p) {
41 if (m_color != p.color()) {
42 ERROR("Inserting a piece in the wrong pool?");
43 return -1;
46 int fill = 0;
47 for (typename PlayerPool::iterator i = m_p_pool->begin();
48 (i != m_p_pool->end()) && i->first < p.type();
49 ++i) {
50 fill += i->second;
53 int nump = ++(*m_p_pool)[p.type()];
55 if (idx < fill)
56 return fill;
57 if (idx >= fill + nump)
58 return fill + nump - 1;
59 return idx;
62 template <typename Position>
63 typename PoolReference<Position>::Piece PoolReference<Position>::get(int idx) {
64 if (idx < 0)
65 return Piece();
67 int fill = 0;
68 for (typename PlayerPool::iterator i = m_p_pool->begin(); i != m_p_pool->end(); ++i) {
69 if (idx < fill + i->second)
70 return Piece(m_color, i->first);
71 fill += i->second;
73 return Piece();
76 template <typename Position>
77 typename PoolReference<Position>::Piece PoolReference<Position>::take(int idx) {
78 if (idx < 0)
79 return Piece();
81 int fill = 0;
82 for(typename PlayerPool::iterator i = m_p_pool->begin(); i != m_p_pool->end(); ++i) {
83 if(idx < fill + i->second) {
84 Type t = i->first;
85 if(!--i->second)
86 m_p_pool->erase(i);
87 return Piece(m_color, t);
89 fill += i->second;
91 return Piece();
94 #endif // XCHESS__POOL_H