[libcxx-commits] [libcxx] c84136a - [libc++] Inline `text_encoding` alias offset table std::count to 884 (#207471)
via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Jul 27 04:32:24 PDT 2026
Author: William Tran-Viet
Date: 2026-07-27T13:32:19+02:00
New Revision: c84136af3d15893fe3f2bc608280ccaa71e18db1
URL: https://github.com/llvm/llvm-project/commit/c84136af3d15893fe3f2bc608280ccaa71e18db1
DIFF: https://github.com/llvm/llvm-project/commit/c84136af3d15893fe3f2bc608280ccaa71e18db1.diff
LOG: [libc++] Inline `text_encoding` alias offset table std::count to 884 (#207471)
- Add count test to verify the exact number of aliases our table
contains
- Should reduce compile time cost of gathering that count
Added:
libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
libcxx/test/support/test_text_encoding.h
Modified:
libcxx/include/text_encoding
libcxx/test/std/text/text_encoding/text_encoding.ctor/id.pass.cpp
libcxx/test/std/text/text_encoding/text_encoding.ctor/string_view.pass.cpp
libcxx/test/std/text/text_encoding/text_encoding.eq/equal.id.pass.cpp
libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/empty.pass.cpp
libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/operator-bool.pass.cpp
libcxx/test/support/module.modulemap
Removed:
libcxx/test/std/text/text_encoding/test_text_encoding.h
################################################################################
diff --git a/libcxx/include/text_encoding b/libcxx/include/text_encoding
index da39be92c3dfa..6035927091493 100644
--- a/libcxx/include/text_encoding
+++ b/libcxx/include/text_encoding
@@ -68,7 +68,6 @@ struct text_encoding
# if _LIBCPP_STD_VER >= 26
-# include <__algorithm/count.h>
# include <__algorithm/find_if.h>
# include <__algorithm/lower_bound.h>
# include <__cstddef/ptr
diff _t.h>
@@ -623,6 +622,8 @@ public:
static bool environment_is() = delete;
# endif
+ constexpr static unsigned long long __num_aliases = 884;
+
private:
constexpr const __te_data& __get() const { return __entries[__encoding_idx_]; }
@@ -792,8 +793,6 @@ private:
"11\0CP50220\0csCP50220\0";
struct __offset_table {
- constexpr static unsigned long long __num_aliases =
- std::count(__aliases_string, __aliases_string + sizeof(__aliases_string), '\0') + 1;
unsigned short __table[__num_aliases];
};
@@ -805,8 +804,7 @@ private:
unsigned long long __idx = 3;
- for (unsigned short __pos = 0; __pos < sizeof(__aliases_string) - 1 && __idx < __offset_table::__num_aliases;
- __pos++) {
+ for (unsigned short __pos = 0; __pos < sizeof(__aliases_string) - 1 && __idx < __num_aliases; __pos++) {
if (__aliases_string[__pos] == '\0') {
__aliases.__table[__idx++] = __pos + 1;
}
diff --git a/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp b/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
new file mode 100644
index 0000000000000..f63ae503b9de9
--- /dev/null
+++ b/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// <text_encoding>
+
+// REQUIRES: std-at-least-c++26
+// ADDITIONAL_COMPILE_FLAGS(has-fconstexpr-steps): -fconstexpr-steps=40000000
+// ADDITIONAL_COMPILE_FLAGS(has-fconstexpr-ops-limit): -fconstexpr-ops-limit=1000000000
+
+// We implement 882 aliases, test to make sure that number matches with the total alias count.
+#include <cassert>
+#include <ranges>
+#include <text_encoding>
+
+#include "test_text_encoding.h"
+
+constexpr bool test() {
+ long long sum = 0;
+ for (auto& enc : unique_encoding_data) {
+ std::text_encoding te{std::text_encoding::id(enc.mib)};
+
+ sum += std::ranges::size(te.aliases());
+ }
+
+ // +2 reserved as sentinels for id::unknown and id::other
+ // Meaning, our offset table actually contains 884 entries.
+ assert(sum == std::text_encoding::__num_aliases - 2);
+
+ return true;
+}
+
+int main(int, char**) {
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/text/text_encoding/text_encoding.ctor/id.pass.cpp b/libcxx/test/std/text/text_encoding/text_encoding.ctor/id.pass.cpp
index bc3d729e770e3..12c85e6994252 100644
--- a/libcxx/test/std/text/text_encoding/text_encoding.ctor/id.pass.cpp
+++ b/libcxx/test/std/text/text_encoding/text_encoding.ctor/id.pass.cpp
@@ -19,7 +19,7 @@
#include <text_encoding>
#include <type_traits>
-#include "../test_text_encoding.h"
+#include "test_text_encoding.h"
using id = std::text_encoding::id;
diff --git a/libcxx/test/std/text/text_encoding/text_encoding.ctor/string_view.pass.cpp b/libcxx/test/std/text/text_encoding/text_encoding.ctor/string_view.pass.cpp
index c3202f78642f2..032a4d3c08557 100644
--- a/libcxx/test/std/text/text_encoding/text_encoding.ctor/string_view.pass.cpp
+++ b/libcxx/test/std/text/text_encoding/text_encoding.ctor/string_view.pass.cpp
@@ -19,7 +19,7 @@
#include <text_encoding>
#include <type_traits>
-#include "../test_text_encoding.h"
+#include "test_text_encoding.h"
using id = std::text_encoding::id;
diff --git a/libcxx/test/std/text/text_encoding/text_encoding.eq/equal.id.pass.cpp b/libcxx/test/std/text/text_encoding/text_encoding.eq/equal.id.pass.cpp
index 79de614299fa0..c50f539d1527a 100644
--- a/libcxx/test/std/text/text_encoding/text_encoding.eq/equal.id.pass.cpp
+++ b/libcxx/test/std/text/text_encoding/text_encoding.eq/equal.id.pass.cpp
@@ -16,7 +16,7 @@
#include <text_encoding>
#include "test_macros.h"
-#include "../test_text_encoding.h"
+#include "test_text_encoding.h"
using id = std::text_encoding::id;
diff --git a/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/empty.pass.cpp b/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/empty.pass.cpp
index 367f9216ef5ff..3008e2d27927f 100644
--- a/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/empty.pass.cpp
+++ b/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/empty.pass.cpp
@@ -16,7 +16,7 @@
#include <ranges>
#include <text_encoding>
-#include "../../test_text_encoding.h"
+#include "test_text_encoding.h"
using id = std::text_encoding::id;
diff --git a/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/operator-bool.pass.cpp b/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/operator-bool.pass.cpp
index 9d63ff4cdfccd..f122ee5c88e0b 100644
--- a/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/operator-bool.pass.cpp
+++ b/libcxx/test/std/text/text_encoding/text_encoding.members/text_encoding.aliases_view/operator-bool.pass.cpp
@@ -16,7 +16,7 @@
#include <ranges>
#include <text_encoding>
-#include "../../test_text_encoding.h"
+#include "test_text_encoding.h"
using id = std::text_encoding::id;
diff --git a/libcxx/test/support/module.modulemap b/libcxx/test/support/module.modulemap
index 0af147d75ee5d..0d83f08b6dd22 100644
--- a/libcxx/test/support/module.modulemap
+++ b/libcxx/test/support/module.modulemap
@@ -7,5 +7,6 @@ module test {
module double_move_tracker { header "double_move_tracker.h" }
module test_allocator { header "test_allocator.h" }
module test_iterators { header "test_iterators.h" }
+ module test_text_encoding { header "test_text_encoding.h" }
module type_algorithms { header "type_algorithms.h" }
}
diff --git a/libcxx/test/std/text/text_encoding/test_text_encoding.h b/libcxx/test/support/test_text_encoding.h
similarity index 100%
rename from libcxx/test/std/text/text_encoding/test_text_encoding.h
rename to libcxx/test/support/test_text_encoding.h
More information about the libcxx-commits
mailing list