Cluedo Solver v1.0
Cluedo game solver making deductions.
Loading...
Searching...
No Matches
CardSet.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <bitset>
4#include <initializer_list>
5
6#include "Card.hpp"
7
10
11namespace Cluedo {
12
20class CardSet {
21public:
22 friend std::hash<CardSet>;
23
25 class iterator {
26 public:
30 constexpr iterator(std::bitset<CardUtils::CARD_COUNT> const& set_ref)
31 : m_set_ref(set_ref) {
33 }
34
40 constexpr iterator(std::bitset<CardUtils::CARD_COUNT> const& set_ref, std::size_t index)
41 : m_set_ref(set_ref), m_index(index) {
43 }
44
47 constexpr void advance_to_next_index() {
48 while (m_index < m_set_ref.size() && !m_set_ref[m_index])
49 ++m_index;
50 }
51
53 constexpr void operator++() {
54 ++m_index;
56 }
57
63 constexpr bool operator==(iterator const& other) const { return &m_set_ref == &other.m_set_ref && m_index == other.m_index; }
69 constexpr bool operator!=(iterator const& other) const { return !(*this == other); }
70
72 constexpr Card operator*() const { return static_cast<Card>(m_index); }
73
74 private:
75 std::bitset<CardUtils::CARD_COUNT> const& m_set_ref;
76 std::size_t m_index { 0 };
77 };
78
80 constexpr CardSet() = default;
81
85 constexpr CardSet(std::initializer_list<Card> cards) {
86 for (auto card : cards)
87 m_set[static_cast<std::size_t>(card)] = true;
88 m_size = cards.size();
89 }
90
94 constexpr CardSet(std::bitset<CardUtils::CARD_COUNT> set)
95 : m_set(set), m_size(set.count()) {}
96
100 constexpr std::size_t size() const { return m_size; }
104 constexpr bool empty() const { return m_size == 0; }
110 constexpr bool contains(Card card) const { return m_set[static_cast<std::size_t>(card)]; }
111
117 constexpr bool insert(Card card) {
118 if (contains(card))
119 return true;
120
121 m_set[static_cast<std::size_t>(card)] = true;
122 ++m_size;
123 return false;
124 }
125
129 constexpr void erase(Card card) {
130 if (!contains(card))
131 return;
132
133 m_set[static_cast<std::size_t>(card)] = false;
134 --m_size;
135 }
136
138 constexpr void clear() {
139 m_set.reset();
140 m_size = 0;
141 }
142
148 constexpr bool operator==(CardSet const& other) const = default;
154 constexpr bool operator!=(CardSet const& other) const = default;
155
162 constexpr CardSet& set_union(CardSet const& other) {
163 m_set |= other.m_set;
164 m_size = m_set.count();
165 return *this;
166 }
167
174 static constexpr CardSet intersection(CardSet const& a, CardSet const& b) { return a.m_set & b.m_set; }
175
181 constexpr bool is_subset(CardSet const& other) const { return (m_set & other.m_set) == m_set; }
182
184 constexpr iterator begin() const { return { m_set }; }
185
187 constexpr iterator end() const { return { m_set, m_set.size() }; }
188
189private:
190 std::bitset<CardUtils::CARD_COUNT> m_set;
191 std::size_t m_size { 0 };
192};
193
194};
195
197template<>
198struct std::hash<Cluedo::CardSet> {
200 std::size_t operator()(Cluedo::CardSet const& set) const noexcept {
201 return std::hash<std::bitset<Cluedo::CardUtils::CARD_COUNT>>()(set.m_set);
202 }
203};
Card
All the cards in Cluedo.
Definition Card.hpp:66
An iterator for the CardSet class.
Definition CardSet.hpp:25
constexpr void advance_to_next_index()
Definition CardSet.hpp:47
constexpr void operator++()
Advances the iterator to the next card in the set.
Definition CardSet.hpp:53
constexpr bool operator!=(iterator const &other) const
Definition CardSet.hpp:69
constexpr bool operator==(iterator const &other) const
Definition CardSet.hpp:63
constexpr iterator(std::bitset< CardUtils::CARD_COUNT > const &set_ref)
Definition CardSet.hpp:30
constexpr iterator(std::bitset< CardUtils::CARD_COUNT > const &set_ref, std::size_t index)
Definition CardSet.hpp:40
constexpr Card operator*() const
Returns the card that the iterator points to.
Definition CardSet.hpp:72
A set of cards.
Definition CardSet.hpp:20
constexpr bool operator==(CardSet const &other) const =default
static constexpr CardSet intersection(CardSet const &a, CardSet const &b)
Definition CardSet.hpp:174
constexpr CardSet & set_union(CardSet const &other)
Definition CardSet.hpp:162
constexpr void erase(Card card)
Definition CardSet.hpp:129
constexpr bool contains(Card card) const
Definition CardSet.hpp:110
constexpr CardSet(std::initializer_list< Card > cards)
Definition CardSet.hpp:85
constexpr iterator end() const
Returns an iterator to the last card of the set.
Definition CardSet.hpp:187
constexpr void clear()
Clears the set.
Definition CardSet.hpp:138
constexpr std::size_t size() const
Definition CardSet.hpp:100
constexpr iterator begin() const
Returns an iterator to the first card of the set.
Definition CardSet.hpp:184
constexpr CardSet()=default
Constructs an empty set.
constexpr bool is_subset(CardSet const &other) const
Definition CardSet.hpp:181
constexpr bool operator!=(CardSet const &other) const =default
constexpr bool empty() const
Definition CardSet.hpp:104
constexpr bool insert(Card card)
Definition CardSet.hpp:117
constexpr CardSet(std::bitset< CardUtils::CARD_COUNT > set)
Definition CardSet.hpp:94
std::size_t operator()(Cluedo::CardSet const &set) const noexcept
Computesthe hash of a CardSet object using the hash of the underlying std::bitset.
Definition CardSet.hpp:200