On Tue, Sep 2, 2025 at 1:11 PM Tomasz Kaminski <tkami...@redhat.com> wrote:
> > > On Tue, Sep 2, 2025 at 11:44 AM Jonathan Wakely <jwak...@redhat.com> > wrote: > >> On Tue, 2 Sept 2025 at 09:01, Luc Grosheintz wrote: >> > >> > As preparation for implementing std::constant_wrapper that's part of the >> > C++26 version of the <type_traits> header, the two classes _Index_tuple >> > and _Build_index_tuple are moved to <type_traits>. These two helpers are >> > needed by std::constant_wrapper to initialize the elements of one C >> > array with another. >> > >> > Since, <bits/utility.h> already includes <type_traits> this solution >> > avoids creating a very small header file for just these two internal >> > classes. >> >> At some point I'd like to split <type_traits> into smaller pieces. Not >> one header per trait, that would be silly (Boost, I'm looking at you), >> but we don't need e.g. all the complex invoke_result logic in every >> header that wants to use std::decay_t. >> >> But that is a larger project and isn't made any easier or harder by >> this small change. >> >> > This approach doesn't move std::index_sequence and related code >> > to <type_traits> and therefore doesn't change which headers provide >> > user-facing features. >> >> Great, thanks. >> >> OK for trunk. >> > I will merge the patch today. > Pushed to trunk. > >> >> > >> > libstdc++-v3/ChangeLog: >> > >> > * include/bits/utility.h (_Index_tuple): Move to <type_traits>. >> > (_Build_index_tuple): Ditto. >> > * include/std/type_traits (_Index_tuple): Ditto. >> > (_Build_index_tuple): Ditto. >> > >> > Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> >> > --- >> > libstdc++-v3/include/bits/utility.h | 20 -------------------- >> > libstdc++-v3/include/std/type_traits | 22 ++++++++++++++++++++++ >> > 2 files changed, 22 insertions(+), 20 deletions(-) >> > >> > diff --git a/libstdc++-v3/include/bits/utility.h >> b/libstdc++-v3/include/bits/utility.h >> > index 84d25e0c658..4e574658eba 100644 >> > --- a/libstdc++-v3/include/bits/utility.h >> > +++ b/libstdc++-v3/include/bits/utility.h >> > @@ -137,26 +137,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> > using tuple_element_t = typename tuple_element<__i, _Tp>::type; >> > #endif >> > >> > - // Stores a tuple of indices. Used by tuple and pair, and by bind() >> to >> > - // extract the elements in a tuple. >> > - template<size_t... _Indexes> struct _Index_tuple { }; >> > - >> > - // Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. >> > - template<size_t _Num> >> > - struct _Build_index_tuple >> > - { >> > -#if __has_builtin(__make_integer_seq) >> > - template<typename, size_t... _Indices> >> > - using _IdxTuple = _Index_tuple<_Indices...>; >> > - >> > - // Clang defines __make_integer_seq for this purpose. >> > - using __type = __make_integer_seq<_IdxTuple, size_t, _Num>; >> > -#else >> > - // For GCC and other compilers, use __integer_pack instead. >> > - using __type = _Index_tuple<__integer_pack(_Num)...>; >> > -#endif >> > - }; >> > - >> > #ifdef __glibcxx_integer_sequence // C++ >= 14 >> > >> > /// Class template integer_sequence >> > diff --git a/libstdc++-v3/include/std/type_traits >> b/libstdc++-v3/include/std/type_traits >> > index ff23544fbf0..4636457eb5a 100644 >> > --- a/libstdc++-v3/include/std/type_traits >> > +++ b/libstdc++-v3/include/std/type_traits >> > @@ -4280,6 +4280,28 @@ template<typename _Ret, typename _Fn, >> typename... _Args> >> > >> > #endif // C++2a >> > >> > +#if __cplusplus >= 201103L >> > + // Stores a tuple of indices. Used by tuple and pair, and by bind() >> to >> > + // extract the elements in a tuple. >> > + template<size_t... _Indexes> struct _Index_tuple { }; >> > + >> > + // Builds an _Index_tuple<0, 1, 2, ..., _Num-1>. >> > + template<size_t _Num> >> > + struct _Build_index_tuple >> > + { >> > +#if __has_builtin(__make_integer_seq) >> > + template<typename, size_t... _Indices> >> > + using _IdxTuple = _Index_tuple<_Indices...>; >> > + >> > + // Clang defines __make_integer_seq for this purpose. >> > + using __type = __make_integer_seq<_IdxTuple, size_t, _Num>; >> > +#else >> > + // For GCC and other compilers, use __integer_pack instead. >> > + using __type = _Index_tuple<__integer_pack(_Num)...>; >> > +#endif >> > + }; >> > +#endif // C++11 >> > + >> > /// @} group metaprogramming >> > >> > _GLIBCXX_END_NAMESPACE_VERSION >> > -- >> > 2.51.0 >> > >> >>