20[[nodiscard]]
static inline constexpr HashSize do_hash(
21 const uint32_t XYBits,
23 const Idx column)
noexcept
25 return (
static_cast<HashSize
>(
row) << XYBits) +
static_cast<HashSize
>(column);
33[[nodiscard]]
static inline constexpr Idx unhash_row(
34 const uint32_t XYBits,
35 const Topo hash)
noexcept
38 return static_cast<Idx
>(hash >> XYBits);
46[[nodiscard]]
static inline constexpr Idx unhash_column(
47 const Topo ColumnMask,
48 const Topo hash)
noexcept
50 return static_cast<Idx
>(hash & ColumnMask);
64 [[nodiscard]]
constexpr Idx
row() const noexcept
72 [[nodiscard]]
constexpr Idx
column() const noexcept
80 [[nodiscard]]
constexpr HashSize
hash() const noexcept
83 constexpr int num_bits = std::numeric_limits<HashSize>::digits;
84 constexpr Topo m = util::bit_mask<num_bits, Topo>();
100 return hash() == rhs.hash();
109 return !(*
this == rhs);
119 static constexpr uint32_t
XYBits = std::bit_width<uint32_t>(MAX_ROWS - 1);
120 static_assert(util::pow_int<XYBits, size_t>(2) == MAX_ROWS);
121 static_assert(util::pow_int<XYBits, size_t>(2) == MAX_COLUMNS);
129 static constexpr Topo
ColumnMask = util::bit_mask<XYBits, Topo>();
133 static constexpr Topo
HashMask = util::bit_mask<PositionBits, Topo>();
134 static_assert(
HashMask >=
static_cast<size_t>(MAX_COLUMNS) * MAX_ROWS - 1);
135 static_assert(HashMask <= std::numeric_limits<HashSize>::max());
140 explicit constexpr Position(
const Topo& topo) noexcept
150 [[nodiscard]]
static constexpr HashSize
doHash(
152 const Idx
column)
noexcept
157#define ROW_MAX (MAX_ROWS - 1)
159#define COL_MAX (MAX_COLUMNS - 1)
160 static_assert(ROW_MIN == unhash_row(
XYBits, do_hash(
XYBits, ROW_MIN, COL_MIN)));
161 static_assert(COL_MIN == unhash_column(
ColumnMask, do_hash(
XYBits, ROW_MIN, COL_MIN)));
162 static_assert(ROW_MIN == unhash_row(
XYBits, do_hash(
XYBits, ROW_MIN, COL_MAX)));
163 static_assert(COL_MAX == unhash_column(
ColumnMask, do_hash(
XYBits, ROW_MIN, COL_MAX)));
164 static_assert(ROW_MAX == unhash_row(
XYBits, do_hash(
XYBits, ROW_MAX, COL_MIN)));
165 static_assert(COL_MIN == unhash_column(
ColumnMask, do_hash(
XYBits, ROW_MAX, COL_MIN)));
166 static_assert(ROW_MAX == unhash_row(
XYBits, do_hash(
XYBits, ROW_MAX, COL_MAX)));
167 static_assert(COL_MAX == unhash_column(
ColumnMask, do_hash(
XYBits, ROW_MAX, COL_MAX)));
178 [[nodiscard]]
static constexpr Idx
unhashRow(
const Topo hash)
noexcept
180 return unhash_row(
XYBits, hash);
187 [[nodiscard]]
static constexpr Idx
unhashColumn(
const Topo hash)
noexcept
193inline bool operator<(
const Position<V>& lhs,
const Position<V>& rhs)
195 return lhs.hash() < rhs.hash();
198inline bool operator>(
const Position<V>& lhs,
const Position<V>& rhs)
203inline bool operator<=(
const Position<V>& lhs,
const Position<V>& rhs)
208inline bool operator>=(
const Position<V>& lhs,
const Position<V>& rhs)
213#ifdef DEBUG_DIRECTIONS
215static const map<CellIndex, const char*> DIRECTION_NAMES{
216 {DIRECTION_NONE,
"NONE"},
221 {DIRECTION_SW,
"SW"},
222 {DIRECTION_NE,
"NE"},
223 {DIRECTION_NW,
"NW"},
224 {DIRECTION_SE,
"SE"}};
231 using Position::Position;
238 explicit constexpr Location(
const Idx,
const Idx,
const HashSize hash)
noexcept
245 logging::check_fatal(
247 "Row %d is out of bounds (%d, %d)",
251 logging::check_fatal(
253 "Column %d is out of bounds (%d, %d)",
257 logging::check_fatal(
260 "Hash is incorrect (%d, %d)",
277 logging::check_fatal(
row >= MAX_ROWS ||
column >= MAX_COLUMNS,
"Location out of bounds (%d, %d)",
row,
column);
281 :
Location(std::get<0>(coord), std::get<1>(coord))
288 explicit constexpr Location(
const HashSize& hash_size) noexcept
289 :
Position(
static_cast<HashSize
>(hash_size))
298 :
Position(
static_cast<HashSize
>(position.hash()))
Definition Location.h:229
Location(const Idx row, const Idx column, const HashSize hash) noexcept
Construct using hash of row and column.
Definition Location.h:240
Location(const Idx row, const Idx column) noexcept
Constructor.
Definition Location.h:273
constexpr Location(const HashSize &hash_size) noexcept
Construct with given hash that may contain data from subclasses.
Definition Location.h:288
constexpr Location(const Position< P > &position) noexcept
Construct with given hash that may contain data from subclasses.
Definition Location.h:297
A Position with a row and column.
Definition Location.h:57
static constexpr Idx unhashColumn(const Topo hash) noexcept
Column.
Definition Location.h:187
constexpr Idx row() const noexcept
Row.
Definition Location.h:64
static constexpr Topo HashMask
Hash mask for bits being used for Position data.
Definition Location.h:133
constexpr bool operator!=(const Position &rhs) const noexcept
Inequality operator.
Definition Location.h:107
V topo_data_
Stored hash that contains row and column data.
Definition Location.h:115
static constexpr uint32_t PositionBits
Number of bits to use for storing Position data.
Definition Location.h:125
constexpr HashSize hash() const noexcept
Hash derived from row and column.
Definition Location.h:80
constexpr Idx column() const noexcept
Column.
Definition Location.h:72
static constexpr HashSize doHash(const Idx row, const Idx column) noexcept
Create a hash from given values.
Definition Location.h:150
constexpr bool operator==(const Position &rhs) const noexcept
Equality operator.
Definition Location.h:98
constexpr Position(const Topo &topo) noexcept
Construct with given hash that may contain data from subclasses.
Definition Location.h:140
static constexpr uint32_t XYBits
Number of bits to use for storing one coordinate of Position data.
Definition Location.h:119
static constexpr Idx unhashRow(const Topo hash) noexcept
Row from hash.
Definition Location.h:178
static constexpr Topo ColumnMask
Hash mask for bits being used for Position data.
Definition Location.h:129