Browse Source

perf: get CommonCode from RangesUnion with index

master
Dnomd343 4 days ago
parent
commit
a5d3237477
  1. 123
      src/core/ranges/internal/ranges.cc
  2. 19
      src/core_test/cases/ranges_union.cc

123
src/core/ranges/internal/ranges.cc

@ -7,8 +7,7 @@ using klotski::cases::RangesUnion;
RangesUnion& RangesUnion::operator+=(const RangesUnion &ranges_union) {
for (const auto head : Heads) {
// (*this)[head] += ranges_union[head];
std::array<Ranges, 16>::operator[](head) += ranges_union.std::array<Ranges, 16>::operator[](head);
ranges(head) += ranges_union.ranges(head);
}
return *this;
}
@ -27,107 +26,29 @@ std::vector<CommonCode> RangesUnion::codes() const {
}
KLSK_INLINE CommonCode RangesUnion::operator[](size_type n) const {
uint64_t head = 0;
while (n >= ranges(head).size()) {
n -= ranges(head).size();
++head;
}
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
// }
//
// uint64_t head = 0;
// while (n >= ranges(head).size()) {
// 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
// }
// KLSK_ASSUME(head < 16);
// return CommonCode::unsafe_create(head << 32 | ranges(head)[n]);
if (n < ranges(0).size()) {
return CommonCode::unsafe_create(ranges(0)[n]);
}
n -= ranges(0).size();
#pragma unroll
for (const uint64_t head : std::to_array({0x1, 0x2, 0x4, 0x5, 0x6, 0x8, 0x9, 0xA, 0xC, 0xD})) {
if (n < ranges(head).size()) {
return CommonCode::unsafe_create(head << 32 | ranges(head)[n]);
}
n -= ranges(head).size();
}
return CommonCode::unsafe_create((uint64_t)0xE << 32 | ranges(0xE)[n]);
// std::unreachable();
}

19
src/core_test/cases/ranges_union.cc

@ -38,3 +38,22 @@ TEST(RangesUnion, append) {
}
EXPECT_EQ(cases, AllCases::instance().fetch());
}
TEST(RangesUnion, index) {
auto &all_cases = AllCases::instance().fetch();
// EXPECT_EQ(all_cases[1035968], 0x03F7FBC40);
// EXPECT_EQ(all_cases[3778871], 0x13CD00030);
// EXPECT_EQ(all_cases[7489354], 0x2CF0F3B30);
// EXPECT_EQ(all_cases[10398492], 0x4FE81C000);
// EXPECT_EQ(all_cases[19091276], 0xA0C4CEF40);
// EXPECT_EQ(all_cases[21373726], 0xC06BF3100);
// EXPECT_EQ(all_cases[27296711], 0xE384E4400);
// EXPECT_EQ(all_cases[28214648], 0xEBBC10800);
const auto codes = all_cases.codes();
for (size_t i = 0; i < codes.size(); ++i) {
EXPECT_EQ(codes[i], all_cases[i]);
}
}

Loading…
Cancel
Save