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.

>
>
> >
> > 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
> >
>
>

Reply via email to