mirror of https://github.com/dnomd343/klotski.git
				
				
			
				 23 changed files with 242 additions and 237 deletions
			
			
		| @ -1,56 +0,0 @@ | |||||
| #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
 |  | ||||
| @ -0,0 +1,120 @@ | |||||
|  | #pragma once | ||||
|  | 
 | ||||
|  | #include <bit> | ||||
|  | 
 | ||||
|  | #include "common_code/common_code.h" | ||||
|  | 
 | ||||
|  | namespace klotski::codec { | ||||
|  | 
 | ||||
|  | // ------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | inline ShortCode::ShortCode(const CommonCode common_code) { | ||||
|  |     // TODO: test the affect of CPU branch prediction. | ||||
|  |     if (cases::AllCases::instance().is_available()) { | ||||
|  |         code_ = fast_encode(common_code.unwrap()); | ||||
|  |     } else { | ||||
|  |         code_ = tiny_encode(common_code.unwrap()); | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline ShortCode ShortCode::unsafe_create(const uint32_t short_code) { | ||||
|  |     return std::bit_cast<ShortCode>(short_code); // init directly | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline std::optional<ShortCode> ShortCode::create(const uint32_t short_code) { | ||||
|  |     if (!check(short_code)) { | ||||
|  |         return std::nullopt; // invalid short code | ||||
|  |     } | ||||
|  |     return unsafe_create(short_code); | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | inline ShortCode::operator uint32_t() const { | ||||
|  |     return code_; | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline bool ShortCode::check(const uint32_t short_code) { | ||||
|  |     return short_code < SHORT_CODE_LIMIT; // [0, SHORT_CODE_LIMIT) | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline void ShortCode::speed_up(const bool fast_mode) { | ||||
|  |     if (fast_mode) { | ||||
|  |         cases::AllCases::instance().build(); | ||||
|  |     } else { | ||||
|  |         cases::BasicRanges::instance().build(); | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | #ifndef KLSK_NDEBUG | ||||
|  | inline std::ostream& operator<<(std::ostream &out, const ShortCode self) { | ||||
|  |     out << ShortCode::string_encode(self.code_); | ||||
|  |     return out; | ||||
|  | } | ||||
|  | #endif | ||||
|  | 
 | ||||
|  | // ----------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | inline uint32_t ShortCode::unwrap() const { | ||||
|  |     return code_; | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline std::string ShortCode::to_string() const { | ||||
|  |     return string_encode(code_); | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline CommonCode ShortCode::to_common_code() const { | ||||
|  |     // TODO: test the affect of CPU branch prediction. | ||||
|  |     if (cases::AllCases::instance().is_available()) { | ||||
|  |         return CommonCode::unsafe_create(fast_decode(code_)); | ||||
|  |     } | ||||
|  |     return CommonCode::unsafe_create(tiny_decode(code_)); | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ----------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | inline std::optional<ShortCode> ShortCode::from_string(const std::string &short_code) { | ||||
|  |     return string_decode(short_code).transform(unsafe_create); | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ----------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | inline ShortCode ShortCode::from_common_code(const CommonCode common_code) { | ||||
|  |     return common_code.to_short_code(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline std::optional<ShortCode> ShortCode::from_common_code(const uint64_t common_code) { | ||||
|  |     const auto convert = [](const CommonCode code) { | ||||
|  |         return code.to_short_code(); | ||||
|  |     }; | ||||
|  |     return CommonCode::create(common_code).transform(convert); | ||||
|  | } | ||||
|  | 
 | ||||
|  | inline std::optional<ShortCode> ShortCode::from_common_code(const std::string &common_code) { | ||||
|  |     const auto convert = [](const CommonCode code) { | ||||
|  |         return code.to_short_code(); | ||||
|  |     }; | ||||
|  |     return CommonCode::from_string(common_code).transform(convert); | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | constexpr auto operator==(const ShortCode &lhs, const uint32_t rhs) { | ||||
|  |     return lhs.code_ == rhs; | ||||
|  | } | ||||
|  | 
 | ||||
|  | constexpr auto operator<=>(const ShortCode &lhs, const uint32_t rhs) { | ||||
|  |     return lhs.code_ <=> rhs; | ||||
|  | } | ||||
|  | 
 | ||||
|  | constexpr auto operator==(const ShortCode &lhs, const ShortCode &rhs) { | ||||
|  |     return lhs.code_ == rhs.code_; | ||||
|  | } | ||||
|  | 
 | ||||
|  | constexpr auto operator<=>(const ShortCode &lhs, const ShortCode &rhs) { | ||||
|  |     return lhs.code_ <=> rhs.code_; | ||||
|  | } | ||||
|  | 
 | ||||
|  | // ----------------------------------------------------------------------------------------- // | ||||
|  | 
 | ||||
|  | } // namespace klotski::codec | ||||
| @ -1,24 +0,0 @@ | |||||
| #include "all_cases.h" |  | ||||
| #include "short_code.h" |  | ||||
| 
 |  | ||||
| using klotski::cases::AllCases; |  | ||||
| using klotski::cases::BasicRanges; |  | ||||
| 
 |  | ||||
| namespace klotski { |  | ||||
| namespace codec { |  | ||||
| 
 |  | ||||
| /// Check the validity of the original ShortCode.
 |  | ||||
| bool ShortCode::check(uint32_t short_code) noexcept { |  | ||||
|     return short_code < SHORT_CODE_LIMIT; // 0 ~ (SHORT_CODE_LIMIT - 1)
 |  | ||||
| } |  | ||||
| 
 |  | ||||
| void ShortCode::speed_up(bool fast_mode) noexcept { |  | ||||
|     if (fast_mode) { |  | ||||
|         AllCases::instance().build(); |  | ||||
|     } else { |  | ||||
|         BasicRanges::instance().build(); |  | ||||
|     } |  | ||||
| } |  | ||||
| 
 |  | ||||
| } // namespace codec
 |  | ||||
| } // namespace klotski
 |  | ||||
| @ -1,71 +0,0 @@ | |||||
| #include "short_code.h" |  | ||||
| #include "common_code.h" |  | ||||
| 
 |  | ||||
| using klotski::cases::AllCases; |  | ||||
| 
 |  | ||||
| namespace klotski { |  | ||||
| namespace codec { |  | ||||
| 
 |  | ||||
| // ----------------------------------------------------------------------------------------- //
 |  | ||||
| 
 |  | ||||
| ShortCode::ShortCode(CommonCode common_code) noexcept { |  | ||||
|     if (AllCases::instance().is_available()) { |  | ||||
|         code_ = fast_encode(common_code.unwrap()); |  | ||||
|     } else { |  | ||||
|         code_ = tiny_encode(common_code.unwrap()); |  | ||||
|     } |  | ||||
| } |  | ||||
| 
 |  | ||||
| // ----------------------------------------------------------------------------------------- //
 |  | ||||
| 
 |  | ||||
| std::string ShortCode::to_string() const noexcept { |  | ||||
|     return string_encode(code_); |  | ||||
| } |  | ||||
| 
 |  | ||||
| CommonCode ShortCode::to_common_code() const noexcept { |  | ||||
|     if (AllCases::instance().is_available()) { |  | ||||
|         return CommonCode::unsafe_create(fast_decode(code_)); |  | ||||
|     } |  | ||||
|     return CommonCode::unsafe_create(tiny_decode(code_)); |  | ||||
| } |  | ||||
| 
 |  | ||||
| // ----------------------------------------------------------------------------------------- //
 |  | ||||
| 
 |  | ||||
| std::optional<ShortCode> ShortCode::from_string(std::string &&short_code) noexcept { |  | ||||
|     return ShortCode::from_string(short_code); |  | ||||
| } |  | ||||
| 
 |  | ||||
| std::optional<ShortCode> ShortCode::from_string(const std::string &short_code) noexcept { |  | ||||
|     return ShortCode::string_decode(short_code).transform([](auto code) { |  | ||||
|         return ShortCode::unsafe_create(code); |  | ||||
|     }); |  | ||||
| } |  | ||||
| 
 |  | ||||
| // ----------------------------------------------------------------------------------------- //
 |  | ||||
| 
 |  | ||||
| ShortCode ShortCode::from_common_code(CommonCode common_code) noexcept { |  | ||||
|     return common_code.to_short_code(); |  | ||||
| } |  | ||||
| 
 |  | ||||
| std::optional<ShortCode> ShortCode::from_common_code(uint64_t common_code) noexcept { |  | ||||
|     return CommonCode::create(common_code).transform([](auto common_code) { |  | ||||
|         return common_code.to_short_code(); |  | ||||
|     }); |  | ||||
| } |  | ||||
| 
 |  | ||||
| std::optional<ShortCode> ShortCode::from_common_code(std::string &&common_code) noexcept { |  | ||||
|     return CommonCode::from_string(std::move(common_code)).transform([](auto common_code) { |  | ||||
|         return common_code.to_short_code(); |  | ||||
|     }); |  | ||||
| } |  | ||||
| 
 |  | ||||
| std::optional<ShortCode> ShortCode::from_common_code(const std::string &common_code) noexcept { |  | ||||
|     return CommonCode::from_string(common_code).transform([](auto common_code) { |  | ||||
|         return common_code.to_short_code(); |  | ||||
|     }); |  | ||||
| } |  | ||||
| 
 |  | ||||
| // ----------------------------------------------------------------------------------------- //
 |  | ||||
| 
 |  | ||||
| } // namespace codec
 |  | ||||
| } // namespace klotski
 |  | ||||
					Loading…
					
					
				
		Reference in new issue