@@ 8,6 8,7 @@
#include <bitset>
#include <boost/optional.hpp>
#include <boost/container/flat_map.hpp>
+#include <boost/container/small_vector.hpp>
static constexpr int WIDTH = 9;
using Piece = uint8_t;
@@ 180,13 181,13 @@ struct PieceSet {
size_t size() const { return data_.count(); }
void clear() { data_.reset(); }
template <typename F>
- void forEach(const F& f) const {
- for (size_t i = 1; i < data_.size(); ++i) {
- if (data_[i]) {
- f(i);
- }
+ void forEach(const F& f) const {
+ for (size_t i = 1; i < data_.size(); ++i) {
+ if (data_[i]) {
+ f(i);
}
}
+ }
Piece front() const {
for (size_t i = 1; i != data_.size(); ++i) {
if (data_[i]) {
@@ 227,7 228,7 @@ struct Field {
constexpr Field& operator = (const Field&) noexcept = default;
constexpr Field& operator = (Field&&) noexcept = default;
- Field(const std::initializer_list<Piece>& possible) {
+ constexpr Field(const std::initializer_list<Piece>& possible) noexcept {
clear();
assert(possible.size() > 1);
assert(possible_.size() == 0);
@@ 235,16 236,16 @@ struct Field {
}
template <typename F>
- void forEach(const F& f) const {
- possible_.forEach(f);
- }
+ constexpr void forEach(const F& f) const noexcept {
+ possible_.forEach(f);
+ }
- void set(const Piece piece) {
+ void set(const Piece piece) noexcept {
assert(piece > 0 && piece <= WIDTH);
possible_.insert(piece);
}
- bool unset(const Piece piece) {
+ bool unset(const Piece piece) noexcept {
const bool wasNotUnique = !isUnique();
const bool changes = possible_.isSet(piece);
if (changes) {
@@ 255,19 256,19 @@ struct Field {
return false;
}
- bool isSet(const Piece piece) const {
+ constexpr bool isSet(const Piece piece) const noexcept {
return possible_.isSet(piece);
}
- bool isUnique() const {
+ bool isUnique() const noexcept {
return possible_.size() == 1;
}
- bool isFull() const {
+ bool isFull() const noexcept {
return possible_.size() == WIDTH;
}
- size_t size() const {
+ size_t size() const noexcept {
return possible_.size();
}
@@ 276,7 277,7 @@ struct Field {
return possible_.front();
}
- Field& operator = (const Piece piece) {
+ Field& operator = (const Piece piece) noexcept {
reset(piece);
return *this;
}
@@ 438,7 439,7 @@ struct Board {
return boost::none;
}
- std::vector<Board> splitOn(const Pos pos) {
+ std::vector<Board> splitOn(const Pos pos) const {
std::vector<Board> ret;
const auto& f = get(pos);
ret.reserve(f.size());
@@ 450,7 451,7 @@ struct Board {
return ret;
}
- boost::optional<Pos> findBestGuessPos() {
+ boost::optional<Pos> findBestGuessPos() const {
std::vector<std::pair<size_t, Pos>> guesses;
guesses.reserve(fields_.size());
for (size_t i = 0; i != fields_.size(); ++i) {