mirror of https://github.com/dnomd343/klotski.git
Dnomd343
2 weeks ago
7 changed files with 202 additions and 197 deletions
@ -0,0 +1,90 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace klotski::group { |
||||
|
|
||||
|
constexpr auto Group::mirror_type() const -> MirrorType { |
||||
|
return static_cast<MirrorType>(PATTERN_DATA[flat_id()] & 0b111); |
||||
|
} |
||||
|
|
||||
|
constexpr bool Group::is_vertical_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::Full: |
||||
|
return true; |
||||
|
case MirrorType::Horizontal: |
||||
|
return false; |
||||
|
case MirrorType::Centro: |
||||
|
return false; |
||||
|
case MirrorType::Vertical: |
||||
|
return true; |
||||
|
case MirrorType::Ordinary: |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr bool Group::is_horizontal_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::Full: |
||||
|
return true; |
||||
|
case MirrorType::Horizontal: |
||||
|
return true; |
||||
|
case MirrorType::Centro: |
||||
|
return false; |
||||
|
case MirrorType::Vertical: |
||||
|
return false; |
||||
|
case MirrorType::Ordinary: |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr Group Group::to_vertical_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::Full: |
||||
|
return *this; |
||||
|
case MirrorType::Horizontal: |
||||
|
if (toward_ == Toward::A) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::C); |
||||
|
} |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::A); |
||||
|
case MirrorType::Centro: |
||||
|
if (toward_ == Toward::A) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::B); |
||||
|
} |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::A); |
||||
|
case MirrorType::Vertical: |
||||
|
return *this; |
||||
|
case MirrorType::Ordinary: |
||||
|
if (toward_ == Toward::A) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::C); |
||||
|
} else if (toward_ == Toward::B) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::D); |
||||
|
} else if (toward_ == Toward::C) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::A); |
||||
|
} |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::B); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
constexpr Group Group::to_horizontal_mirror() const { |
||||
|
switch (mirror_type()) { |
||||
|
case MirrorType::Full: |
||||
|
case MirrorType::Horizontal: |
||||
|
return *this; |
||||
|
case MirrorType::Centro: |
||||
|
case MirrorType::Vertical: |
||||
|
if (toward_ == Toward::A) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::B); |
||||
|
} |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::A); |
||||
|
case MirrorType::Ordinary: |
||||
|
if (toward_ == Toward::A) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::B); |
||||
|
} else if (toward_ == Toward::B) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::A); |
||||
|
} else if (toward_ == Toward::C) { |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::D); |
||||
|
} |
||||
|
return Group::unsafe_create(type_id_, pattern_id_, Toward::C); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} // namespace klotski::group |
@ -0,0 +1,30 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace std { |
||||
|
|
||||
|
template <> |
||||
|
struct std::hash<klotski::group::Group> { |
||||
|
constexpr std::size_t operator()(const klotski::group::Group &g) const noexcept { |
||||
|
// TODO: perf hash alg |
||||
|
return std::hash<uint64_t>{}(g.type_id() ^ g.pattern_id() ^ (int)g.toward()); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <> |
||||
|
struct std::hash<klotski::group::GroupUnion> { |
||||
|
constexpr std::size_t operator()(const klotski::group::GroupUnion &gu) const noexcept { |
||||
|
return std::hash<uint32_t>{}(gu.unwrap()); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <> |
||||
|
struct std::hash<klotski::group::CaseInfo> { |
||||
|
constexpr std::size_t operator()(const klotski::group::CaseInfo &info) const noexcept { |
||||
|
// TODO: perf hash alg |
||||
|
const auto h1 = std::hash<klotski::group::Group>{}(info.group()); |
||||
|
const auto h2 = std::hash<uint32_t>{}(info.case_id()); |
||||
|
return h1 ^ h2; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
} // namespace std |
Loading…
Reference in new issue