From ed8b9eeeeeb98b3c34fc681d543f1ca582058f12 Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Fri, 24 Oct 2025 13:28:29 +0200 Subject: [PATCH] libstdc++: New _IotaArray utility to simplify index pack creation This patch introduces the internal helper type _IotaArray to simplify defining a pack of indices via a structured binding declaration: constexpr auto [...__is] = _IotaArray; _IotaArray is a C-array for lowest overhead in terms of template instantiations. Non-GCC compilers that do not implement __integer_pack have a slightly higher overhead. libstdc++-v3/ChangeLog: * include/bits/utility.h (_IotaArray): Define. * testsuite/ext/iotaarray.cc: New test. Signed-off-by: Matthias Kretz --- libstdc++-v3/include/bits/utility.h | 16 ++++++++++++++++ libstdc++-v3/testsuite/ext/iotaarray.cc | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 libstdc++-v3/testsuite/ext/iotaarray.cc diff --git a/libstdc++-v3/include/bits/utility.h b/libstdc++-v3/include/bits/utility.h index 4e574658eba..96ac69883f1 100644 --- a/libstdc++-v3/include/bits/utility.h +++ b/libstdc++-v3/include/bits/utility.h @@ -172,6 +172,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION using index_sequence_for = make_index_sequence; #endif // __glibcxx_integer_sequence +#if __cpp_structured_bindings >= 202411L +#if __has_builtin(__integer_pack) + template + inline constexpr _Tp + _IotaArray[_Num] = {__integer_pack(_Tp(_Num))...}; +#elif defined __glibcxx_integer_sequence + template > + inline constexpr _Tp + _IotaArray[_Num]; + + template + inline constexpr _Tp + _IotaArray<_Num, _Tp, integer_sequence<_Tp, _Is...>>[_Num] = {_Is...}; +#endif // __integer_pack +#endif // __cpp_structured_bindings >= 202411L + #if __cplusplus >= 201703L struct in_place_t { diff --git a/libstdc++-v3/testsuite/ext/iotaarray.cc b/libstdc++-v3/testsuite/ext/iotaarray.cc new file mode 100644 index 00000000000..b259602c42b --- /dev/null +++ b/libstdc++-v3/testsuite/ext/iotaarray.cc @@ -0,0 +1,20 @@ +// { dg-do compile { target c++26 } } + +#include +#include + +template +void test() +{ + constexpr auto [id0, ...ids] = std::_IotaArray; + static_assert( std::is_same_v ); + static_assert( sizeof...(ids) == N - 1 ); + static_assert( (id0 + ... + ids) == N*(N-1)/2 ); +} + +int main() +{ + test<1>(); + test<4u>(); + test<8ull>(); +} -- 2.47.3