From 860e4027f2422b1d2ba25b2e249293103eee14e3 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sun, 10 Nov 2024 18:23:01 +0800 Subject: [PATCH] perf: get CommonCode from RangesUnion with index --- src/core/ranges/internal/ranges.cc | 123 +++++----------------------- src/core_test/cases/ranges_union.cc | 19 +++++ 2 files changed, 41 insertions(+), 101 deletions(-) diff --git a/src/core/ranges/internal/ranges.cc b/src/core/ranges/internal/ranges.cc index 4319a7f..2392e66 100644 --- a/src/core/ranges/internal/ranges.cc +++ b/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::operator[](head) += ranges_union.std::array::operator[](head); + ranges(head) += ranges_union.ranges(head); } return *this; } @@ -27,107 +26,29 @@ std::vector RangesUnion::codes() const { } KLSK_INLINE CommonCode RangesUnion::operator[](size_type n) const { - uint64_t head = 0; - while (n >= ranges(head).size()) { + // 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]); + + 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(); - ++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 - // } - // - // 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 - // } + return CommonCode::unsafe_create((uint64_t)0xE << 32 | ranges(0xE)[n]); + + // std::unreachable(); } diff --git a/src/core_test/cases/ranges_union.cc b/src/core_test/cases/ranges_union.cc index dc9e0c5..7d44a15 100644 --- a/src/core_test/cases/ranges_union.cc +++ b/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]); + } + +}