| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -64,13 +64,12 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#pragma once | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <string> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <ostream> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <cstdint> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <optional> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					namespace klotski::codec { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "common_code/common_code_fwd.h" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					class CommonCode; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					namespace klotski::codec { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					class RawCode { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					public: | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -79,21 +78,21 @@ public: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    RawCode() = delete; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Construct RawCode from CommonCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    explicit RawCode(CommonCode common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    explicit constexpr RawCode(CommonCode common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Create RawCode without any check.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr RawCode unsafe_create(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Create RawCode with validity check.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static std::optional<RawCode> create(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr std::optional<RawCode> create(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Explicit conversion to u64 code.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    explicit operator uint64_t() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    explicit constexpr operator uint64_t() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Check the validity of the original RawCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static bool check(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr bool check(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#ifndef KLSK_NDEBUG | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Output string encoding of RawCode only for debug.
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -106,15 +105,15 @@ public: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr uint64_t unwrap() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Convert RawCode to CommonCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] CommonCode to_common_code() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr CommonCode to_common_code() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Create RawCode from CommonCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static RawCode from_common_code(CommonCode common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr RawCode from_common_code(CommonCode common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Create RawCode from CommonCode in u64.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static std::optional<RawCode> from_common_code(uint64_t common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr std::optional<RawCode> from_common_code(uint64_t common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Create RawCode from CommonCode in string form.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static std::optional<RawCode> from_common_code(std::string_view common_code); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -122,16 +121,16 @@ public: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Whether the layout is vertically symmetrical.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] bool is_vertical_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr bool is_vertical_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Whether the layout is horizontally symmetrical.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] bool is_horizontal_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr bool is_horizontal_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Calculate the vertically symmetrical klotski layout.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] RawCode to_vertical_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr RawCode to_vertical_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Calculate the horizontally symmetrical klotski layout.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] RawCode to_horizontal_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    [[nodiscard]] constexpr RawCode to_horizontal_mirror() const; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -151,28 +150,32 @@ private: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Compact RawCode as CommonCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static uint64_t compact(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr uint64_t compact(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Extract CommonCode as RawCode.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static uint64_t extract(uint64_t common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr uint64_t extract(uint64_t common_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Check the horizontally symmetrical.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static bool check_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr bool check_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Get the vertically symmetrical layout.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static uint64_t get_vertical_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr uint64_t get_vertical_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    /// Get the horizontally symmetrical layout.
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static uint64_t get_horizontal_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    static constexpr uint64_t get_horizontal_mirror(uint64_t raw_code); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // ------------------------------------------------------------------------------------- //
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static_assert(sizeof(RawCode) == 8); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static_assert(std::is_standard_layout_v<RawCode>); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					static_assert(std::is_trivially_copyable_v<RawCode>); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} // namespace klotski::codec
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "internal/raw_code.inl" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "internal/convert.inl" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "internal/mirror.inl" | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include "internal/check.inl" | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
					 | 
				
				 | 
				
					
  |