doasku

Human-like solver for sudoku
git clone git://git.dimitrijedobrota.com/doasku.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

cord.hpp (1194B)


0 #ifndef DOASKO_CORD_HPP
1 #define DOASKO_CORD_HPP
3 #include <cassert>
4 #include <cinttypes>
5 #include <utility>
7 struct cord_t
8 {
9 explicit cord_t(uint8_t value)
10 : m_value(value)
11 {
12 assert(value < 9);
13 }
15 cord_t(uint8_t row, uint8_t col)
16 : m_value(static_cast<uint8_t>(row * 3 + col))
17 {
18 assert(row < 3 && col < 3);
19 }
21 // NOLINTNEXTLINE
22 operator uint8_t() const { return m_value; }
24 uint8_t row() const { return m_value / 3; }
25 uint8_t col() const { return m_value % 3; }
27 uint8_t m_value;
28 };
30 class acord_t
31 {
32 public:
33 acord_t(cord_t subgrid, cord_t field)
34 : m_subgrid(subgrid)
35 , m_field(field)
36 {
37 }
39 acord_t(uint8_t row, uint8_t col)
40 : m_subgrid(row / 3, col / 3)
41 , m_field(row % 3, col % 3)
42 {
43 }
45 cord_t subgrid() const { return m_subgrid; }
46 cord_t field() const { return m_field; }
48 uint8_t row() const
49 {
50 return static_cast<uint8_t>(m_subgrid.row() * 3 + m_field.row());
51 }
52 uint8_t col() const
53 {
54 return static_cast<uint8_t>(m_subgrid.col() * 3 + m_field.col());
55 }
57 std::tuple<cord_t, cord_t> relative() const { return {m_subgrid, m_field}; }
59 private:
60 cord_t m_subgrid;
61 cord_t m_field;
62 };
64 #endif