华容道高性能计算引擎
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.

51 lines
1.4 KiB

#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<Group>(static_cast<uint64_t>(group_id) << 32 | type_id);
}
constexpr std::optional<Group> 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