|
|
@ -5,24 +5,8 @@ using klotski::cases::Ranges; |
|
|
|
using klotski::codec::CommonCode; |
|
|
|
using klotski::cases::RangesUnion; |
|
|
|
|
|
|
|
static constexpr auto heads = std::to_array<uint64_t>({ |
|
|
|
0x0, 0x1, 0x2, 0x4, 0x5, 0x6, |
|
|
|
0x8, 0x9, 0xA, 0xC, 0xD, 0xE, |
|
|
|
}); |
|
|
|
|
|
|
|
void Ranges::reverse() { |
|
|
|
for (auto &x : *this) { |
|
|
|
x = range_reverse(x); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Ranges& Ranges::operator+=(const Ranges &ranges) { |
|
|
|
this->insert(this->end(), ranges.begin(), ranges.end()); |
|
|
|
return *this; |
|
|
|
} |
|
|
|
|
|
|
|
RangesUnion& RangesUnion::operator+=(const RangesUnion &ranges_union) { |
|
|
|
for (const auto head : heads) { |
|
|
|
for (const auto head : Heads) { |
|
|
|
// (*this)[head] += ranges_union[head];
|
|
|
|
std::array<Ranges, 16>::operator[](head) += ranges_union.std::array<Ranges, 16>::operator[](head); |
|
|
|
} |
|
|
@ -32,7 +16,7 @@ RangesUnion& RangesUnion::operator+=(const RangesUnion &ranges_union) { |
|
|
|
std::vector<CommonCode> RangesUnion::codes() const { |
|
|
|
std::vector<CommonCode> codes; |
|
|
|
codes.reserve(size()); |
|
|
|
for (const auto head : heads) { |
|
|
|
for (const auto head : Heads) { |
|
|
|
// for (const auto range : (*this)[head]) {
|
|
|
|
for (const auto range : ranges(head)) { |
|
|
|
codes.emplace_back(CommonCode::unsafe_create(head << 32 | range)); |
|
|
@ -42,25 +26,108 @@ std::vector<CommonCode> RangesUnion::codes() const { |
|
|
|
return codes; |
|
|
|
} |
|
|
|
|
|
|
|
// TODO: move to `.inl` file
|
|
|
|
size_t RangesUnion::size() const { |
|
|
|
size_type size = 0; |
|
|
|
for (const auto head : heads) { |
|
|
|
size += std::array<Ranges, 16>::operator[](head).size(); |
|
|
|
// size += (*this)[head].size();
|
|
|
|
KLSK_INLINE CommonCode RangesUnion::operator[](size_type n) const { |
|
|
|
uint64_t head = 0; |
|
|
|
while (n >= ranges(head).size()) { |
|
|
|
n -= ranges(head).size(); |
|
|
|
++head; |
|
|
|
} |
|
|
|
return size; |
|
|
|
} |
|
|
|
KLSK_ASSUME(head < 16); |
|
|
|
return CommonCode::unsafe_create(head << 32 | ranges(head)[n]); |
|
|
|
|
|
|
|
// size_t head = 0;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return CommonCode::unsafe_create(head << 32 | ranges(head)[n]); // 0
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 1
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 2
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 3
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 4
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 5
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 6
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 7
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 8
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 9
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 10
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 11
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 12
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 13
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 14
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// n -= ranges(head).size();
|
|
|
|
// ++head;
|
|
|
|
// if (n < ranges(head).size()) {
|
|
|
|
// return ranges(head)[n]; // 15
|
|
|
|
// }
|
|
|
|
|
|
|
|
uint32_t RangesUnion::operator[](size_type index) const { |
|
|
|
size_t head = 0; |
|
|
|
for (;;) { |
|
|
|
if (index >= std::array<Ranges, 16>::operator[](head).size()) { |
|
|
|
index -= std::array<Ranges, 16>::operator[](head).size(); |
|
|
|
++head; |
|
|
|
} else { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return std::array<Ranges, 16>::operator[](head)[index]; |
|
|
|
} |
|
|
|