diff --git a/src/core/group/group.h b/src/core/group/group.h index 991eb11..e232c70 100644 --- a/src/core/group/group.h +++ b/src/core/group/group.h @@ -83,150 +83,153 @@ class Group; // TODO: add constexpr class GroupUnion { public: - GroupUnion() = delete; + GroupUnion() = delete; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get the original type id. - [[nodiscard]] constexpr uint32_t unwrap() const; + /// Get the original type id. + [[nodiscard]] constexpr uint32_t unwrap() const; - /// Create GroupUnion without any check. - static constexpr GroupUnion unsafe_create(uint32_t type_id); + /// Create GroupUnion without any check. + static constexpr GroupUnion unsafe_create(uint32_t type_id); - /// Create GroupUnion with validity check. - static constexpr std::optional create(uint32_t type_id); + /// Create GroupUnion with validity check. + static constexpr std::optional create(uint32_t type_id); - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get the number of cases contained. - [[nodiscard]] constexpr uint32_t size() const; + /// Get the number of cases contained. + [[nodiscard]] constexpr uint32_t size() const; - /// Get the number of groups contained. - [[nodiscard]] constexpr uint32_t group_num() const; + /// Get the number of groups contained. + [[nodiscard]] constexpr uint32_t group_num() const; - /// Get the upper limit of the group size. - [[nodiscard]] constexpr uint32_t max_group_size() const; + /// Get the upper limit of the group size. + [[nodiscard]] constexpr uint32_t max_group_size() const; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get all cases under the current type id. - [[nodiscard]] RangesUnion cases() const; + /// Get all cases under the current type id. + [[nodiscard]] RangesUnion cases() const; - /// Get all groups under the current type id. - [[nodiscard]] std::vector groups() const; + /// Get all groups under the current type id. + [[nodiscard]] std::vector groups() const; - /// Get the group instance with the specified group id. - [[nodiscard]] std::optional group(uint32_t group_id) const; + /// Get the group instance with the specified group id. + [[nodiscard]] std::optional group(uint32_t group_id) const; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Create GroupUnion from RawCode. - static GroupUnion from_raw_code(codec::RawCode raw_code); + /// Create GroupUnion from RawCode. + static GroupUnion from_raw_code(codec::RawCode raw_code); - /// Create GroupUnion from ShortCode. - static GroupUnion from_short_code(codec::ShortCode short_code); + /// Create GroupUnion from ShortCode. + static GroupUnion from_short_code(codec::ShortCode short_code); - /// Create GroupUnion from CommonCode. - static GroupUnion from_common_code(codec::CommonCode common_code); + /// Create GroupUnion from CommonCode. + static GroupUnion from_common_code(codec::CommonCode common_code); - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // private: - uint32_t type_id_; + uint32_t type_id_; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get the type id of RawCode. - static KLSK_INLINE uint32_t type_id(codec::RawCode raw_code); + /// Get the type id of RawCode. + static KLSK_INLINE uint32_t type_id(codec::RawCode raw_code); - /// Get the type id of CommonCode. - static KLSK_INLINE uint32_t type_id(codec::CommonCode common_code); + /// Get the type id of CommonCode. + static KLSK_INLINE uint32_t type_id(codec::CommonCode common_code); - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // }; class Group { public: - Group() = delete; + Group() = delete; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get the original type id. - [[nodiscard]] uint32_t type_id() const; + /// Get the original type id. + [[nodiscard]] uint32_t type_id() const; - /// Get the original group id. - [[nodiscard]] uint32_t group_id() const; + /// Get the original group id. + [[nodiscard]] uint32_t group_id() const; - /// Create Group without any check. - static Group unsafe_create(uint32_t type_id, uint32_t group_id); + /// Create Group without any check. + static Group unsafe_create(uint32_t type_id, uint32_t group_id); - /// Create Group with validity check. - static std::optional create(uint32_t type_id, uint32_t group_id); + /// Create Group with validity check. + static std::optional create(uint32_t type_id, uint32_t group_id); - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Get the number of cases contained. - [[nodiscard]] uint32_t size() const; + /// Get the number of cases contained. + [[nodiscard]] uint32_t size() const; - /// Get all cases under the current group. - [[nodiscard]] RangesUnion cases() const; + /// Get all cases under the current group. + [[nodiscard]] RangesUnion cases() const; - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // - /// Create Group from RawCode. - static Group from_raw_code(codec::RawCode raw_code); + /// Create Group from RawCode. + static Group from_raw_code(codec::RawCode raw_code); - /// Create Group from ShortCode. - static Group from_short_code(codec::ShortCode short_code); + /// Create Group from ShortCode. + static Group from_short_code(codec::ShortCode short_code); - /// Create Group from CommonCode. - static Group from_common_code(codec::CommonCode common_code); + /// Create Group from CommonCode. + static Group from_common_code(codec::CommonCode common_code); - // ------------------------------------------------------------------------------------- // + // ------------------------------------------------------------------------------------- // private: - uint32_t type_id_; - uint32_t group_id_; + uint32_t type_id_; + uint32_t group_id_; - [[nodiscard]] uint32_t flat_id() const; + [[nodiscard]] uint32_t flat_id() const; public: - static std::vector extend(codec::RawCode raw_code, uint32_t reserve = 0); + /// Spawn all the unsorted codes of the current group. + static std::vector extend(codec::RawCode raw_code, uint32_t reserve = 0); }; class GroupCases { public: - struct info_t { - uint16_t type_id; - uint16_t group_id; - uint32_t case_id; + struct info_t { + uint16_t type_id; + uint16_t group_id; + uint32_t case_id; - // TODO: should we keep it valid? (convert without check) - }; + // TODO: should we keep it valid? (convert without check) + }; - void build(); + /// Execute the build process. + void build(); - void build_async(Executor &&executor, Notifier &¬ifier); + /// Execute the build process without blocking. + void build_async(Executor &&executor, Notifier &&callback); - /// Get the CommonCode using the group info. - // static codec::CommonCode parse(const info_t &info); + static info_t to_info_t(codec::ShortCode short_code); - /// Get group info according to specified case. - // static info_t encode(const codec::RawCode &raw_code); - // static info_t encode(const codec::CommonCode &common_code); + static codec::CommonCode from_info_t(info_t info); - static info_t to_info_t(codec::ShortCode short_code); + /// Get the CommonCode using the group info. + // static codec::CommonCode parse(const info_t &info); - static codec::CommonCode from_info_t(info_t info); + /// Get group info according to specified case. + // static info_t encode(const codec::RawCode &raw_code); + // static info_t encode(const codec::CommonCode &common_code); private: - bool available_ = false; - std::mutex building_ {}; + bool available_ = false; + std::mutex building_ {}; - // static codec::CommonCode fast_decode(const info_t &info); - // static info_t fast_encode(const codec::CommonCode &common_code); + // static codec::CommonCode fast_decode(const info_t &info); + // static info_t fast_encode(const codec::CommonCode &common_code); - KLSK_INSTANCE(GroupCases) + KLSK_INSTANCE(GroupCases) }; } // namespace klotski::cases diff --git a/src/core/group/internal/group_cases.cc b/src/core/group/internal/group_cases.cc index b293f25..6646f4b 100644 --- a/src/core/group/internal/group_cases.cc +++ b/src/core/group/internal/group_cases.cc @@ -1,4 +1,5 @@ #include +#include #include "group/group.h"