[libcxx-commits] [libcxx] [libc++] Inline `text_encoding` alias offset table std::count to 884 (PR #207471)

William Tran-Viet via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jul 5 11:54:34 PDT 2026


https://github.com/smallp-o-p updated https://github.com/llvm/llvm-project/pull/207471

>From f1f732efd7ce293a06aea8d331858a686d24cdb6 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Fri, 3 Jul 2026 17:38:47 -0400
Subject: [PATCH 1/2] Inline text_encoding alias offset table std::count to 883

- Add count test to verify the exact number of aliases our table
  contains
---
 libcxx/include/text_encoding                  |  4 +-
 .../text/text_encoding/aliases_count.pass.cpp | 41 +++++++++++++++++++
 .../text_encoding.ctor/id.pass.cpp            |  2 +-
 .../text_encoding.ctor/string_view.pass.cpp   |  2 +-
 .../text_encoding.eq/equal.id.pass.cpp        |  2 +-
 .../text_encoding.aliases_view/empty.pass.cpp |  2 +-
 .../operator-bool.pass.cpp                    |  2 +-
 .../test_text_encoding.h                      |  1 +
 8 files changed, 49 insertions(+), 7 deletions(-)
 create mode 100644 libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
 rename libcxx/test/{std/text/text_encoding => support}/test_text_encoding.h (99%)

diff --git a/libcxx/include/text_encoding b/libcxx/include/text_encoding
index da39be92c3dfa..d6063482be74d 100644
--- a/libcxx/include/text_encoding
+++ b/libcxx/include/text_encoding
@@ -792,8 +792,8 @@ 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;
+    constexpr static unsigned long long __num_aliases = 884;
+    // +2 for id::unknown, id::other sentinels
     unsigned short __table[__num_aliases];
   };
 
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..365c9fe3b9ea3
--- /dev/null
+++ b/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
@@ -0,0 +1,41 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// Our table has 882 aliases exactly, test to make sure that number matches with the total alias count
+// Internally, there are 884 entries with 2 reserved for id::unknown and id::other
+#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());
+  }
+
+  assert(sum == 882);
+
+  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/std/text/text_encoding/test_text_encoding.h b/libcxx/test/support/test_text_encoding.h
similarity index 99%
rename from libcxx/test/std/text/text_encoding/test_text_encoding.h
rename to libcxx/test/support/test_text_encoding.h
index e18bc3aaeea15..5cef8b8ab3d0a 100644
--- a/libcxx/test/std/text/text_encoding/test_text_encoding.h
+++ b/libcxx/test/support/test_text_encoding.h
@@ -295,6 +295,7 @@ constexpr inline enc_data all_encoding_data[] = {
     {3, "csASCII"},
     {3, "iso-ir-6"},
     {3, "us"},
+    {3, "ASCII"}, // extension to match libstdc++
     {4, "ISO-8859-1"},
     {4, "ISO_8859-1:1987"},
     {4, "CP819"},

>From 19e8c4af3cb765190b989ba756fbd84eb3830857 Mon Sep 17 00:00:00 2001
From: William Tran-Viet <wtranviet at proton.me>
Date: Sun, 5 Jul 2026 14:54:20 -0400
Subject: [PATCH 2/2] Address comments

---
 libcxx/include/text_encoding                              | 8 +++-----
 .../test/libcxx/text/text_encoding/aliases_count.pass.cpp | 6 ++++--
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/libcxx/include/text_encoding b/libcxx/include/text_encoding
index d6063482be74d..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/ptrdiff_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 = 884;
-    // +2 for id::unknown, id::other sentinels
     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
index 365c9fe3b9ea3..c5ca1188a0312 100644
--- a/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
+++ b/libcxx/test/libcxx/text/text_encoding/aliases_count.pass.cpp
@@ -13,7 +13,9 @@
 // ADDITIONAL_COMPILE_FLAGS(has-fconstexpr-ops-limit): -fconstexpr-ops-limit=1000000000
 
 // Our table has 882 aliases exactly, test to make sure that number matches with the total alias count
-// Internally, there are 884 entries with 2 reserved for id::unknown and id::other
+// Internally, there are a total of 884 entries in our offset table, 882 for the actual aliases,
+// and +2 reserved as sentinels for id::unknown and id::other
+
 #include <cassert>
 #include <ranges>
 #include <text_encoding>
@@ -28,7 +30,7 @@ constexpr bool test() {
     sum += std::ranges::size(te.aliases());
   }
 
-  assert(sum == 882);
+  assert(sum == std::text_encoding::__num_aliases - 2);
 
   return true;
 }



More information about the libcxx-commits mailing list