华容道高性能计算引擎
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.0 KiB

#pragma once
#include "constant/group_union.h"
namespace klotski::cases {
// ------------------------------------------------------------------------------------- //
inline constexpr uint32_t GroupUnion::unwrap() const {
return type_id_;
}
inline constexpr GroupUnion GroupUnion::unsafe_create(const uint32_t type_id) {
return std::bit_cast<GroupUnion>(type_id);
}
inline constexpr std::optional<GroupUnion> GroupUnion::create(const uint32_t type_id) {
if (type_id < TYPE_ID_LIMIT) {
return unsafe_create(type_id);
}
return std::nullopt;
}
// ------------------------------------------------------------------------------------- //
inline constexpr uint32_t GroupUnion::size() const {
return GROUP_UNION_SIZE[type_id_];
}
inline constexpr uint32_t GroupUnion::group_num() const {
return GROUP_NUM[type_id_];
}
inline constexpr uint32_t GroupUnion::max_group_size() const {
return MAX_GROUP_SIZE[type_id_];
}
inline std::vector<Group> GroupUnion::groups() const {
// TODO: using `std::iota` helper
std::vector<Group> groups;
groups.reserve(group_num());
for (uint32_t group_id = 0; group_id < group_num(); ++group_id) {
groups.emplace_back(Group::unsafe_create(type_id_, group_id));
}
return groups;
}
inline std::optional<Group> GroupUnion::group(const uint32_t group_id) const {
if (group_id < group_num()) {
return Group::unsafe_create(type_id_, group_id);
}
return std::nullopt;
}
// ------------------------------------------------------------------------------------- //
inline GroupUnion GroupUnion::from_raw_code(const codec::RawCode raw_code) {
return unsafe_create(type_id(raw_code));
}
inline GroupUnion GroupUnion::from_short_code(const codec::ShortCode short_code) {
return from_common_code(short_code.to_common_code());
}
inline GroupUnion GroupUnion::from_common_code(const codec::CommonCode common_code) {
return unsafe_create(type_id(common_code));
}
// ------------------------------------------------------------------------------------- //
} // namespace klotski::cases