mirror of https://github.com/dnomd343/klotski.git
				
				
			
				 6 changed files with 57 additions and 59 deletions
			
			
		@ -0,0 +1,28 @@ | 
				
			|||
#pragma once | 
				
			|||
 | 
				
			|||
namespace klotski::group { | 
				
			|||
 | 
				
			|||
KLSK_INLINE_CE uint_fast8_t to_type_id(const int n, const int n_2x1, const int n_1x1) { | 
				
			|||
    KLSK_ASSUME(n >= 0 && n <= 7); | 
				
			|||
    KLSK_ASSUME(n_2x1 >= 0 && n_2x1 <= n); | 
				
			|||
    KLSK_ASSUME(n_1x1 >= 0 && n_1x1 <= (14 - n * 2)); | 
				
			|||
    constexpr int offset[8] = {0, 15, 41, 74, 110, 145, 175, 196}; | 
				
			|||
    return offset[n] + (15 - n * 2) * n_2x1 + n_1x1; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
KLSK_INLINE_CE uint_fast8_t GroupUnion::type_id(const codec::CommonCode common_code) { | 
				
			|||
    const auto range = static_cast<uint32_t>(common_code.unwrap()); | 
				
			|||
    const auto n_1x1 = std::popcount((range >> 1) & range & 0x55555555); | 
				
			|||
    const auto n_2x1 = std::popcount((range >> 1) & ~range & 0x55555555); | 
				
			|||
    return to_type_id(std::popcount(range) - n_1x1 * 2, n_2x1, n_1x1); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
KLSK_INLINE_CE uint_fast8_t GroupUnion::type_id(const codec::RawCode raw_code) { | 
				
			|||
    const auto code = raw_code.unwrap(); | 
				
			|||
    const auto n = std::popcount(((code >> 1) ^ code) & 0x0249249249249249); | 
				
			|||
    const auto n_2x1 = std::popcount((code >> 1) & ~code & 0x0249249249249249); | 
				
			|||
    const auto n_1x1 = std::popcount((code >> 1) & code & 0x0249249249249249) - n - 3; | 
				
			|||
    return to_type_id(n, n_2x1, n_1x1); | 
				
			|||
} | 
				
			|||
 | 
				
			|||
} // namespace klotski::group | 
				
			|||
					Loading…
					
					
				
		Reference in new issue