#pragma once #include "constant/group.h" namespace klotski::cases { // ----------------------------------------------------------------------------------------- // constexpr uint32_t Group::size() const { return GROUP_SIZE[flat_id()]; } constexpr uint32_t Group::type_id() const { return type_id_; } constexpr uint32_t Group::group_id() const { return group_id_; } constexpr uint32_t Group::flat_id() const { return GROUP_OFFSET[type_id_] + group_id_; } // ----------------------------------------------------------------------------------------- // inline Group Group::from_common_code(codec::CommonCode common_code) { return from_raw_code(common_code.to_raw_code()); } inline Group Group::from_short_code(codec::ShortCode short_code) { return from_common_code(short_code.to_common_code()); } // ----------------------------------------------------------------------------------------- // constexpr Group Group::unsafe_create(const uint32_t type_id, const uint32_t group_id) { return std::bit_cast(static_cast(group_id) << 32 | type_id); } constexpr std::optional Group::create(const uint32_t type_id, const uint32_t group_id) { if (type_id < TYPE_ID_LIMIT && group_id < GROUP_NUM[type_id]) { return unsafe_create(type_id, group_id); } return std::nullopt; } // ----------------------------------------------------------------------------------------- // } // namespace klotski::cases