mirror of https://github.com/dnomd343/klotski.git
Dnomd343
1 year ago
16 changed files with 359 additions and 324 deletions
@ -0,0 +1,56 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace klotski { |
||||
|
namespace codec { |
||||
|
|
||||
|
/// Get the original 64-bit code.
|
||||
|
inline uint64_t CommonCode::unwrap() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Implicit conversion to 64-bit code.
|
||||
|
inline CommonCode::operator uint64_t() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Equality comparison between CommonCode and numbers.
|
||||
|
inline bool operator==(CommonCode c1, uint64_t c2) noexcept { |
||||
|
return c1.unwrap() == c2; |
||||
|
} |
||||
|
|
||||
|
/// CommonCode equal comparison implement.
|
||||
|
inline bool operator==(CommonCode c1, CommonCode c2) noexcept { |
||||
|
return c1.unwrap() == c2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// CommonCode less than comparison implement.
|
||||
|
inline bool operator<(CommonCode c1, CommonCode c2) noexcept { |
||||
|
return c1.unwrap() < c2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// CommonCode greater than comparison implement.
|
||||
|
inline bool operator>(CommonCode c1, CommonCode c2) noexcept { |
||||
|
return c1.unwrap() > c2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// CommonCode create without any check.
|
||||
|
inline CommonCode CommonCode::unsafe_create(uint64_t common_code) noexcept { |
||||
|
return *reinterpret_cast<CommonCode*>(&common_code); // init directly
|
||||
|
} |
||||
|
|
||||
|
/// CommonCode create with valid check.
|
||||
|
inline std::optional<CommonCode> CommonCode::create(uint64_t common_code) noexcept { |
||||
|
if (!CommonCode::check(common_code)) { |
||||
|
return std::nullopt; // invalid common code
|
||||
|
} |
||||
|
return CommonCode::unsafe_create(common_code); |
||||
|
} |
||||
|
|
||||
|
/// Output string encoding of CommonCode.
|
||||
|
inline std::ostream& operator<<(std::ostream &out, CommonCode self) { |
||||
|
out << CommonCode::string_encode(self.code_); |
||||
|
return out; |
||||
|
} |
||||
|
|
||||
|
} // namespace codec
|
||||
|
} // namespace klotski
|
@ -0,0 +1,70 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace klotski { |
||||
|
namespace codec { |
||||
|
|
||||
|
/// Get the original 64-bit code.
|
||||
|
inline uint64_t RawCode::unwrap() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Implicit conversion to 64-bit code.
|
||||
|
inline RawCode::operator uint64_t() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Equality comparison between RawCode and numbers.
|
||||
|
inline bool operator==(RawCode r1, uint64_t r2) noexcept { |
||||
|
return r1.unwrap() == r2; |
||||
|
} |
||||
|
|
||||
|
/// RawCode equal comparison implement.
|
||||
|
inline bool operator==(RawCode r1, RawCode r2) noexcept { |
||||
|
return r1.unwrap() == r2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// RawCode create without any check.
|
||||
|
inline RawCode RawCode::unsafe_create(uint64_t raw_code) noexcept { |
||||
|
return *reinterpret_cast<RawCode*>(&raw_code); // init directly
|
||||
|
} |
||||
|
|
||||
|
/// RawCode create with valid check.
|
||||
|
inline std::optional<RawCode> RawCode::create(uint64_t raw_code) noexcept { |
||||
|
if (!RawCode::check(raw_code)) { |
||||
|
return std::nullopt; // invalid raw code
|
||||
|
} |
||||
|
return RawCode::unsafe_create(raw_code); |
||||
|
} |
||||
|
|
||||
|
/// Calculate vertically symmetrical case.
|
||||
|
inline RawCode RawCode::to_vertical_mirror() const noexcept { |
||||
|
return RawCode::unsafe_create(get_vertical_mirror(code_)); |
||||
|
} |
||||
|
|
||||
|
/// Calculate horizontally symmetrical case.
|
||||
|
inline RawCode RawCode::to_horizontal_mirror() const noexcept { |
||||
|
return RawCode::unsafe_create(get_horizontal_mirror(code_)); |
||||
|
} |
||||
|
|
||||
|
/// Determine whether the case is vertically symmetrical.
|
||||
|
inline bool RawCode::is_vertical_mirror() const noexcept { |
||||
|
return check_vertical_mirror(code_); |
||||
|
} |
||||
|
|
||||
|
/// Determine whether the case is horizontally symmetrical.
|
||||
|
inline bool RawCode::is_horizontal_mirror() const noexcept { |
||||
|
return check_horizontal_mirror(code_); |
||||
|
} |
||||
|
|
||||
|
/// Determine whether two cases are vertically symmetrical to each other.
|
||||
|
inline bool RawCode::is_vertical_mirror(RawCode raw_code) const noexcept { |
||||
|
return raw_code.code_ == get_vertical_mirror(code_); |
||||
|
} |
||||
|
|
||||
|
/// Determine whether two cases are horizontally symmetrical to each other.
|
||||
|
inline bool RawCode::is_horizontal_mirror(RawCode raw_code) const noexcept { |
||||
|
return raw_code.code_ == get_horizontal_mirror(code_); |
||||
|
} |
||||
|
|
||||
|
} // namespace codec
|
||||
|
} // namespace klotski
|
@ -0,0 +1,56 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
namespace klotski { |
||||
|
namespace codec { |
||||
|
|
||||
|
/// Get the original 32-bit code.
|
||||
|
inline uint32_t ShortCode::unwrap() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Implicit conversion to 32-bit code.
|
||||
|
inline ShortCode::operator uint32_t() const noexcept { |
||||
|
return code_; |
||||
|
} |
||||
|
|
||||
|
/// Equality comparison between ShortCode and numbers.
|
||||
|
inline bool operator==(ShortCode s1, uint32_t s2) noexcept { |
||||
|
return s1.unwrap() == s2; |
||||
|
} |
||||
|
|
||||
|
/// ShortCode equal comparison implement.
|
||||
|
inline bool operator==(ShortCode s1, ShortCode s2) noexcept { |
||||
|
return s1.unwrap() == s2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// ShortCode less than comparison implement.
|
||||
|
inline bool operator<(ShortCode s1, ShortCode s2) noexcept { |
||||
|
return s1.unwrap() < s2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// ShortCode greater than comparison implement.
|
||||
|
inline bool operator>(ShortCode s1, ShortCode s2) noexcept { |
||||
|
return s1.unwrap() > s2.unwrap(); |
||||
|
} |
||||
|
|
||||
|
/// ShortCode create without any check.
|
||||
|
inline ShortCode ShortCode::unsafe_create(uint32_t short_code) noexcept { |
||||
|
return *reinterpret_cast<ShortCode*>(&short_code); // init directly
|
||||
|
} |
||||
|
|
||||
|
/// ShortCode create with valid check.
|
||||
|
inline std::optional<ShortCode> ShortCode::create(uint32_t short_code) noexcept { |
||||
|
if (!ShortCode::check(short_code)) { |
||||
|
return std::nullopt; // invalid short code
|
||||
|
} |
||||
|
return ShortCode::unsafe_create(short_code); |
||||
|
} |
||||
|
|
||||
|
/// Output string encoding of ShortCode.
|
||||
|
inline std::ostream& operator<<(std::ostream &out, ShortCode self) { |
||||
|
out << ShortCode::string_encode(self.code_); |
||||
|
return out; |
||||
|
} |
||||
|
|
||||
|
} // namespace codec
|
||||
|
} // namespace klotski
|
@ -1,18 +0,0 @@ |
|||||
#pragma once |
|
||||
|
|
||||
/// This is the head index, the offset (0 ~ 29334498) in all cases is obtained
|
|
||||
/// according to the `head` (0 ~ 15). In other words, the short code range can be
|
|
||||
/// obtained according to the position of the 2x2 block.
|
|
||||
|
|
||||
#include <cstdint> |
|
||||
|
|
||||
namespace klotski { |
|
||||
|
|
||||
const uint32_t ALL_CASES_OFFSET[16] = { |
|
||||
0, 2942906, 5203298, 8146204, |
|
||||
8146204, 10468254, 12345199, 14667249, |
|
||||
14667249, 16989299, 18866244, 21188294, |
|
||||
21188294, 24131200, 26391592, 29334498, |
|
||||
}; |
|
||||
|
|
||||
} // namespace klotski
|
|
Loading…
Reference in new issue