Home | History | Annotate | Line # | Download | only in std
      1      1.1  mrg // <variant> -*- C++ -*-
      2      1.1  mrg 
      3  1.1.1.5  mrg // Copyright (C) 2016-2022 Free Software Foundation, Inc.
      4      1.1  mrg //
      5      1.1  mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6      1.1  mrg // software; you can redistribute it and/or modify it under the
      7      1.1  mrg // terms of the GNU General Public License as published by the
      8      1.1  mrg // Free Software Foundation; either version 3, or (at your option)
      9      1.1  mrg // any later version.
     10      1.1  mrg 
     11      1.1  mrg // This library is distributed in the hope that it will be useful,
     12      1.1  mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1  mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14      1.1  mrg // GNU General Public License for more details.
     15      1.1  mrg 
     16      1.1  mrg // Under Section 7 of GPL version 3, you are granted additional
     17      1.1  mrg // permissions described in the GCC Runtime Library Exception, version
     18      1.1  mrg // 3.1, as published by the Free Software Foundation.
     19      1.1  mrg 
     20      1.1  mrg // You should have received a copy of the GNU General Public License and
     21      1.1  mrg // a copy of the GCC Runtime Library Exception along with this program;
     22      1.1  mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23      1.1  mrg // <http://www.gnu.org/licenses/>.
     24      1.1  mrg 
     25      1.1  mrg /** @file variant
     26  1.1.1.4  mrg  *  This is the `<variant>` C++ Library header.
     27      1.1  mrg  */
     28      1.1  mrg 
     29      1.1  mrg #ifndef _GLIBCXX_VARIANT
     30      1.1  mrg #define _GLIBCXX_VARIANT 1
     31      1.1  mrg 
     32      1.1  mrg #pragma GCC system_header
     33      1.1  mrg 
     34      1.1  mrg #if __cplusplus >= 201703L
     35      1.1  mrg 
     36  1.1.1.5  mrg #include <initializer_list>
     37      1.1  mrg #include <type_traits>
     38      1.1  mrg #include <bits/enable_special_members.h>
     39  1.1.1.5  mrg #include <bits/exception_defines.h>
     40      1.1  mrg #include <bits/functional_hash.h>
     41      1.1  mrg #include <bits/invoke.h>
     42      1.1  mrg #include <bits/parse_numbers.h>
     43      1.1  mrg #include <bits/stl_iterator_base_types.h>
     44      1.1  mrg #include <bits/stl_iterator_base_funcs.h>
     45      1.1  mrg #include <bits/stl_construct.h>
     46  1.1.1.5  mrg #include <bits/utility.h> // in_place_index_t
     47  1.1.1.5  mrg #if __cplusplus >= 202002L
     48  1.1.1.4  mrg # include <compare>
     49  1.1.1.4  mrg #endif
     50      1.1  mrg 
     51  1.1.1.5  mrg #if __cpp_concepts >= 202002L && __cpp_constexpr >= 201811L
     52  1.1.1.5  mrg // P2231R1 constexpr needs constexpr unions and constrained destructors.
     53  1.1.1.5  mrg # define __cpp_lib_variant 202106L
     54  1.1.1.5  mrg #else
     55  1.1.1.5  mrg # include <ext/aligned_buffer.h> // Use __aligned_membuf instead of union.
     56  1.1.1.5  mrg # define __cpp_lib_variant 202102L
     57  1.1.1.5  mrg #endif
     58  1.1.1.5  mrg 
     59      1.1  mrg namespace std _GLIBCXX_VISIBILITY(default)
     60      1.1  mrg {
     61  1.1.1.2  mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     62  1.1.1.2  mrg 
     63      1.1  mrg   template<typename... _Types> class tuple;
     64      1.1  mrg   template<typename... _Types> class variant;
     65      1.1  mrg   template <typename> struct hash;
     66      1.1  mrg 
     67      1.1  mrg   template<typename _Variant>
     68      1.1  mrg     struct variant_size;
     69      1.1  mrg 
     70      1.1  mrg   template<typename _Variant>
     71      1.1  mrg     struct variant_size<const _Variant> : variant_size<_Variant> {};
     72      1.1  mrg 
     73      1.1  mrg   template<typename _Variant>
     74      1.1  mrg     struct variant_size<volatile _Variant> : variant_size<_Variant> {};
     75      1.1  mrg 
     76      1.1  mrg   template<typename _Variant>
     77      1.1  mrg     struct variant_size<const volatile _Variant> : variant_size<_Variant> {};
     78      1.1  mrg 
     79      1.1  mrg   template<typename... _Types>
     80      1.1  mrg     struct variant_size<variant<_Types...>>
     81      1.1  mrg     : std::integral_constant<size_t, sizeof...(_Types)> {};
     82      1.1  mrg 
     83      1.1  mrg   template<typename _Variant>
     84      1.1  mrg     inline constexpr size_t variant_size_v = variant_size<_Variant>::value;
     85      1.1  mrg 
     86  1.1.1.5  mrg   template<typename... _Types>
     87  1.1.1.5  mrg     inline constexpr size_t
     88  1.1.1.5  mrg     variant_size_v<variant<_Types...>> = sizeof...(_Types);
     89  1.1.1.5  mrg 
     90  1.1.1.5  mrg   template<typename... _Types>
     91  1.1.1.5  mrg     inline constexpr size_t
     92  1.1.1.5  mrg     variant_size_v<const variant<_Types...>> = sizeof...(_Types);
     93  1.1.1.5  mrg 
     94      1.1  mrg   template<size_t _Np, typename _Variant>
     95      1.1  mrg     struct variant_alternative;
     96      1.1  mrg 
     97  1.1.1.5  mrg   template<size_t _Np, typename... _Types>
     98  1.1.1.5  mrg     struct variant_alternative<_Np, variant<_Types...>>
     99  1.1.1.5  mrg     {
    100  1.1.1.5  mrg       static_assert(_Np < sizeof...(_Types));
    101      1.1  mrg 
    102  1.1.1.5  mrg       using type = typename _Nth_type<_Np, _Types...>::type;
    103  1.1.1.5  mrg     };
    104      1.1  mrg 
    105      1.1  mrg   template<size_t _Np, typename _Variant>
    106      1.1  mrg     using variant_alternative_t =
    107      1.1  mrg       typename variant_alternative<_Np, _Variant>::type;
    108      1.1  mrg 
    109      1.1  mrg   template<size_t _Np, typename _Variant>
    110      1.1  mrg     struct variant_alternative<_Np, const _Variant>
    111      1.1  mrg     { using type = add_const_t<variant_alternative_t<_Np, _Variant>>; };
    112      1.1  mrg 
    113      1.1  mrg   template<size_t _Np, typename _Variant>
    114      1.1  mrg     struct variant_alternative<_Np, volatile _Variant>
    115      1.1  mrg     { using type = add_volatile_t<variant_alternative_t<_Np, _Variant>>; };
    116      1.1  mrg 
    117      1.1  mrg   template<size_t _Np, typename _Variant>
    118      1.1  mrg     struct variant_alternative<_Np, const volatile _Variant>
    119      1.1  mrg     { using type = add_cv_t<variant_alternative_t<_Np, _Variant>>; };
    120      1.1  mrg 
    121      1.1  mrg   inline constexpr size_t variant_npos = -1;
    122      1.1  mrg 
    123      1.1  mrg   template<size_t _Np, typename... _Types>
    124      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>>&
    125      1.1  mrg     get(variant<_Types...>&);
    126      1.1  mrg 
    127      1.1  mrg   template<size_t _Np, typename... _Types>
    128      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>>&&
    129      1.1  mrg     get(variant<_Types...>&&);
    130      1.1  mrg 
    131      1.1  mrg   template<size_t _Np, typename... _Types>
    132      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>> const&
    133      1.1  mrg     get(const variant<_Types...>&);
    134      1.1  mrg 
    135      1.1  mrg   template<size_t _Np, typename... _Types>
    136      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>> const&&
    137      1.1  mrg     get(const variant<_Types...>&&);
    138      1.1  mrg 
    139  1.1.1.4  mrg   template<typename _Result_type, typename _Visitor, typename... _Variants>
    140  1.1.1.3  mrg     constexpr decltype(auto)
    141  1.1.1.3  mrg     __do_visit(_Visitor&& __visitor, _Variants&&... __variants);
    142  1.1.1.3  mrg 
    143  1.1.1.3  mrg   template <typename... _Types, typename _Tp>
    144  1.1.1.5  mrg     _GLIBCXX20_CONSTEXPR
    145  1.1.1.3  mrg     decltype(auto)
    146  1.1.1.3  mrg     __variant_cast(_Tp&& __rhs)
    147  1.1.1.3  mrg     {
    148  1.1.1.3  mrg       if constexpr (is_lvalue_reference_v<_Tp>)
    149  1.1.1.3  mrg 	{
    150  1.1.1.3  mrg 	  if constexpr (is_const_v<remove_reference_t<_Tp>>)
    151  1.1.1.3  mrg 	    return static_cast<const variant<_Types...>&>(__rhs);
    152  1.1.1.3  mrg 	  else
    153  1.1.1.3  mrg 	    return static_cast<variant<_Types...>&>(__rhs);
    154  1.1.1.3  mrg 	}
    155  1.1.1.3  mrg       else
    156  1.1.1.3  mrg         return static_cast<variant<_Types...>&&>(__rhs);
    157  1.1.1.3  mrg     }
    158  1.1.1.3  mrg 
    159      1.1  mrg namespace __detail
    160      1.1  mrg {
    161      1.1  mrg namespace __variant
    162      1.1  mrg {
    163  1.1.1.3  mrg   // used for raw visitation
    164  1.1.1.3  mrg   struct __variant_cookie {};
    165  1.1.1.3  mrg   // used for raw visitation with indices passed in
    166  1.1.1.3  mrg   struct __variant_idx_cookie { using type = __variant_idx_cookie; };
    167  1.1.1.4  mrg   // Used to enable deduction (and same-type checking) for std::visit:
    168  1.1.1.5  mrg   template<typename _Tp> struct __deduce_visit_result { using type = _Tp; };
    169  1.1.1.3  mrg 
    170  1.1.1.4  mrg   // Visit variants that might be valueless.
    171  1.1.1.4  mrg   template<typename _Visitor, typename... _Variants>
    172  1.1.1.4  mrg     constexpr void
    173  1.1.1.4  mrg     __raw_visit(_Visitor&& __visitor, _Variants&&... __variants)
    174  1.1.1.4  mrg     {
    175  1.1.1.4  mrg       std::__do_visit<__variant_cookie>(std::forward<_Visitor>(__visitor),
    176  1.1.1.4  mrg 				        std::forward<_Variants>(__variants)...);
    177  1.1.1.4  mrg     }
    178  1.1.1.4  mrg 
    179  1.1.1.4  mrg   // Visit variants that might be valueless, passing indices to the visitor.
    180  1.1.1.4  mrg   template<typename _Visitor, typename... _Variants>
    181  1.1.1.4  mrg     constexpr void
    182  1.1.1.4  mrg     __raw_idx_visit(_Visitor&& __visitor, _Variants&&... __variants)
    183  1.1.1.4  mrg     {
    184  1.1.1.4  mrg       std::__do_visit<__variant_idx_cookie>(std::forward<_Visitor>(__visitor),
    185  1.1.1.4  mrg 	  std::forward<_Variants>(__variants)...);
    186  1.1.1.4  mrg     }
    187  1.1.1.4  mrg 
    188  1.1.1.5  mrg   // The __as function templates implement the exposition-only "as-variant"
    189  1.1.1.5  mrg 
    190  1.1.1.5  mrg   template<typename... _Types>
    191  1.1.1.5  mrg     constexpr std::variant<_Types...>&
    192  1.1.1.5  mrg     __as(std::variant<_Types...>& __v) noexcept
    193  1.1.1.5  mrg     { return __v; }
    194  1.1.1.5  mrg 
    195  1.1.1.5  mrg   template<typename... _Types>
    196  1.1.1.5  mrg     constexpr const std::variant<_Types...>&
    197  1.1.1.5  mrg     __as(const std::variant<_Types...>& __v) noexcept
    198  1.1.1.5  mrg     { return __v; }
    199  1.1.1.5  mrg 
    200  1.1.1.5  mrg   template<typename... _Types>
    201  1.1.1.5  mrg     constexpr std::variant<_Types...>&&
    202  1.1.1.5  mrg     __as(std::variant<_Types...>&& __v) noexcept
    203  1.1.1.5  mrg     { return std::move(__v); }
    204  1.1.1.5  mrg 
    205  1.1.1.5  mrg   template<typename... _Types>
    206  1.1.1.5  mrg     constexpr const std::variant<_Types...>&&
    207  1.1.1.5  mrg     __as(const std::variant<_Types...>&& __v) noexcept
    208  1.1.1.5  mrg     { return std::move(__v); }
    209  1.1.1.5  mrg 
    210  1.1.1.5  mrg   // For C++17:
    211  1.1.1.4  mrg   // _Uninitialized<T> is guaranteed to be a trivially destructible type,
    212  1.1.1.4  mrg   // even if T is not.
    213  1.1.1.5  mrg   // For C++20:
    214  1.1.1.5  mrg   // _Uninitialized<T> is trivially destructible iff T is, so _Variant_union
    215  1.1.1.5  mrg   // needs a constrained non-trivial destructor.
    216  1.1.1.4  mrg   template<typename _Type, bool = std::is_trivially_destructible_v<_Type>>
    217      1.1  mrg     struct _Uninitialized;
    218      1.1  mrg 
    219      1.1  mrg   template<typename _Type>
    220      1.1  mrg     struct _Uninitialized<_Type, true>
    221      1.1  mrg     {
    222      1.1  mrg       template<typename... _Args>
    223  1.1.1.3  mrg 	constexpr
    224  1.1.1.3  mrg 	_Uninitialized(in_place_index_t<0>, _Args&&... __args)
    225  1.1.1.3  mrg 	: _M_storage(std::forward<_Args>(__args)...)
    226  1.1.1.3  mrg 	{ }
    227      1.1  mrg 
    228  1.1.1.3  mrg       constexpr const _Type& _M_get() const & noexcept
    229      1.1  mrg       { return _M_storage; }
    230      1.1  mrg 
    231  1.1.1.3  mrg       constexpr _Type& _M_get() & noexcept
    232      1.1  mrg       { return _M_storage; }
    233      1.1  mrg 
    234  1.1.1.3  mrg       constexpr const _Type&& _M_get() const && noexcept
    235      1.1  mrg       { return std::move(_M_storage); }
    236      1.1  mrg 
    237  1.1.1.3  mrg       constexpr _Type&& _M_get() && noexcept
    238      1.1  mrg       { return std::move(_M_storage); }
    239      1.1  mrg 
    240      1.1  mrg       _Type _M_storage;
    241      1.1  mrg     };
    242      1.1  mrg 
    243      1.1  mrg   template<typename _Type>
    244      1.1  mrg     struct _Uninitialized<_Type, false>
    245      1.1  mrg     {
    246  1.1.1.5  mrg #if __cpp_lib_variant >= 202106L
    247  1.1.1.5  mrg       template<typename... _Args>
    248  1.1.1.5  mrg 	constexpr
    249  1.1.1.5  mrg 	_Uninitialized(in_place_index_t<0>, _Args&&... __args)
    250  1.1.1.5  mrg 	: _M_storage(std::forward<_Args>(__args)...)
    251  1.1.1.5  mrg 	{ }
    252  1.1.1.5  mrg 
    253  1.1.1.5  mrg       constexpr ~_Uninitialized() { }
    254  1.1.1.5  mrg 
    255  1.1.1.5  mrg       _Uninitialized(const _Uninitialized&) = default;
    256  1.1.1.5  mrg       _Uninitialized(_Uninitialized&&) = default;
    257  1.1.1.5  mrg       _Uninitialized& operator=(const _Uninitialized&) = default;
    258  1.1.1.5  mrg       _Uninitialized& operator=(_Uninitialized&&) = default;
    259  1.1.1.5  mrg 
    260  1.1.1.5  mrg       constexpr const _Type& _M_get() const & noexcept
    261  1.1.1.5  mrg       { return _M_storage; }
    262  1.1.1.5  mrg 
    263  1.1.1.5  mrg       constexpr _Type& _M_get() & noexcept
    264  1.1.1.5  mrg       { return _M_storage; }
    265  1.1.1.5  mrg 
    266  1.1.1.5  mrg       constexpr const _Type&& _M_get() const && noexcept
    267  1.1.1.5  mrg       { return std::move(_M_storage); }
    268  1.1.1.5  mrg 
    269  1.1.1.5  mrg       constexpr _Type&& _M_get() && noexcept
    270  1.1.1.5  mrg       { return std::move(_M_storage); }
    271  1.1.1.5  mrg 
    272  1.1.1.5  mrg       struct _Empty_byte { };
    273  1.1.1.5  mrg 
    274  1.1.1.5  mrg       union {
    275  1.1.1.5  mrg 	_Empty_byte _M_empty;
    276  1.1.1.5  mrg 	_Type _M_storage;
    277  1.1.1.5  mrg       };
    278  1.1.1.5  mrg #else
    279      1.1  mrg       template<typename... _Args>
    280  1.1.1.3  mrg 	constexpr
    281  1.1.1.3  mrg 	_Uninitialized(in_place_index_t<0>, _Args&&... __args)
    282  1.1.1.3  mrg 	{
    283  1.1.1.3  mrg 	  ::new ((void*)std::addressof(_M_storage))
    284  1.1.1.3  mrg 	    _Type(std::forward<_Args>(__args)...);
    285  1.1.1.3  mrg 	}
    286      1.1  mrg 
    287  1.1.1.3  mrg       const _Type& _M_get() const & noexcept
    288      1.1  mrg       { return *_M_storage._M_ptr(); }
    289      1.1  mrg 
    290  1.1.1.3  mrg       _Type& _M_get() & noexcept
    291      1.1  mrg       { return *_M_storage._M_ptr(); }
    292      1.1  mrg 
    293  1.1.1.3  mrg       const _Type&& _M_get() const && noexcept
    294      1.1  mrg       { return std::move(*_M_storage._M_ptr()); }
    295      1.1  mrg 
    296  1.1.1.3  mrg       _Type&& _M_get() && noexcept
    297      1.1  mrg       { return std::move(*_M_storage._M_ptr()); }
    298      1.1  mrg 
    299      1.1  mrg       __gnu_cxx::__aligned_membuf<_Type> _M_storage;
    300  1.1.1.5  mrg #endif
    301      1.1  mrg     };
    302      1.1  mrg 
    303      1.1  mrg   template<size_t _Np, typename _Union>
    304  1.1.1.3  mrg     constexpr decltype(auto)
    305  1.1.1.5  mrg     __get_n(_Union&& __u) noexcept
    306      1.1  mrg     {
    307  1.1.1.5  mrg       if constexpr (_Np == 0)
    308  1.1.1.5  mrg 	return std::forward<_Union>(__u)._M_first._M_get();
    309  1.1.1.5  mrg       else if constexpr (_Np == 1)
    310  1.1.1.5  mrg 	return std::forward<_Union>(__u)._M_rest._M_first._M_get();
    311  1.1.1.5  mrg       else if constexpr (_Np == 2)
    312  1.1.1.5  mrg 	return std::forward<_Union>(__u)._M_rest._M_rest._M_first._M_get();
    313  1.1.1.5  mrg       else
    314  1.1.1.5  mrg 	return __variant::__get_n<_Np - 3>(
    315  1.1.1.5  mrg 		 std::forward<_Union>(__u)._M_rest._M_rest._M_rest);
    316      1.1  mrg     }
    317      1.1  mrg 
    318      1.1  mrg   // Returns the typed storage for __v.
    319      1.1  mrg   template<size_t _Np, typename _Variant>
    320  1.1.1.3  mrg     constexpr decltype(auto)
    321  1.1.1.3  mrg     __get(_Variant&& __v) noexcept
    322  1.1.1.5  mrg     { return __variant::__get_n<_Np>(std::forward<_Variant>(__v)._M_u); }
    323  1.1.1.5  mrg 
    324  1.1.1.5  mrg   // Gets the _Uninitialized to construct into for __u.
    325  1.1.1.5  mrg   template<size_t _Np, typename _Union>
    326  1.1.1.5  mrg     constexpr decltype(auto)
    327  1.1.1.5  mrg     __construct_n(_Union& __u) noexcept
    328      1.1  mrg     {
    329  1.1.1.5  mrg       if constexpr (_Np == 0)
    330  1.1.1.5  mrg 	return &__u._M_first;
    331  1.1.1.5  mrg       else if constexpr (_Np == 1)
    332  1.1.1.5  mrg 	{
    333  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest);
    334  1.1.1.5  mrg 	  return &__u._M_rest._M_first;
    335  1.1.1.5  mrg 	}
    336  1.1.1.5  mrg       else if constexpr (_Np == 2)
    337  1.1.1.5  mrg 	{
    338  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest);
    339  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest._M_rest);
    340  1.1.1.5  mrg 	  return &__u._M_rest._M_rest._M_first;
    341  1.1.1.5  mrg 	}
    342  1.1.1.5  mrg       else
    343  1.1.1.5  mrg 	{
    344  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest);
    345  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest._M_rest);
    346  1.1.1.5  mrg 	  std::_Construct(&__u._M_rest._M_rest._M_rest);
    347  1.1.1.5  mrg 	  return __variant::__construct_n<_Np - 3>(__u._M_rest._M_rest._M_rest);
    348  1.1.1.5  mrg 	}
    349      1.1  mrg     }
    350      1.1  mrg 
    351  1.1.1.2  mrg   template<typename... _Types>
    352  1.1.1.2  mrg     struct _Traits
    353  1.1.1.2  mrg     {
    354  1.1.1.2  mrg       static constexpr bool _S_default_ctor =
    355  1.1.1.2  mrg 	  is_default_constructible_v<typename _Nth_type<0, _Types...>::type>;
    356  1.1.1.2  mrg       static constexpr bool _S_copy_ctor =
    357  1.1.1.2  mrg 	  (is_copy_constructible_v<_Types> && ...);
    358  1.1.1.2  mrg       static constexpr bool _S_move_ctor =
    359  1.1.1.2  mrg 	  (is_move_constructible_v<_Types> && ...);
    360  1.1.1.2  mrg       static constexpr bool _S_copy_assign =
    361  1.1.1.3  mrg 	  _S_copy_ctor
    362  1.1.1.2  mrg 	  && (is_copy_assignable_v<_Types> && ...);
    363  1.1.1.2  mrg       static constexpr bool _S_move_assign =
    364  1.1.1.2  mrg 	  _S_move_ctor
    365  1.1.1.2  mrg 	  && (is_move_assignable_v<_Types> && ...);
    366  1.1.1.2  mrg 
    367  1.1.1.2  mrg       static constexpr bool _S_trivial_dtor =
    368  1.1.1.2  mrg 	  (is_trivially_destructible_v<_Types> && ...);
    369  1.1.1.2  mrg       static constexpr bool _S_trivial_copy_ctor =
    370  1.1.1.2  mrg 	  (is_trivially_copy_constructible_v<_Types> && ...);
    371  1.1.1.2  mrg       static constexpr bool _S_trivial_move_ctor =
    372  1.1.1.2  mrg 	  (is_trivially_move_constructible_v<_Types> && ...);
    373  1.1.1.2  mrg       static constexpr bool _S_trivial_copy_assign =
    374  1.1.1.3  mrg 	  _S_trivial_dtor && _S_trivial_copy_ctor
    375  1.1.1.3  mrg 	  && (is_trivially_copy_assignable_v<_Types> && ...);
    376  1.1.1.2  mrg       static constexpr bool _S_trivial_move_assign =
    377  1.1.1.3  mrg 	  _S_trivial_dtor && _S_trivial_move_ctor
    378  1.1.1.3  mrg 	  && (is_trivially_move_assignable_v<_Types> && ...);
    379  1.1.1.2  mrg 
    380  1.1.1.2  mrg       // The following nothrow traits are for non-trivial SMFs. Trivial SMFs
    381  1.1.1.2  mrg       // are always nothrow.
    382  1.1.1.2  mrg       static constexpr bool _S_nothrow_default_ctor =
    383  1.1.1.2  mrg 	  is_nothrow_default_constructible_v<
    384  1.1.1.2  mrg 	      typename _Nth_type<0, _Types...>::type>;
    385  1.1.1.2  mrg       static constexpr bool _S_nothrow_copy_ctor = false;
    386  1.1.1.2  mrg       static constexpr bool _S_nothrow_move_ctor =
    387  1.1.1.2  mrg 	  (is_nothrow_move_constructible_v<_Types> && ...);
    388  1.1.1.2  mrg       static constexpr bool _S_nothrow_copy_assign = false;
    389  1.1.1.2  mrg       static constexpr bool _S_nothrow_move_assign =
    390  1.1.1.3  mrg 	  _S_nothrow_move_ctor
    391  1.1.1.3  mrg 	  && (is_nothrow_move_assignable_v<_Types> && ...);
    392  1.1.1.2  mrg     };
    393  1.1.1.2  mrg 
    394      1.1  mrg   // Defines members and ctors.
    395      1.1  mrg   template<typename... _Types>
    396  1.1.1.5  mrg     union _Variadic_union
    397  1.1.1.5  mrg     {
    398  1.1.1.5  mrg       _Variadic_union() = default;
    399  1.1.1.5  mrg 
    400  1.1.1.5  mrg       template<size_t _Np, typename... _Args>
    401  1.1.1.5  mrg 	_Variadic_union(in_place_index_t<_Np>, _Args&&...) = delete;
    402  1.1.1.5  mrg     };
    403      1.1  mrg 
    404      1.1  mrg   template<typename _First, typename... _Rest>
    405      1.1  mrg     union _Variadic_union<_First, _Rest...>
    406      1.1  mrg     {
    407      1.1  mrg       constexpr _Variadic_union() : _M_rest() { }
    408      1.1  mrg 
    409      1.1  mrg       template<typename... _Args>
    410  1.1.1.5  mrg 	constexpr
    411  1.1.1.5  mrg 	_Variadic_union(in_place_index_t<0>, _Args&&... __args)
    412      1.1  mrg 	: _M_first(in_place_index<0>, std::forward<_Args>(__args)...)
    413      1.1  mrg 	{ }
    414      1.1  mrg 
    415      1.1  mrg       template<size_t _Np, typename... _Args>
    416  1.1.1.5  mrg 	constexpr
    417  1.1.1.5  mrg 	_Variadic_union(in_place_index_t<_Np>, _Args&&... __args)
    418      1.1  mrg 	: _M_rest(in_place_index<_Np-1>, std::forward<_Args>(__args)...)
    419      1.1  mrg 	{ }
    420      1.1  mrg 
    421  1.1.1.5  mrg #if __cpp_lib_variant >= 202106L
    422  1.1.1.5  mrg       _Variadic_union(const _Variadic_union&) = default;
    423  1.1.1.5  mrg       _Variadic_union(_Variadic_union&&) = default;
    424  1.1.1.5  mrg       _Variadic_union& operator=(const _Variadic_union&) = default;
    425  1.1.1.5  mrg       _Variadic_union& operator=(_Variadic_union&&) = default;
    426  1.1.1.5  mrg 
    427  1.1.1.5  mrg       ~_Variadic_union() = default;
    428  1.1.1.5  mrg 
    429  1.1.1.5  mrg       constexpr ~_Variadic_union()
    430  1.1.1.5  mrg 	requires (!__has_trivial_destructor(_First))
    431  1.1.1.5  mrg 	      || (!__has_trivial_destructor(_Variadic_union<_Rest...>))
    432  1.1.1.5  mrg       { }
    433  1.1.1.5  mrg #endif
    434  1.1.1.5  mrg 
    435      1.1  mrg       _Uninitialized<_First> _M_first;
    436      1.1  mrg       _Variadic_union<_Rest...> _M_rest;
    437      1.1  mrg     };
    438      1.1  mrg 
    439  1.1.1.3  mrg   // _Never_valueless_alt is true for variant alternatives that can
    440  1.1.1.3  mrg   // always be placed in a variant without it becoming valueless.
    441  1.1.1.3  mrg 
    442  1.1.1.3  mrg   // For suitably-small, trivially copyable types we can create temporaries
    443  1.1.1.3  mrg   // on the stack and then memcpy them into place.
    444  1.1.1.3  mrg   template<typename _Tp>
    445  1.1.1.3  mrg     struct _Never_valueless_alt
    446  1.1.1.3  mrg     : __and_<bool_constant<sizeof(_Tp) <= 256>, is_trivially_copyable<_Tp>>
    447  1.1.1.3  mrg     { };
    448  1.1.1.3  mrg 
    449  1.1.1.3  mrg   // Specialize _Never_valueless_alt for other types which have a
    450  1.1.1.3  mrg   // non-throwing and cheap move construction and move assignment operator,
    451  1.1.1.3  mrg   // so that emplacing the type will provide the strong exception-safety
    452  1.1.1.3  mrg   // guarantee, by creating and moving a temporary.
    453  1.1.1.3  mrg   // Whether _Never_valueless_alt<T> is true or not affects the ABI of a
    454  1.1.1.3  mrg   // variant using that alternative, so we can't change the value later!
    455  1.1.1.3  mrg 
    456  1.1.1.3  mrg   // True if every alternative in _Types... can be emplaced in a variant
    457  1.1.1.3  mrg   // without it becoming valueless. If this is true, variant<_Types...>
    458  1.1.1.3  mrg   // can never be valueless, which enables some minor optimizations.
    459  1.1.1.3  mrg   template <typename... _Types>
    460  1.1.1.3  mrg     constexpr bool __never_valueless()
    461  1.1.1.3  mrg     {
    462  1.1.1.3  mrg       return _Traits<_Types...>::_S_move_assign
    463  1.1.1.3  mrg 	&& (_Never_valueless_alt<_Types>::value && ...);
    464  1.1.1.3  mrg     }
    465  1.1.1.3  mrg 
    466      1.1  mrg   // Defines index and the dtor, possibly trivial.
    467      1.1  mrg   template<bool __trivially_destructible, typename... _Types>
    468      1.1  mrg     struct _Variant_storage;
    469      1.1  mrg 
    470      1.1  mrg   template <typename... _Types>
    471  1.1.1.3  mrg     using __select_index =
    472  1.1.1.3  mrg       typename __select_int::_Select_int_base<sizeof...(_Types),
    473  1.1.1.3  mrg 					      unsigned char,
    474  1.1.1.3  mrg 					      unsigned short>::type::value_type;
    475      1.1  mrg 
    476      1.1  mrg   template<typename... _Types>
    477      1.1  mrg     struct _Variant_storage<false, _Types...>
    478      1.1  mrg     {
    479  1.1.1.4  mrg       constexpr
    480  1.1.1.4  mrg       _Variant_storage()
    481  1.1.1.4  mrg       : _M_index(static_cast<__index_type>(variant_npos))
    482  1.1.1.4  mrg       { }
    483      1.1  mrg 
    484      1.1  mrg       template<size_t _Np, typename... _Args>
    485  1.1.1.4  mrg 	constexpr
    486  1.1.1.4  mrg 	_Variant_storage(in_place_index_t<_Np>, _Args&&... __args)
    487      1.1  mrg 	: _M_u(in_place_index<_Np>, std::forward<_Args>(__args)...),
    488  1.1.1.4  mrg 	_M_index{_Np}
    489      1.1  mrg 	{ }
    490      1.1  mrg 
    491  1.1.1.5  mrg       constexpr void
    492  1.1.1.5  mrg       _M_reset()
    493  1.1.1.3  mrg       {
    494  1.1.1.5  mrg 	if (!_M_valid()) [[__unlikely__]]
    495  1.1.1.4  mrg 	  return;
    496  1.1.1.4  mrg 
    497  1.1.1.4  mrg 	std::__do_visit<void>([](auto&& __this_mem) mutable
    498  1.1.1.3  mrg 	  {
    499  1.1.1.4  mrg 	    std::_Destroy(std::__addressof(__this_mem));
    500  1.1.1.3  mrg 	  }, __variant_cast<_Types...>(*this));
    501      1.1  mrg 
    502  1.1.1.4  mrg 	_M_index = static_cast<__index_type>(variant_npos);
    503      1.1  mrg       }
    504      1.1  mrg 
    505  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
    506      1.1  mrg       ~_Variant_storage()
    507      1.1  mrg       { _M_reset(); }
    508      1.1  mrg 
    509  1.1.1.2  mrg       constexpr bool
    510  1.1.1.2  mrg       _M_valid() const noexcept
    511  1.1.1.2  mrg       {
    512  1.1.1.4  mrg 	if constexpr (__variant::__never_valueless<_Types...>())
    513  1.1.1.3  mrg 	  return true;
    514  1.1.1.2  mrg 	return this->_M_index != __index_type(variant_npos);
    515  1.1.1.2  mrg       }
    516  1.1.1.2  mrg 
    517      1.1  mrg       _Variadic_union<_Types...> _M_u;
    518      1.1  mrg       using __index_type = __select_index<_Types...>;
    519      1.1  mrg       __index_type _M_index;
    520      1.1  mrg     };
    521      1.1  mrg 
    522      1.1  mrg   template<typename... _Types>
    523      1.1  mrg     struct _Variant_storage<true, _Types...>
    524      1.1  mrg     {
    525  1.1.1.4  mrg       constexpr
    526  1.1.1.4  mrg       _Variant_storage()
    527  1.1.1.4  mrg       : _M_index(static_cast<__index_type>(variant_npos))
    528  1.1.1.4  mrg       { }
    529      1.1  mrg 
    530      1.1  mrg       template<size_t _Np, typename... _Args>
    531  1.1.1.4  mrg 	constexpr
    532  1.1.1.4  mrg 	_Variant_storage(in_place_index_t<_Np>, _Args&&... __args)
    533      1.1  mrg 	: _M_u(in_place_index<_Np>, std::forward<_Args>(__args)...),
    534  1.1.1.4  mrg 	_M_index{_Np}
    535      1.1  mrg 	{ }
    536      1.1  mrg 
    537  1.1.1.5  mrg       constexpr void
    538  1.1.1.5  mrg       _M_reset() noexcept
    539  1.1.1.4  mrg       { _M_index = static_cast<__index_type>(variant_npos); }
    540      1.1  mrg 
    541  1.1.1.2  mrg       constexpr bool
    542  1.1.1.2  mrg       _M_valid() const noexcept
    543  1.1.1.2  mrg       {
    544  1.1.1.4  mrg 	if constexpr (__variant::__never_valueless<_Types...>())
    545  1.1.1.3  mrg 	  return true;
    546  1.1.1.5  mrg 	// It would be nice if we could just return true for -fno-exceptions.
    547  1.1.1.5  mrg 	// It's possible (but inadvisable) that a std::variant could become
    548  1.1.1.5  mrg 	// valueless in a translation unit compiled with -fexceptions and then
    549  1.1.1.5  mrg 	// be passed to functions compiled with -fno-exceptions. We would need
    550  1.1.1.5  mrg 	// some #ifdef _GLIBCXX_NO_EXCEPTIONS_GLOBALLY property to elide all
    551  1.1.1.5  mrg 	// checks for valueless_by_exception().
    552  1.1.1.4  mrg 	return this->_M_index != static_cast<__index_type>(variant_npos);
    553  1.1.1.2  mrg       }
    554  1.1.1.2  mrg 
    555      1.1  mrg       _Variadic_union<_Types...> _M_u;
    556      1.1  mrg       using __index_type = __select_index<_Types...>;
    557      1.1  mrg       __index_type _M_index;
    558      1.1  mrg     };
    559      1.1  mrg 
    560  1.1.1.5  mrg   // Implementation of v.emplace<N>(args...).
    561  1.1.1.5  mrg   template<size_t _Np, bool _Triv, typename... _Types, typename... _Args>
    562  1.1.1.5  mrg     _GLIBCXX20_CONSTEXPR
    563  1.1.1.5  mrg     inline void
    564  1.1.1.5  mrg     __emplace(_Variant_storage<_Triv, _Types...>& __v, _Args&&... __args)
    565  1.1.1.5  mrg     {
    566  1.1.1.5  mrg       __v._M_reset();
    567  1.1.1.5  mrg       auto* __addr = __variant::__construct_n<_Np>(__v._M_u);
    568  1.1.1.5  mrg       std::_Construct(__addr, in_place_index<0>,
    569  1.1.1.5  mrg 		      std::forward<_Args>(__args)...);
    570  1.1.1.5  mrg       // Construction didn't throw, so can set the new index now:
    571  1.1.1.5  mrg       __v._M_index = _Np;
    572  1.1.1.5  mrg     }
    573  1.1.1.5  mrg 
    574      1.1  mrg   template<typename... _Types>
    575  1.1.1.2  mrg     using _Variant_storage_alias =
    576  1.1.1.2  mrg 	_Variant_storage<_Traits<_Types...>::_S_trivial_dtor, _Types...>;
    577      1.1  mrg 
    578  1.1.1.2  mrg   // The following are (Copy|Move) (ctor|assign) layers for forwarding
    579  1.1.1.2  mrg   // triviality and handling non-trivial SMF behaviors.
    580  1.1.1.2  mrg 
    581  1.1.1.2  mrg   template<bool, typename... _Types>
    582  1.1.1.2  mrg     struct _Copy_ctor_base : _Variant_storage_alias<_Types...>
    583  1.1.1.2  mrg     {
    584  1.1.1.2  mrg       using _Base = _Variant_storage_alias<_Types...>;
    585  1.1.1.2  mrg       using _Base::_Base;
    586      1.1  mrg 
    587  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
    588  1.1.1.2  mrg       _Copy_ctor_base(const _Copy_ctor_base& __rhs)
    589  1.1.1.2  mrg 	  noexcept(_Traits<_Types...>::_S_nothrow_copy_ctor)
    590      1.1  mrg       {
    591  1.1.1.5  mrg 	__variant::__raw_idx_visit(
    592  1.1.1.5  mrg 	  [this](auto&& __rhs_mem, auto __rhs_index) mutable
    593  1.1.1.5  mrg 	  {
    594  1.1.1.5  mrg 	    constexpr size_t __j = __rhs_index;
    595  1.1.1.5  mrg 	    if constexpr (__j != variant_npos)
    596  1.1.1.5  mrg 	      std::_Construct(std::__addressof(this->_M_u),
    597  1.1.1.5  mrg 			      in_place_index<__j>, __rhs_mem);
    598  1.1.1.5  mrg 	  }, __variant_cast<_Types...>(__rhs));
    599  1.1.1.5  mrg 	this->_M_index = __rhs._M_index;
    600      1.1  mrg       }
    601      1.1  mrg 
    602  1.1.1.2  mrg       _Copy_ctor_base(_Copy_ctor_base&&) = default;
    603  1.1.1.2  mrg       _Copy_ctor_base& operator=(const _Copy_ctor_base&) = default;
    604  1.1.1.2  mrg       _Copy_ctor_base& operator=(_Copy_ctor_base&&) = default;
    605  1.1.1.2  mrg     };
    606  1.1.1.2  mrg 
    607  1.1.1.2  mrg   template<typename... _Types>
    608  1.1.1.2  mrg     struct _Copy_ctor_base<true, _Types...> : _Variant_storage_alias<_Types...>
    609  1.1.1.2  mrg     {
    610  1.1.1.2  mrg       using _Base = _Variant_storage_alias<_Types...>;
    611  1.1.1.2  mrg       using _Base::_Base;
    612  1.1.1.2  mrg     };
    613  1.1.1.2  mrg 
    614  1.1.1.2  mrg   template<typename... _Types>
    615  1.1.1.2  mrg     using _Copy_ctor_alias =
    616  1.1.1.2  mrg 	_Copy_ctor_base<_Traits<_Types...>::_S_trivial_copy_ctor, _Types...>;
    617  1.1.1.2  mrg 
    618  1.1.1.2  mrg   template<bool, typename... _Types>
    619  1.1.1.2  mrg     struct _Move_ctor_base : _Copy_ctor_alias<_Types...>
    620  1.1.1.2  mrg     {
    621  1.1.1.2  mrg       using _Base = _Copy_ctor_alias<_Types...>;
    622  1.1.1.2  mrg       using _Base::_Base;
    623  1.1.1.2  mrg 
    624  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
    625  1.1.1.2  mrg       _Move_ctor_base(_Move_ctor_base&& __rhs)
    626  1.1.1.2  mrg 	  noexcept(_Traits<_Types...>::_S_nothrow_move_ctor)
    627      1.1  mrg       {
    628  1.1.1.5  mrg 	__variant::__raw_idx_visit(
    629  1.1.1.5  mrg 	  [this](auto&& __rhs_mem, auto __rhs_index) mutable
    630  1.1.1.5  mrg 	  {
    631  1.1.1.5  mrg 	    constexpr size_t __j = __rhs_index;
    632  1.1.1.5  mrg 	    if constexpr (__j != variant_npos)
    633  1.1.1.5  mrg 	      std::_Construct(std::__addressof(this->_M_u),
    634  1.1.1.5  mrg 			      in_place_index<__j>,
    635  1.1.1.5  mrg 			      std::forward<decltype(__rhs_mem)>(__rhs_mem));
    636  1.1.1.5  mrg 	  }, __variant_cast<_Types...>(std::move(__rhs)));
    637  1.1.1.5  mrg 	this->_M_index = __rhs._M_index;
    638      1.1  mrg       }
    639      1.1  mrg 
    640  1.1.1.2  mrg       _Move_ctor_base(const _Move_ctor_base&) = default;
    641  1.1.1.2  mrg       _Move_ctor_base& operator=(const _Move_ctor_base&) = default;
    642  1.1.1.2  mrg       _Move_ctor_base& operator=(_Move_ctor_base&&) = default;
    643  1.1.1.2  mrg     };
    644  1.1.1.2  mrg 
    645  1.1.1.2  mrg   template<typename... _Types>
    646  1.1.1.2  mrg     struct _Move_ctor_base<true, _Types...> : _Copy_ctor_alias<_Types...>
    647  1.1.1.2  mrg     {
    648  1.1.1.2  mrg       using _Base = _Copy_ctor_alias<_Types...>;
    649  1.1.1.2  mrg       using _Base::_Base;
    650  1.1.1.2  mrg     };
    651  1.1.1.2  mrg 
    652  1.1.1.2  mrg   template<typename... _Types>
    653  1.1.1.2  mrg     using _Move_ctor_alias =
    654  1.1.1.2  mrg 	_Move_ctor_base<_Traits<_Types...>::_S_trivial_move_ctor, _Types...>;
    655  1.1.1.2  mrg 
    656  1.1.1.2  mrg   template<bool, typename... _Types>
    657  1.1.1.2  mrg     struct _Copy_assign_base : _Move_ctor_alias<_Types...>
    658  1.1.1.2  mrg     {
    659  1.1.1.2  mrg       using _Base = _Move_ctor_alias<_Types...>;
    660  1.1.1.2  mrg       using _Base::_Base;
    661      1.1  mrg 
    662  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
    663  1.1.1.2  mrg       _Copy_assign_base&
    664  1.1.1.2  mrg       operator=(const _Copy_assign_base& __rhs)
    665  1.1.1.2  mrg 	  noexcept(_Traits<_Types...>::_S_nothrow_copy_assign)
    666      1.1  mrg       {
    667  1.1.1.4  mrg 	__variant::__raw_idx_visit(
    668  1.1.1.4  mrg 	  [this](auto&& __rhs_mem, auto __rhs_index) mutable
    669      1.1  mrg 	  {
    670  1.1.1.5  mrg 	    constexpr size_t __j = __rhs_index;
    671  1.1.1.5  mrg 	    if constexpr (__j == variant_npos)
    672  1.1.1.5  mrg 	      this->_M_reset(); // Make *this valueless.
    673  1.1.1.5  mrg 	    else if (this->_M_index == __j)
    674  1.1.1.5  mrg 	      __variant::__get<__j>(*this) = __rhs_mem;
    675  1.1.1.5  mrg 	    else
    676      1.1  mrg 	      {
    677  1.1.1.5  mrg 		using _Tj = typename _Nth_type<__j, _Types...>::type;
    678  1.1.1.5  mrg 		if constexpr (is_nothrow_copy_constructible_v<_Tj>
    679  1.1.1.5  mrg 			      || !is_nothrow_move_constructible_v<_Tj>)
    680  1.1.1.5  mrg 		  __variant::__emplace<__j>(*this, __rhs_mem);
    681  1.1.1.3  mrg 		else
    682  1.1.1.3  mrg 		  {
    683  1.1.1.5  mrg 		    using _Variant = variant<_Types...>;
    684  1.1.1.5  mrg 		    _Variant& __self = __variant_cast<_Types...>(*this);
    685  1.1.1.5  mrg 		    __self = _Variant(in_place_index<__j>, __rhs_mem);
    686  1.1.1.3  mrg 		  }
    687      1.1  mrg 	      }
    688  1.1.1.3  mrg 	  }, __variant_cast<_Types...>(__rhs));
    689      1.1  mrg 	return *this;
    690      1.1  mrg       }
    691      1.1  mrg 
    692  1.1.1.2  mrg       _Copy_assign_base(const _Copy_assign_base&) = default;
    693  1.1.1.2  mrg       _Copy_assign_base(_Copy_assign_base&&) = default;
    694  1.1.1.2  mrg       _Copy_assign_base& operator=(_Copy_assign_base&&) = default;
    695  1.1.1.2  mrg     };
    696  1.1.1.2  mrg 
    697  1.1.1.2  mrg   template<typename... _Types>
    698  1.1.1.2  mrg     struct _Copy_assign_base<true, _Types...> : _Move_ctor_alias<_Types...>
    699  1.1.1.2  mrg     {
    700  1.1.1.2  mrg       using _Base = _Move_ctor_alias<_Types...>;
    701  1.1.1.2  mrg       using _Base::_Base;
    702  1.1.1.2  mrg     };
    703  1.1.1.2  mrg 
    704  1.1.1.2  mrg   template<typename... _Types>
    705  1.1.1.2  mrg     using _Copy_assign_alias =
    706  1.1.1.3  mrg       _Copy_assign_base<_Traits<_Types...>::_S_trivial_copy_assign, _Types...>;
    707      1.1  mrg 
    708  1.1.1.2  mrg   template<bool, typename... _Types>
    709  1.1.1.2  mrg     struct _Move_assign_base : _Copy_assign_alias<_Types...>
    710  1.1.1.2  mrg     {
    711  1.1.1.2  mrg       using _Base = _Copy_assign_alias<_Types...>;
    712  1.1.1.2  mrg       using _Base::_Base;
    713  1.1.1.2  mrg 
    714  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
    715  1.1.1.2  mrg       _Move_assign_base&
    716  1.1.1.2  mrg       operator=(_Move_assign_base&& __rhs)
    717  1.1.1.2  mrg 	  noexcept(_Traits<_Types...>::_S_nothrow_move_assign)
    718      1.1  mrg       {
    719  1.1.1.4  mrg 	__variant::__raw_idx_visit(
    720  1.1.1.4  mrg 	  [this](auto&& __rhs_mem, auto __rhs_index) mutable
    721      1.1  mrg 	  {
    722  1.1.1.5  mrg 	    constexpr size_t __j = __rhs_index;
    723  1.1.1.5  mrg 	    if constexpr (__j != variant_npos)
    724      1.1  mrg 	      {
    725  1.1.1.5  mrg 		if (this->_M_index == __j)
    726  1.1.1.5  mrg 		  __variant::__get<__j>(*this) = std::move(__rhs_mem);
    727  1.1.1.3  mrg 		else
    728  1.1.1.5  mrg 		  {
    729  1.1.1.5  mrg 		    using _Tj = typename _Nth_type<__j, _Types...>::type;
    730  1.1.1.5  mrg 		    if constexpr (is_nothrow_move_constructible_v<_Tj>)
    731  1.1.1.5  mrg 		      __variant::__emplace<__j>(*this, std::move(__rhs_mem));
    732  1.1.1.5  mrg 		    else
    733  1.1.1.5  mrg 		      {
    734  1.1.1.5  mrg 			using _Variant = variant<_Types...>;
    735  1.1.1.5  mrg 			_Variant& __self = __variant_cast<_Types...>(*this);
    736  1.1.1.5  mrg 			__self.template emplace<__j>(std::move(__rhs_mem));
    737  1.1.1.5  mrg 		      }
    738  1.1.1.5  mrg 		  }
    739      1.1  mrg 	      }
    740  1.1.1.3  mrg 	    else
    741  1.1.1.3  mrg 	      this->_M_reset();
    742  1.1.1.3  mrg 	  }, __variant_cast<_Types...>(__rhs));
    743      1.1  mrg 	return *this;
    744      1.1  mrg       }
    745      1.1  mrg 
    746  1.1.1.2  mrg       _Move_assign_base(const _Move_assign_base&) = default;
    747  1.1.1.2  mrg       _Move_assign_base(_Move_assign_base&&) = default;
    748  1.1.1.2  mrg       _Move_assign_base& operator=(const _Move_assign_base&) = default;
    749  1.1.1.2  mrg     };
    750      1.1  mrg 
    751  1.1.1.2  mrg   template<typename... _Types>
    752  1.1.1.2  mrg     struct _Move_assign_base<true, _Types...> : _Copy_assign_alias<_Types...>
    753  1.1.1.2  mrg     {
    754  1.1.1.2  mrg       using _Base = _Copy_assign_alias<_Types...>;
    755  1.1.1.2  mrg       using _Base::_Base;
    756  1.1.1.2  mrg     };
    757  1.1.1.2  mrg 
    758  1.1.1.2  mrg   template<typename... _Types>
    759  1.1.1.2  mrg     using _Move_assign_alias =
    760  1.1.1.3  mrg       _Move_assign_base<_Traits<_Types...>::_S_trivial_move_assign, _Types...>;
    761  1.1.1.2  mrg 
    762  1.1.1.2  mrg   template<typename... _Types>
    763  1.1.1.2  mrg     struct _Variant_base : _Move_assign_alias<_Types...>
    764  1.1.1.2  mrg     {
    765  1.1.1.2  mrg       using _Base = _Move_assign_alias<_Types...>;
    766  1.1.1.2  mrg 
    767  1.1.1.2  mrg       constexpr
    768  1.1.1.5  mrg       _Variant_base() noexcept(_Traits<_Types...>::_S_nothrow_default_ctor)
    769  1.1.1.2  mrg       : _Variant_base(in_place_index<0>) { }
    770  1.1.1.2  mrg 
    771  1.1.1.2  mrg       template<size_t _Np, typename... _Args>
    772  1.1.1.2  mrg 	constexpr explicit
    773  1.1.1.2  mrg 	_Variant_base(in_place_index_t<_Np> __i, _Args&&... __args)
    774  1.1.1.2  mrg 	: _Base(__i, std::forward<_Args>(__args)...)
    775  1.1.1.2  mrg 	{ }
    776  1.1.1.2  mrg 
    777  1.1.1.2  mrg       _Variant_base(const _Variant_base&) = default;
    778  1.1.1.2  mrg       _Variant_base(_Variant_base&&) = default;
    779  1.1.1.2  mrg       _Variant_base& operator=(const _Variant_base&) = default;
    780  1.1.1.2  mrg       _Variant_base& operator=(_Variant_base&&) = default;
    781      1.1  mrg     };
    782      1.1  mrg 
    783      1.1  mrg   template<typename _Tp, typename... _Types>
    784  1.1.1.5  mrg     inline constexpr bool __exactly_once
    785  1.1.1.5  mrg       = std::__find_uniq_type_in_pack<_Tp, _Types...>() < sizeof...(_Types);
    786      1.1  mrg 
    787  1.1.1.4  mrg   // Helper used to check for valid conversions that don't involve narrowing.
    788  1.1.1.4  mrg   template<typename _Ti> struct _Arr { _Ti _M_x[1]; };
    789      1.1  mrg 
    790  1.1.1.5  mrg   // "Build an imaginary function FUN(Ti) for each alternative type Ti"
    791  1.1.1.5  mrg   template<size_t _Ind, typename _Tp, typename _Ti, typename = void>
    792  1.1.1.4  mrg     struct _Build_FUN
    793  1.1.1.4  mrg     {
    794  1.1.1.4  mrg       // This function means 'using _Build_FUN<I, T, Ti>::_S_fun;' is valid,
    795  1.1.1.4  mrg       // but only static functions will be considered in the call below.
    796  1.1.1.4  mrg       void _S_fun();
    797  1.1.1.4  mrg     };
    798  1.1.1.4  mrg 
    799  1.1.1.5  mrg   // "... for which Ti x[] = {std::forward<T>(t)}; is well-formed."
    800  1.1.1.4  mrg   template<size_t _Ind, typename _Tp, typename _Ti>
    801  1.1.1.5  mrg     struct _Build_FUN<_Ind, _Tp, _Ti,
    802  1.1.1.4  mrg 		      void_t<decltype(_Arr<_Ti>{{std::declval<_Tp>()}})>>
    803      1.1  mrg     {
    804  1.1.1.4  mrg       // This is the FUN function for type _Ti, with index _Ind
    805  1.1.1.4  mrg       static integral_constant<size_t, _Ind> _S_fun(_Ti);
    806      1.1  mrg     };
    807      1.1  mrg 
    808  1.1.1.4  mrg   template<typename _Tp, typename _Variant,
    809  1.1.1.4  mrg 	   typename = make_index_sequence<variant_size_v<_Variant>>>
    810  1.1.1.4  mrg     struct _Build_FUNs;
    811  1.1.1.4  mrg 
    812  1.1.1.4  mrg   template<typename _Tp, typename... _Ti, size_t... _Ind>
    813  1.1.1.4  mrg     struct _Build_FUNs<_Tp, variant<_Ti...>, index_sequence<_Ind...>>
    814  1.1.1.4  mrg     : _Build_FUN<_Ind, _Tp, _Ti>...
    815  1.1.1.4  mrg     {
    816  1.1.1.4  mrg       using _Build_FUN<_Ind, _Tp, _Ti>::_S_fun...;
    817  1.1.1.4  mrg     };
    818  1.1.1.4  mrg 
    819  1.1.1.4  mrg   // The index j of the overload FUN(Tj) selected by overload resolution
    820  1.1.1.4  mrg   // for FUN(std::forward<_Tp>(t))
    821  1.1.1.4  mrg   template<typename _Tp, typename _Variant>
    822  1.1.1.4  mrg     using _FUN_type
    823  1.1.1.4  mrg       = decltype(_Build_FUNs<_Tp, _Variant>::_S_fun(std::declval<_Tp>()));
    824  1.1.1.4  mrg 
    825  1.1.1.4  mrg   // The index selected for FUN(std::forward<T>(t)), or variant_npos if none.
    826      1.1  mrg   template<typename _Tp, typename _Variant, typename = void>
    827      1.1  mrg     struct __accepted_index
    828  1.1.1.4  mrg     : integral_constant<size_t, variant_npos>
    829  1.1.1.4  mrg     { };
    830      1.1  mrg 
    831  1.1.1.4  mrg   template<typename _Tp, typename _Variant>
    832  1.1.1.4  mrg     struct __accepted_index<_Tp, _Variant, void_t<_FUN_type<_Tp, _Variant>>>
    833  1.1.1.4  mrg     : _FUN_type<_Tp, _Variant>
    834  1.1.1.4  mrg     { };
    835      1.1  mrg 
    836  1.1.1.3  mrg   template <typename _Maybe_variant_cookie, typename _Variant>
    837  1.1.1.3  mrg     struct _Extra_visit_slot_needed
    838  1.1.1.3  mrg     {
    839  1.1.1.3  mrg       template <typename> struct _Variant_never_valueless;
    840  1.1.1.3  mrg 
    841  1.1.1.3  mrg       template <typename... _Types>
    842  1.1.1.3  mrg 	struct _Variant_never_valueless<variant<_Types...>>
    843  1.1.1.4  mrg 	: bool_constant<__variant::__never_valueless<_Types...>()> {};
    844  1.1.1.3  mrg 
    845  1.1.1.3  mrg       static constexpr bool value =
    846  1.1.1.3  mrg 	(is_same_v<_Maybe_variant_cookie, __variant_cookie>
    847  1.1.1.3  mrg 	 || is_same_v<_Maybe_variant_cookie, __variant_idx_cookie>)
    848  1.1.1.3  mrg 	&& !_Variant_never_valueless<__remove_cvref_t<_Variant>>::value;
    849  1.1.1.3  mrg     };
    850  1.1.1.3  mrg 
    851  1.1.1.3  mrg   // Used for storing a multi-dimensional vtable.
    852      1.1  mrg   template<typename _Tp, size_t... _Dimensions>
    853  1.1.1.3  mrg     struct _Multi_array;
    854  1.1.1.3  mrg 
    855  1.1.1.3  mrg   // Partial specialization with rank zero, stores a single _Tp element.
    856  1.1.1.3  mrg   template<typename _Tp>
    857  1.1.1.3  mrg     struct _Multi_array<_Tp>
    858      1.1  mrg     {
    859  1.1.1.4  mrg       template<typename>
    860  1.1.1.4  mrg 	struct __untag_result
    861  1.1.1.4  mrg 	: false_type
    862  1.1.1.4  mrg 	{ using element_type = _Tp; };
    863  1.1.1.4  mrg 
    864  1.1.1.4  mrg       template <typename... _Args>
    865  1.1.1.4  mrg 	struct __untag_result<const void(*)(_Args...)>
    866  1.1.1.4  mrg 	: false_type
    867  1.1.1.4  mrg 	{ using element_type = void(*)(_Args...); };
    868  1.1.1.4  mrg 
    869  1.1.1.4  mrg       template <typename... _Args>
    870  1.1.1.4  mrg 	struct __untag_result<__variant_cookie(*)(_Args...)>
    871  1.1.1.4  mrg 	: false_type
    872  1.1.1.4  mrg 	{ using element_type = void(*)(_Args...); };
    873  1.1.1.4  mrg 
    874  1.1.1.4  mrg       template <typename... _Args>
    875  1.1.1.4  mrg 	struct __untag_result<__variant_idx_cookie(*)(_Args...)>
    876  1.1.1.4  mrg 	: false_type
    877  1.1.1.4  mrg 	{ using element_type = void(*)(_Args...); };
    878  1.1.1.4  mrg 
    879  1.1.1.4  mrg       template <typename _Res, typename... _Args>
    880  1.1.1.4  mrg 	struct __untag_result<__deduce_visit_result<_Res>(*)(_Args...)>
    881  1.1.1.4  mrg 	: true_type
    882  1.1.1.4  mrg 	{ using element_type = _Res(*)(_Args...); };
    883  1.1.1.4  mrg 
    884  1.1.1.4  mrg       using __result_is_deduced = __untag_result<_Tp>;
    885  1.1.1.4  mrg 
    886  1.1.1.4  mrg       constexpr const typename __untag_result<_Tp>::element_type&
    887      1.1  mrg       _M_access() const
    888      1.1  mrg       { return _M_data; }
    889      1.1  mrg 
    890  1.1.1.4  mrg       typename __untag_result<_Tp>::element_type _M_data;
    891      1.1  mrg     };
    892      1.1  mrg 
    893  1.1.1.3  mrg   // Partial specialization with rank >= 1.
    894  1.1.1.3  mrg   template<typename _Ret,
    895  1.1.1.3  mrg 	   typename _Visitor,
    896  1.1.1.3  mrg 	   typename... _Variants,
    897  1.1.1.3  mrg 	   size_t __first, size_t... __rest>
    898  1.1.1.3  mrg     struct _Multi_array<_Ret(*)(_Visitor, _Variants...), __first, __rest...>
    899  1.1.1.3  mrg     {
    900  1.1.1.3  mrg       static constexpr size_t __index =
    901  1.1.1.3  mrg 	sizeof...(_Variants) - sizeof...(__rest) - 1;
    902  1.1.1.3  mrg 
    903  1.1.1.3  mrg       using _Variant = typename _Nth_type<__index, _Variants...>::type;
    904  1.1.1.3  mrg 
    905  1.1.1.3  mrg       static constexpr int __do_cookie =
    906  1.1.1.3  mrg 	_Extra_visit_slot_needed<_Ret, _Variant>::value ? 1 : 0;
    907  1.1.1.3  mrg 
    908  1.1.1.3  mrg       using _Tp = _Ret(*)(_Visitor, _Variants...);
    909  1.1.1.3  mrg 
    910      1.1  mrg       template<typename... _Args>
    911  1.1.1.4  mrg 	constexpr decltype(auto)
    912      1.1  mrg 	_M_access(size_t __first_index, _Args... __rest_indices) const
    913  1.1.1.3  mrg         {
    914  1.1.1.3  mrg 	  return _M_arr[__first_index + __do_cookie]
    915  1.1.1.3  mrg 	    ._M_access(__rest_indices...);
    916  1.1.1.3  mrg 	}
    917      1.1  mrg 
    918  1.1.1.3  mrg       _Multi_array<_Tp, __rest...> _M_arr[__first + __do_cookie];
    919      1.1  mrg     };
    920      1.1  mrg 
    921      1.1  mrg   // Creates a multi-dimensional vtable recursively.
    922      1.1  mrg   //
    923      1.1  mrg   // For example,
    924      1.1  mrg   // visit([](auto, auto){},
    925      1.1  mrg   //       variant<int, char>(),  // typedef'ed as V1
    926      1.1  mrg   //       variant<float, double, long double>())  // typedef'ed as V2
    927      1.1  mrg   // will trigger instantiations of:
    928  1.1.1.4  mrg   // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 2, 3>,
    929      1.1  mrg   //                   tuple<V1&&, V2&&>, std::index_sequence<>>
    930  1.1.1.4  mrg   //   __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 3>,
    931      1.1  mrg   //                     tuple<V1&&, V2&&>, std::index_sequence<0>>
    932  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    933      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<0, 0>>
    934  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    935      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<0, 1>>
    936  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    937      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<0, 2>>
    938  1.1.1.4  mrg   //   __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 3>,
    939      1.1  mrg   //                     tuple<V1&&, V2&&>, std::index_sequence<1>>
    940  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    941      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<1, 0>>
    942  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    943      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<1, 1>>
    944  1.1.1.4  mrg   //     __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
    945      1.1  mrg   //                       tuple<V1&&, V2&&>, std::index_sequence<1, 2>>
    946      1.1  mrg   // The returned multi-dimensional vtable can be fast accessed by the visitor
    947      1.1  mrg   // using index calculation.
    948  1.1.1.4  mrg   template<typename _Array_type, typename _Index_seq>
    949      1.1  mrg     struct __gen_vtable_impl;
    950      1.1  mrg 
    951  1.1.1.3  mrg   // Defines the _S_apply() member that returns a _Multi_array populated
    952  1.1.1.3  mrg   // with function pointers that perform the visitation expressions e(m)
    953  1.1.1.3  mrg   // for each valid pack of indexes into the variant types _Variants.
    954  1.1.1.3  mrg   //
    955  1.1.1.3  mrg   // This partial specialization builds up the index sequences by recursively
    956  1.1.1.3  mrg   // calling _S_apply() on the next specialization of __gen_vtable_impl.
    957  1.1.1.3  mrg   // The base case of the recursion defines the actual function pointers.
    958  1.1.1.4  mrg   template<typename _Result_type, typename _Visitor, size_t... __dimensions,
    959      1.1  mrg 	   typename... _Variants, size_t... __indices>
    960      1.1  mrg     struct __gen_vtable_impl<
    961      1.1  mrg 	_Multi_array<_Result_type (*)(_Visitor, _Variants...), __dimensions...>,
    962  1.1.1.4  mrg 	std::index_sequence<__indices...>>
    963      1.1  mrg     {
    964      1.1  mrg       using _Next =
    965      1.1  mrg 	  remove_reference_t<typename _Nth_type<sizeof...(__indices),
    966      1.1  mrg 			     _Variants...>::type>;
    967      1.1  mrg       using _Array_type =
    968      1.1  mrg 	  _Multi_array<_Result_type (*)(_Visitor, _Variants...),
    969      1.1  mrg 		       __dimensions...>;
    970      1.1  mrg 
    971      1.1  mrg       static constexpr _Array_type
    972      1.1  mrg       _S_apply()
    973      1.1  mrg       {
    974      1.1  mrg 	_Array_type __vtable{};
    975      1.1  mrg 	_S_apply_all_alts(
    976      1.1  mrg 	  __vtable, make_index_sequence<variant_size_v<_Next>>());
    977      1.1  mrg 	return __vtable;
    978      1.1  mrg       }
    979      1.1  mrg 
    980      1.1  mrg       template<size_t... __var_indices>
    981      1.1  mrg 	static constexpr void
    982      1.1  mrg 	_S_apply_all_alts(_Array_type& __vtable,
    983      1.1  mrg 			  std::index_sequence<__var_indices...>)
    984      1.1  mrg 	{
    985  1.1.1.3  mrg 	  if constexpr (_Extra_visit_slot_needed<_Result_type, _Next>::value)
    986  1.1.1.3  mrg 	    (_S_apply_single_alt<true, __var_indices>(
    987  1.1.1.3  mrg 	      __vtable._M_arr[__var_indices + 1],
    988  1.1.1.3  mrg 	      &(__vtable._M_arr[0])), ...);
    989  1.1.1.3  mrg 	  else
    990  1.1.1.3  mrg 	    (_S_apply_single_alt<false, __var_indices>(
    991  1.1.1.3  mrg 	      __vtable._M_arr[__var_indices]), ...);
    992      1.1  mrg 	}
    993      1.1  mrg 
    994  1.1.1.3  mrg       template<bool __do_cookie, size_t __index, typename _Tp>
    995      1.1  mrg 	static constexpr void
    996  1.1.1.3  mrg 	_S_apply_single_alt(_Tp& __element, _Tp* __cookie_element = nullptr)
    997      1.1  mrg 	{
    998  1.1.1.3  mrg 	  if constexpr (__do_cookie)
    999  1.1.1.3  mrg 	    {
   1000  1.1.1.3  mrg 	      __element = __gen_vtable_impl<
   1001  1.1.1.3  mrg 		_Tp,
   1002  1.1.1.3  mrg 		std::index_sequence<__indices..., __index>>::_S_apply();
   1003  1.1.1.3  mrg 	      *__cookie_element = __gen_vtable_impl<
   1004  1.1.1.3  mrg 		_Tp,
   1005  1.1.1.3  mrg 		std::index_sequence<__indices..., variant_npos>>::_S_apply();
   1006  1.1.1.3  mrg 	    }
   1007  1.1.1.3  mrg 	  else
   1008  1.1.1.3  mrg 	    {
   1009  1.1.1.5  mrg 	      auto __tmp_element = __gen_vtable_impl<
   1010  1.1.1.4  mrg 		remove_reference_t<decltype(__element)>,
   1011  1.1.1.3  mrg 		std::index_sequence<__indices..., __index>>::_S_apply();
   1012  1.1.1.5  mrg 	      static_assert(is_same_v<_Tp, decltype(__tmp_element)>,
   1013  1.1.1.5  mrg 			    "std::visit requires the visitor to have the same "
   1014  1.1.1.5  mrg 			    "return type for all alternatives of a variant");
   1015  1.1.1.5  mrg 	      __element = __tmp_element;
   1016  1.1.1.3  mrg 	    }
   1017      1.1  mrg 	}
   1018      1.1  mrg     };
   1019      1.1  mrg 
   1020  1.1.1.3  mrg   // This partial specialization is the base case for the recursion.
   1021  1.1.1.3  mrg   // It populates a _Multi_array element with the address of a function
   1022  1.1.1.3  mrg   // that invokes the visitor with the alternatives specified by __indices.
   1023  1.1.1.4  mrg   template<typename _Result_type, typename _Visitor, typename... _Variants,
   1024      1.1  mrg 	   size_t... __indices>
   1025      1.1  mrg     struct __gen_vtable_impl<
   1026      1.1  mrg       _Multi_array<_Result_type (*)(_Visitor, _Variants...)>,
   1027  1.1.1.4  mrg 		   std::index_sequence<__indices...>>
   1028      1.1  mrg     {
   1029      1.1  mrg       using _Array_type =
   1030  1.1.1.3  mrg 	  _Multi_array<_Result_type (*)(_Visitor, _Variants...)>;
   1031  1.1.1.3  mrg 
   1032  1.1.1.3  mrg       template<size_t __index, typename _Variant>
   1033  1.1.1.3  mrg 	static constexpr decltype(auto)
   1034  1.1.1.3  mrg 	__element_by_index_or_cookie(_Variant&& __var) noexcept
   1035  1.1.1.3  mrg         {
   1036  1.1.1.3  mrg 	  if constexpr (__index != variant_npos)
   1037  1.1.1.3  mrg 	    return __variant::__get<__index>(std::forward<_Variant>(__var));
   1038  1.1.1.3  mrg 	  else
   1039  1.1.1.3  mrg 	    return __variant_cookie{};
   1040  1.1.1.3  mrg 	}
   1041  1.1.1.3  mrg 
   1042  1.1.1.3  mrg       static constexpr decltype(auto)
   1043  1.1.1.4  mrg       __visit_invoke(_Visitor&& __visitor, _Variants... __vars)
   1044  1.1.1.3  mrg       {
   1045  1.1.1.3  mrg 	if constexpr (is_same_v<_Result_type, __variant_idx_cookie>)
   1046  1.1.1.4  mrg 	  // For raw visitation using indices, pass the indices to the visitor
   1047  1.1.1.4  mrg 	  // and discard the return value:
   1048  1.1.1.4  mrg 	  std::__invoke(std::forward<_Visitor>(__visitor),
   1049  1.1.1.3  mrg 	      __element_by_index_or_cookie<__indices>(
   1050  1.1.1.3  mrg 		std::forward<_Variants>(__vars))...,
   1051  1.1.1.3  mrg 	      integral_constant<size_t, __indices>()...);
   1052  1.1.1.4  mrg 	else if constexpr (is_same_v<_Result_type, __variant_cookie>)
   1053  1.1.1.4  mrg 	  // For raw visitation without indices, and discard the return value:
   1054  1.1.1.4  mrg 	  std::__invoke(std::forward<_Visitor>(__visitor),
   1055  1.1.1.3  mrg 	      __element_by_index_or_cookie<__indices>(
   1056  1.1.1.3  mrg 		std::forward<_Variants>(__vars))...);
   1057  1.1.1.4  mrg 	else if constexpr (_Array_type::__result_is_deduced::value)
   1058  1.1.1.4  mrg 	  // For the usual std::visit case deduce the return value:
   1059  1.1.1.3  mrg 	  return std::__invoke(std::forward<_Visitor>(__visitor),
   1060  1.1.1.3  mrg 	      __element_by_index_or_cookie<__indices>(
   1061  1.1.1.3  mrg 		std::forward<_Variants>(__vars))...);
   1062  1.1.1.4  mrg 	else // for std::visit<R> use INVOKE<R>
   1063  1.1.1.4  mrg 	  return std::__invoke_r<_Result_type>(
   1064  1.1.1.4  mrg 	      std::forward<_Visitor>(__visitor),
   1065  1.1.1.4  mrg 	      __variant::__get<__indices>(std::forward<_Variants>(__vars))...);
   1066      1.1  mrg       }
   1067      1.1  mrg 
   1068      1.1  mrg       static constexpr auto
   1069      1.1  mrg       _S_apply()
   1070  1.1.1.5  mrg       {
   1071  1.1.1.5  mrg 	if constexpr (_Array_type::__result_is_deduced::value)
   1072  1.1.1.5  mrg 	  {
   1073  1.1.1.5  mrg 	    constexpr bool __visit_ret_type_mismatch =
   1074  1.1.1.5  mrg 	      !is_same_v<typename _Result_type::type,
   1075  1.1.1.5  mrg 			 decltype(__visit_invoke(std::declval<_Visitor>(),
   1076  1.1.1.5  mrg 				    std::declval<_Variants>()...))>;
   1077  1.1.1.5  mrg 	    if constexpr (__visit_ret_type_mismatch)
   1078  1.1.1.5  mrg 	      {
   1079  1.1.1.5  mrg 		struct __cannot_match {};
   1080  1.1.1.5  mrg 		return __cannot_match{};
   1081  1.1.1.5  mrg 	      }
   1082  1.1.1.5  mrg 	    else
   1083  1.1.1.5  mrg 	      return _Array_type{&__visit_invoke};
   1084  1.1.1.5  mrg 	  }
   1085  1.1.1.5  mrg 	else
   1086  1.1.1.5  mrg 	  return _Array_type{&__visit_invoke};
   1087  1.1.1.5  mrg       }
   1088      1.1  mrg     };
   1089      1.1  mrg 
   1090  1.1.1.4  mrg   template<typename _Result_type, typename _Visitor, typename... _Variants>
   1091      1.1  mrg     struct __gen_vtable
   1092      1.1  mrg     {
   1093      1.1  mrg       using _Array_type =
   1094  1.1.1.3  mrg 	  _Multi_array<_Result_type (*)(_Visitor, _Variants...),
   1095      1.1  mrg 		       variant_size_v<remove_reference_t<_Variants>>...>;
   1096      1.1  mrg 
   1097  1.1.1.3  mrg       static constexpr _Array_type _S_vtable
   1098  1.1.1.4  mrg 	= __gen_vtable_impl<_Array_type, std::index_sequence<>>::_S_apply();
   1099      1.1  mrg     };
   1100      1.1  mrg 
   1101      1.1  mrg   template<size_t _Np, typename _Tp>
   1102      1.1  mrg     struct _Base_dedup : public _Tp { };
   1103      1.1  mrg 
   1104      1.1  mrg   template<typename _Variant, typename __indices>
   1105      1.1  mrg     struct _Variant_hash_base;
   1106      1.1  mrg 
   1107      1.1  mrg   template<typename... _Types, size_t... __indices>
   1108      1.1  mrg     struct _Variant_hash_base<variant<_Types...>,
   1109      1.1  mrg 			      std::index_sequence<__indices...>>
   1110      1.1  mrg     : _Base_dedup<__indices, __poison_hash<remove_const_t<_Types>>>... { };
   1111      1.1  mrg 
   1112  1.1.1.5  mrg   // Equivalent to decltype(get<_Np>(as-variant(declval<_Variant>())))
   1113  1.1.1.5  mrg   template<size_t _Np, typename _Variant,
   1114  1.1.1.5  mrg       typename _AsV = decltype(__variant::__as(std::declval<_Variant>())),
   1115  1.1.1.5  mrg       typename _Tp = variant_alternative_t<_Np, remove_reference_t<_AsV>>>
   1116  1.1.1.5  mrg     using __get_t
   1117  1.1.1.5  mrg       = __conditional_t<is_lvalue_reference_v<_Variant>, _Tp&, _Tp&&>;
   1118  1.1.1.4  mrg 
   1119  1.1.1.4  mrg   // Return type of std::visit.
   1120  1.1.1.4  mrg   template<typename _Visitor, typename... _Variants>
   1121  1.1.1.4  mrg     using __visit_result_t
   1122  1.1.1.4  mrg       = invoke_result_t<_Visitor, __get_t<0, _Variants>...>;
   1123  1.1.1.4  mrg 
   1124  1.1.1.5  mrg   template<typename _Tp, typename... _Types>
   1125  1.1.1.5  mrg     constexpr inline bool __same_types = (is_same_v<_Tp, _Types> && ...);
   1126      1.1  mrg 
   1127  1.1.1.5  mrg   template <typename _Visitor, typename _Variant, size_t... _Idxs>
   1128  1.1.1.5  mrg     constexpr bool __check_visitor_results(std::index_sequence<_Idxs...>)
   1129  1.1.1.3  mrg     {
   1130  1.1.1.5  mrg       return __same_types<
   1131  1.1.1.5  mrg 	invoke_result_t<_Visitor, __get_t<_Idxs, _Variant>>...
   1132  1.1.1.5  mrg 	>;
   1133  1.1.1.3  mrg     }
   1134  1.1.1.3  mrg 
   1135  1.1.1.5  mrg } // namespace __variant
   1136  1.1.1.5  mrg } // namespace __detail
   1137  1.1.1.5  mrg 
   1138      1.1  mrg   template<typename _Tp, typename... _Types>
   1139  1.1.1.2  mrg     constexpr bool
   1140  1.1.1.2  mrg     holds_alternative(const variant<_Types...>& __v) noexcept
   1141      1.1  mrg     {
   1142      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1143  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1144  1.1.1.5  mrg       return __v.index() == std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1145      1.1  mrg     }
   1146      1.1  mrg 
   1147      1.1  mrg   template<typename _Tp, typename... _Types>
   1148  1.1.1.5  mrg     constexpr _Tp&
   1149  1.1.1.5  mrg     get(variant<_Types...>& __v)
   1150      1.1  mrg     {
   1151      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1152  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1153  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1154  1.1.1.5  mrg       return std::get<__n>(__v);
   1155      1.1  mrg     }
   1156      1.1  mrg 
   1157      1.1  mrg   template<typename _Tp, typename... _Types>
   1158  1.1.1.5  mrg     constexpr _Tp&&
   1159  1.1.1.5  mrg     get(variant<_Types...>&& __v)
   1160      1.1  mrg     {
   1161      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1162  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1163  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1164  1.1.1.5  mrg       return std::get<__n>(std::move(__v));
   1165      1.1  mrg     }
   1166      1.1  mrg 
   1167      1.1  mrg   template<typename _Tp, typename... _Types>
   1168  1.1.1.5  mrg     constexpr const _Tp&
   1169  1.1.1.5  mrg     get(const variant<_Types...>& __v)
   1170      1.1  mrg     {
   1171      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1172  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1173  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1174  1.1.1.5  mrg       return std::get<__n>(__v);
   1175      1.1  mrg     }
   1176      1.1  mrg 
   1177      1.1  mrg   template<typename _Tp, typename... _Types>
   1178  1.1.1.5  mrg     constexpr const _Tp&&
   1179  1.1.1.5  mrg     get(const variant<_Types...>&& __v)
   1180      1.1  mrg     {
   1181      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1182  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1183  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1184  1.1.1.5  mrg       return std::get<__n>(std::move(__v));
   1185      1.1  mrg     }
   1186      1.1  mrg 
   1187      1.1  mrg   template<size_t _Np, typename... _Types>
   1188  1.1.1.2  mrg     constexpr add_pointer_t<variant_alternative_t<_Np, variant<_Types...>>>
   1189      1.1  mrg     get_if(variant<_Types...>* __ptr) noexcept
   1190      1.1  mrg     {
   1191      1.1  mrg       using _Alternative_type = variant_alternative_t<_Np, variant<_Types...>>;
   1192      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1193  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1194  1.1.1.4  mrg       static_assert(!is_void_v<_Alternative_type>, "_Tp must not be void");
   1195      1.1  mrg       if (__ptr && __ptr->index() == _Np)
   1196  1.1.1.3  mrg 	return std::addressof(__detail::__variant::__get<_Np>(*__ptr));
   1197      1.1  mrg       return nullptr;
   1198      1.1  mrg     }
   1199      1.1  mrg 
   1200      1.1  mrg   template<size_t _Np, typename... _Types>
   1201  1.1.1.2  mrg     constexpr
   1202      1.1  mrg     add_pointer_t<const variant_alternative_t<_Np, variant<_Types...>>>
   1203      1.1  mrg     get_if(const variant<_Types...>* __ptr) noexcept
   1204      1.1  mrg     {
   1205      1.1  mrg       using _Alternative_type = variant_alternative_t<_Np, variant<_Types...>>;
   1206      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1207  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1208  1.1.1.4  mrg       static_assert(!is_void_v<_Alternative_type>, "_Tp must not be void");
   1209      1.1  mrg       if (__ptr && __ptr->index() == _Np)
   1210  1.1.1.3  mrg 	return std::addressof(__detail::__variant::__get<_Np>(*__ptr));
   1211      1.1  mrg       return nullptr;
   1212      1.1  mrg     }
   1213      1.1  mrg 
   1214      1.1  mrg   template<typename _Tp, typename... _Types>
   1215  1.1.1.2  mrg     constexpr add_pointer_t<_Tp>
   1216      1.1  mrg     get_if(variant<_Types...>* __ptr) noexcept
   1217      1.1  mrg     {
   1218      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1219  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1220  1.1.1.4  mrg       static_assert(!is_void_v<_Tp>, "_Tp must not be void");
   1221  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1222  1.1.1.5  mrg       return std::get_if<__n>(__ptr);
   1223      1.1  mrg     }
   1224      1.1  mrg 
   1225      1.1  mrg   template<typename _Tp, typename... _Types>
   1226  1.1.1.2  mrg     constexpr add_pointer_t<const _Tp>
   1227  1.1.1.3  mrg     get_if(const variant<_Types...>* __ptr) noexcept
   1228      1.1  mrg     {
   1229      1.1  mrg       static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
   1230  1.1.1.4  mrg 		    "T must occur exactly once in alternatives");
   1231  1.1.1.4  mrg       static_assert(!is_void_v<_Tp>, "_Tp must not be void");
   1232  1.1.1.5  mrg       constexpr size_t __n = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1233  1.1.1.5  mrg       return std::get_if<__n>(__ptr);
   1234      1.1  mrg     }
   1235      1.1  mrg 
   1236      1.1  mrg   struct monostate { };
   1237      1.1  mrg 
   1238      1.1  mrg #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP, __NAME) \
   1239      1.1  mrg   template<typename... _Types> \
   1240      1.1  mrg     constexpr bool operator __OP(const variant<_Types...>& __lhs, \
   1241      1.1  mrg 				 const variant<_Types...>& __rhs) \
   1242      1.1  mrg     { \
   1243  1.1.1.3  mrg       bool __ret = true; \
   1244  1.1.1.4  mrg       __detail::__variant::__raw_idx_visit( \
   1245  1.1.1.4  mrg         [&__ret, &__lhs] (auto&& __rhs_mem, auto __rhs_index) mutable \
   1246  1.1.1.3  mrg         { \
   1247  1.1.1.3  mrg 	  if constexpr (__rhs_index != variant_npos) \
   1248  1.1.1.3  mrg 	    { \
   1249  1.1.1.3  mrg 	      if (__lhs.index() == __rhs_index) \
   1250  1.1.1.3  mrg 	        { \
   1251  1.1.1.3  mrg 		  auto& __this_mem = std::get<__rhs_index>(__lhs);	\
   1252  1.1.1.3  mrg                   __ret = __this_mem __OP __rhs_mem; \
   1253  1.1.1.3  mrg                 } \
   1254  1.1.1.3  mrg 	      else \
   1255  1.1.1.3  mrg 		__ret = (__lhs.index() + 1) __OP (__rhs_index + 1); \
   1256  1.1.1.3  mrg             } \
   1257  1.1.1.3  mrg           else \
   1258  1.1.1.3  mrg             __ret = (__lhs.index() + 1) __OP (__rhs_index + 1); \
   1259  1.1.1.3  mrg 	}, __rhs); \
   1260  1.1.1.3  mrg       return __ret; \
   1261  1.1.1.4  mrg     }
   1262      1.1  mrg 
   1263      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(<, less)
   1264      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(<=, less_equal)
   1265      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(==, equal)
   1266      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(!=, not_equal)
   1267      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(>=, greater_equal)
   1268      1.1  mrg   _VARIANT_RELATION_FUNCTION_TEMPLATE(>, greater)
   1269      1.1  mrg 
   1270      1.1  mrg #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
   1271      1.1  mrg 
   1272  1.1.1.4  mrg   constexpr bool operator==(monostate, monostate) noexcept { return true; }
   1273  1.1.1.4  mrg 
   1274  1.1.1.4  mrg #ifdef __cpp_lib_three_way_comparison
   1275  1.1.1.4  mrg   template<typename... _Types>
   1276  1.1.1.4  mrg     requires (three_way_comparable<_Types> && ...)
   1277  1.1.1.4  mrg     constexpr
   1278  1.1.1.4  mrg     common_comparison_category_t<compare_three_way_result_t<_Types>...>
   1279  1.1.1.4  mrg     operator<=>(const variant<_Types...>& __v, const variant<_Types...>& __w)
   1280  1.1.1.4  mrg     {
   1281  1.1.1.4  mrg       common_comparison_category_t<compare_three_way_result_t<_Types>...> __ret
   1282  1.1.1.4  mrg 	= strong_ordering::equal;
   1283  1.1.1.4  mrg 
   1284  1.1.1.4  mrg       __detail::__variant::__raw_idx_visit(
   1285  1.1.1.4  mrg 	[&__ret, &__v] (auto&& __w_mem, auto __w_index) mutable
   1286  1.1.1.4  mrg 	{
   1287  1.1.1.4  mrg 	  if constexpr (__w_index != variant_npos)
   1288  1.1.1.4  mrg 	    {
   1289  1.1.1.4  mrg 	      if (__v.index() == __w_index)
   1290  1.1.1.4  mrg 		{
   1291  1.1.1.4  mrg 		  auto& __this_mem = std::get<__w_index>(__v);
   1292  1.1.1.4  mrg 		  __ret = __this_mem <=> __w_mem;
   1293  1.1.1.4  mrg 		  return;
   1294  1.1.1.4  mrg 		}
   1295  1.1.1.4  mrg 	    }
   1296  1.1.1.4  mrg 	  __ret = (__v.index() + 1) <=> (__w_index + 1);
   1297  1.1.1.4  mrg 	}, __w);
   1298  1.1.1.4  mrg       return __ret;
   1299  1.1.1.4  mrg     }
   1300  1.1.1.4  mrg 
   1301  1.1.1.4  mrg   constexpr strong_ordering
   1302  1.1.1.4  mrg   operator<=>(monostate, monostate) noexcept { return strong_ordering::equal; }
   1303  1.1.1.4  mrg #else
   1304  1.1.1.4  mrg   constexpr bool operator!=(monostate, monostate) noexcept { return false; }
   1305  1.1.1.4  mrg   constexpr bool operator<(monostate, monostate) noexcept { return false; }
   1306  1.1.1.4  mrg   constexpr bool operator>(monostate, monostate) noexcept { return false; }
   1307  1.1.1.4  mrg   constexpr bool operator<=(monostate, monostate) noexcept { return true; }
   1308  1.1.1.4  mrg   constexpr bool operator>=(monostate, monostate) noexcept { return true; }
   1309  1.1.1.4  mrg #endif
   1310  1.1.1.4  mrg 
   1311      1.1  mrg   template<typename _Visitor, typename... _Variants>
   1312  1.1.1.4  mrg     constexpr __detail::__variant::__visit_result_t<_Visitor, _Variants...>
   1313  1.1.1.4  mrg     visit(_Visitor&&, _Variants&&...);
   1314      1.1  mrg 
   1315      1.1  mrg   template<typename... _Types>
   1316  1.1.1.5  mrg     _GLIBCXX20_CONSTEXPR
   1317      1.1  mrg     inline enable_if_t<(is_move_constructible_v<_Types> && ...)
   1318      1.1  mrg 			&& (is_swappable_v<_Types> && ...)>
   1319      1.1  mrg     swap(variant<_Types...>& __lhs, variant<_Types...>& __rhs)
   1320      1.1  mrg     noexcept(noexcept(__lhs.swap(__rhs)))
   1321      1.1  mrg     { __lhs.swap(__rhs); }
   1322      1.1  mrg 
   1323      1.1  mrg   template<typename... _Types>
   1324      1.1  mrg     enable_if_t<!((is_move_constructible_v<_Types> && ...)
   1325      1.1  mrg 		   && (is_swappable_v<_Types> && ...))>
   1326      1.1  mrg     swap(variant<_Types...>&, variant<_Types...>&) = delete;
   1327      1.1  mrg 
   1328      1.1  mrg   class bad_variant_access : public exception
   1329      1.1  mrg   {
   1330      1.1  mrg   public:
   1331  1.1.1.4  mrg     bad_variant_access() noexcept { }
   1332  1.1.1.4  mrg 
   1333      1.1  mrg     const char* what() const noexcept override
   1334      1.1  mrg     { return _M_reason; }
   1335      1.1  mrg 
   1336      1.1  mrg   private:
   1337  1.1.1.4  mrg     bad_variant_access(const char* __reason) noexcept : _M_reason(__reason) { }
   1338      1.1  mrg 
   1339  1.1.1.4  mrg     // Must point to a string with static storage duration:
   1340  1.1.1.4  mrg     const char* _M_reason = "bad variant access";
   1341      1.1  mrg 
   1342      1.1  mrg     friend void __throw_bad_variant_access(const char* __what);
   1343      1.1  mrg   };
   1344      1.1  mrg 
   1345  1.1.1.4  mrg   // Must only be called with a string literal
   1346      1.1  mrg   inline void
   1347      1.1  mrg   __throw_bad_variant_access(const char* __what)
   1348      1.1  mrg   { _GLIBCXX_THROW_OR_ABORT(bad_variant_access(__what)); }
   1349      1.1  mrg 
   1350  1.1.1.4  mrg   inline void
   1351  1.1.1.4  mrg   __throw_bad_variant_access(bool __valueless)
   1352  1.1.1.4  mrg   {
   1353  1.1.1.4  mrg     if (__valueless) [[__unlikely__]]
   1354  1.1.1.4  mrg       __throw_bad_variant_access("std::get: variant is valueless");
   1355  1.1.1.4  mrg     else
   1356  1.1.1.4  mrg       __throw_bad_variant_access("std::get: wrong index for variant");
   1357  1.1.1.4  mrg   }
   1358  1.1.1.4  mrg 
   1359      1.1  mrg   template<typename... _Types>
   1360      1.1  mrg     class variant
   1361      1.1  mrg     : private __detail::__variant::_Variant_base<_Types...>,
   1362      1.1  mrg       private _Enable_default_constructor<
   1363  1.1.1.2  mrg 	__detail::__variant::_Traits<_Types...>::_S_default_ctor,
   1364  1.1.1.2  mrg 	  variant<_Types...>>,
   1365      1.1  mrg       private _Enable_copy_move<
   1366  1.1.1.2  mrg 	__detail::__variant::_Traits<_Types...>::_S_copy_ctor,
   1367  1.1.1.2  mrg 	__detail::__variant::_Traits<_Types...>::_S_copy_assign,
   1368  1.1.1.2  mrg 	__detail::__variant::_Traits<_Types...>::_S_move_ctor,
   1369  1.1.1.2  mrg 	__detail::__variant::_Traits<_Types...>::_S_move_assign,
   1370      1.1  mrg 	variant<_Types...>>
   1371      1.1  mrg     {
   1372      1.1  mrg     private:
   1373  1.1.1.3  mrg       template <typename... _UTypes, typename _Tp>
   1374  1.1.1.5  mrg 	friend _GLIBCXX20_CONSTEXPR decltype(auto)
   1375  1.1.1.5  mrg 	__variant_cast(_Tp&&);
   1376  1.1.1.3  mrg 
   1377      1.1  mrg       static_assert(sizeof...(_Types) > 0,
   1378      1.1  mrg 		    "variant must have at least one alternative");
   1379      1.1  mrg       static_assert(!(std::is_reference_v<_Types> || ...),
   1380      1.1  mrg 		    "variant must have no reference alternative");
   1381      1.1  mrg       static_assert(!(std::is_void_v<_Types> || ...),
   1382      1.1  mrg 		    "variant must have no void alternative");
   1383      1.1  mrg 
   1384      1.1  mrg       using _Base = __detail::__variant::_Variant_base<_Types...>;
   1385      1.1  mrg       using _Default_ctor_enabler =
   1386      1.1  mrg 	_Enable_default_constructor<
   1387  1.1.1.2  mrg 	  __detail::__variant::_Traits<_Types...>::_S_default_ctor,
   1388  1.1.1.2  mrg 	    variant<_Types...>>;
   1389      1.1  mrg 
   1390      1.1  mrg       template<typename _Tp>
   1391  1.1.1.3  mrg 	static constexpr bool __not_self
   1392  1.1.1.3  mrg 	  = !is_same_v<__remove_cvref_t<_Tp>, variant>;
   1393  1.1.1.3  mrg 
   1394  1.1.1.3  mrg       template<typename _Tp>
   1395      1.1  mrg 	static constexpr bool
   1396      1.1  mrg 	__exactly_once = __detail::__variant::__exactly_once<_Tp, _Types...>;
   1397      1.1  mrg 
   1398      1.1  mrg       template<typename _Tp>
   1399  1.1.1.4  mrg 	static constexpr size_t __accepted_index
   1400  1.1.1.4  mrg 	  = __detail::__variant::__accepted_index<_Tp, variant>::value;
   1401      1.1  mrg 
   1402  1.1.1.3  mrg       template<size_t _Np, typename = enable_if_t<(_Np < sizeof...(_Types))>>
   1403  1.1.1.5  mrg 	using __to_type = typename _Nth_type<_Np, _Types...>::type;
   1404      1.1  mrg 
   1405  1.1.1.3  mrg       template<typename _Tp, typename = enable_if_t<__not_self<_Tp>>>
   1406      1.1  mrg 	using __accepted_type = __to_type<__accepted_index<_Tp>>;
   1407      1.1  mrg 
   1408      1.1  mrg       template<typename _Tp>
   1409  1.1.1.5  mrg 	static constexpr size_t __index_of
   1410  1.1.1.5  mrg 	  = std::__find_uniq_type_in_pack<_Tp, _Types...>();
   1411      1.1  mrg 
   1412  1.1.1.2  mrg       using _Traits = __detail::__variant::_Traits<_Types...>;
   1413  1.1.1.2  mrg 
   1414  1.1.1.2  mrg       template<typename _Tp>
   1415  1.1.1.2  mrg 	struct __is_in_place_tag : false_type { };
   1416  1.1.1.2  mrg       template<typename _Tp>
   1417  1.1.1.2  mrg 	struct __is_in_place_tag<in_place_type_t<_Tp>> : true_type { };
   1418  1.1.1.2  mrg       template<size_t _Np>
   1419  1.1.1.2  mrg 	struct __is_in_place_tag<in_place_index_t<_Np>> : true_type { };
   1420  1.1.1.2  mrg 
   1421  1.1.1.2  mrg       template<typename _Tp>
   1422  1.1.1.2  mrg 	static constexpr bool __not_in_place_tag
   1423  1.1.1.3  mrg 	  = !__is_in_place_tag<__remove_cvref_t<_Tp>>::value;
   1424  1.1.1.2  mrg 
   1425      1.1  mrg     public:
   1426  1.1.1.2  mrg       variant() = default;
   1427  1.1.1.2  mrg       variant(const variant& __rhs) = default;
   1428  1.1.1.2  mrg       variant(variant&&) = default;
   1429  1.1.1.2  mrg       variant& operator=(const variant&) = default;
   1430  1.1.1.2  mrg       variant& operator=(variant&&) = default;
   1431  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR ~variant() = default;
   1432      1.1  mrg 
   1433      1.1  mrg       template<typename _Tp,
   1434  1.1.1.3  mrg 	       typename = enable_if_t<sizeof...(_Types) != 0>,
   1435  1.1.1.2  mrg 	       typename = enable_if_t<__not_in_place_tag<_Tp>>,
   1436  1.1.1.3  mrg 	       typename _Tj = __accepted_type<_Tp&&>,
   1437  1.1.1.3  mrg 	       typename = enable_if_t<__exactly_once<_Tj>
   1438  1.1.1.3  mrg 				      && is_constructible_v<_Tj, _Tp>>>
   1439      1.1  mrg 	constexpr
   1440      1.1  mrg 	variant(_Tp&& __t)
   1441  1.1.1.3  mrg 	noexcept(is_nothrow_constructible_v<_Tj, _Tp>)
   1442  1.1.1.4  mrg 	: variant(in_place_index<__accepted_index<_Tp>>,
   1443  1.1.1.2  mrg 		  std::forward<_Tp>(__t))
   1444  1.1.1.3  mrg 	{ }
   1445      1.1  mrg 
   1446      1.1  mrg       template<typename _Tp, typename... _Args,
   1447      1.1  mrg 	       typename = enable_if_t<__exactly_once<_Tp>
   1448  1.1.1.3  mrg 				      && is_constructible_v<_Tp, _Args...>>>
   1449      1.1  mrg 	constexpr explicit
   1450      1.1  mrg 	variant(in_place_type_t<_Tp>, _Args&&... __args)
   1451  1.1.1.2  mrg 	: variant(in_place_index<__index_of<_Tp>>,
   1452  1.1.1.2  mrg 		  std::forward<_Args>(__args)...)
   1453  1.1.1.3  mrg 	{ }
   1454      1.1  mrg 
   1455      1.1  mrg       template<typename _Tp, typename _Up, typename... _Args,
   1456      1.1  mrg 	       typename = enable_if_t<__exactly_once<_Tp>
   1457  1.1.1.3  mrg 				      && is_constructible_v<_Tp,
   1458  1.1.1.3  mrg 					   initializer_list<_Up>&, _Args...>>>
   1459      1.1  mrg 	constexpr explicit
   1460      1.1  mrg 	variant(in_place_type_t<_Tp>, initializer_list<_Up> __il,
   1461      1.1  mrg 		_Args&&... __args)
   1462      1.1  mrg 	: variant(in_place_index<__index_of<_Tp>>, __il,
   1463      1.1  mrg 		  std::forward<_Args>(__args)...)
   1464  1.1.1.3  mrg 	{ }
   1465      1.1  mrg 
   1466      1.1  mrg       template<size_t _Np, typename... _Args,
   1467  1.1.1.3  mrg 	       typename _Tp = __to_type<_Np>,
   1468  1.1.1.3  mrg 	       typename = enable_if_t<is_constructible_v<_Tp, _Args...>>>
   1469      1.1  mrg 	constexpr explicit
   1470      1.1  mrg 	variant(in_place_index_t<_Np>, _Args&&... __args)
   1471      1.1  mrg 	: _Base(in_place_index<_Np>, std::forward<_Args>(__args)...),
   1472      1.1  mrg 	_Default_ctor_enabler(_Enable_default_constructor_tag{})
   1473  1.1.1.3  mrg 	{ }
   1474      1.1  mrg 
   1475      1.1  mrg       template<size_t _Np, typename _Up, typename... _Args,
   1476  1.1.1.3  mrg 	       typename _Tp = __to_type<_Np>,
   1477  1.1.1.3  mrg 	       typename = enable_if_t<is_constructible_v<_Tp,
   1478  1.1.1.3  mrg 							 initializer_list<_Up>&,
   1479  1.1.1.3  mrg 							 _Args...>>>
   1480      1.1  mrg 	constexpr explicit
   1481      1.1  mrg 	variant(in_place_index_t<_Np>, initializer_list<_Up> __il,
   1482      1.1  mrg 		_Args&&... __args)
   1483      1.1  mrg 	: _Base(in_place_index<_Np>, __il, std::forward<_Args>(__args)...),
   1484      1.1  mrg 	_Default_ctor_enabler(_Enable_default_constructor_tag{})
   1485  1.1.1.3  mrg 	{ }
   1486      1.1  mrg 
   1487      1.1  mrg       template<typename _Tp>
   1488  1.1.1.5  mrg 	_GLIBCXX20_CONSTEXPR
   1489      1.1  mrg 	enable_if_t<__exactly_once<__accepted_type<_Tp&&>>
   1490  1.1.1.3  mrg 		    && is_constructible_v<__accepted_type<_Tp&&>, _Tp>
   1491  1.1.1.3  mrg 		    && is_assignable_v<__accepted_type<_Tp&&>&, _Tp>,
   1492  1.1.1.3  mrg 		    variant&>
   1493      1.1  mrg 	operator=(_Tp&& __rhs)
   1494  1.1.1.3  mrg 	noexcept(is_nothrow_assignable_v<__accepted_type<_Tp&&>&, _Tp>
   1495  1.1.1.3  mrg 		 && is_nothrow_constructible_v<__accepted_type<_Tp&&>, _Tp>)
   1496      1.1  mrg 	{
   1497  1.1.1.4  mrg 	  constexpr auto __index = __accepted_index<_Tp>;
   1498      1.1  mrg 	  if (index() == __index)
   1499      1.1  mrg 	    std::get<__index>(*this) = std::forward<_Tp>(__rhs);
   1500      1.1  mrg 	  else
   1501  1.1.1.3  mrg 	    {
   1502  1.1.1.3  mrg 	      using _Tj = __accepted_type<_Tp&&>;
   1503  1.1.1.3  mrg 	      if constexpr (is_nothrow_constructible_v<_Tj, _Tp>
   1504  1.1.1.3  mrg 			    || !is_nothrow_move_constructible_v<_Tj>)
   1505  1.1.1.3  mrg 		this->emplace<__index>(std::forward<_Tp>(__rhs));
   1506  1.1.1.3  mrg 	      else
   1507  1.1.1.5  mrg 		// _GLIBCXX_RESOLVE_LIB_DEFECTS
   1508  1.1.1.5  mrg 		// 3585. converting assignment with immovable alternative
   1509  1.1.1.5  mrg 		this->emplace<__index>(_Tj(std::forward<_Tp>(__rhs)));
   1510  1.1.1.3  mrg 	    }
   1511      1.1  mrg 	  return *this;
   1512      1.1  mrg 	}
   1513      1.1  mrg 
   1514      1.1  mrg       template<typename _Tp, typename... _Args>
   1515  1.1.1.5  mrg 	_GLIBCXX20_CONSTEXPR
   1516      1.1  mrg 	enable_if_t<is_constructible_v<_Tp, _Args...> && __exactly_once<_Tp>,
   1517      1.1  mrg 		    _Tp&>
   1518      1.1  mrg 	emplace(_Args&&... __args)
   1519      1.1  mrg 	{
   1520  1.1.1.3  mrg 	  constexpr size_t __index = __index_of<_Tp>;
   1521  1.1.1.3  mrg 	  return this->emplace<__index>(std::forward<_Args>(__args)...);
   1522      1.1  mrg 	}
   1523      1.1  mrg 
   1524      1.1  mrg       template<typename _Tp, typename _Up, typename... _Args>
   1525  1.1.1.5  mrg 	_GLIBCXX20_CONSTEXPR
   1526      1.1  mrg 	enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
   1527      1.1  mrg 		    && __exactly_once<_Tp>,
   1528      1.1  mrg 		    _Tp&>
   1529      1.1  mrg 	emplace(initializer_list<_Up> __il, _Args&&... __args)
   1530      1.1  mrg 	{
   1531  1.1.1.3  mrg 	  constexpr size_t __index = __index_of<_Tp>;
   1532  1.1.1.3  mrg 	  return this->emplace<__index>(__il, std::forward<_Args>(__args)...);
   1533      1.1  mrg 	}
   1534      1.1  mrg 
   1535      1.1  mrg       template<size_t _Np, typename... _Args>
   1536  1.1.1.5  mrg 	_GLIBCXX20_CONSTEXPR
   1537  1.1.1.5  mrg 	enable_if_t<is_constructible_v<__to_type<_Np>, _Args...>,
   1538  1.1.1.5  mrg 		    __to_type<_Np>&>
   1539      1.1  mrg 	emplace(_Args&&... __args)
   1540      1.1  mrg 	{
   1541  1.1.1.5  mrg 	  namespace __variant = std::__detail::__variant;
   1542  1.1.1.5  mrg 	  using type = typename _Nth_type<_Np, _Types...>::type;
   1543  1.1.1.3  mrg 	  // Provide the strong exception-safety guarantee when possible,
   1544  1.1.1.3  mrg 	  // to avoid becoming valueless.
   1545  1.1.1.3  mrg 	  if constexpr (is_nothrow_constructible_v<type, _Args...>)
   1546      1.1  mrg 	    {
   1547  1.1.1.5  mrg 	      __variant::__emplace<_Np>(*this, std::forward<_Args>(__args)...);
   1548      1.1  mrg 	    }
   1549  1.1.1.3  mrg 	  else if constexpr (is_scalar_v<type>)
   1550      1.1  mrg 	    {
   1551  1.1.1.3  mrg 	      // This might invoke a potentially-throwing conversion operator:
   1552  1.1.1.3  mrg 	      const type __tmp(std::forward<_Args>(__args)...);
   1553  1.1.1.5  mrg 	      // But this won't throw:
   1554  1.1.1.5  mrg 	      __variant::__emplace<_Np>(*this, __tmp);
   1555  1.1.1.3  mrg 	    }
   1556  1.1.1.5  mrg 	  else if constexpr (__variant::_Never_valueless_alt<type>()
   1557  1.1.1.3  mrg 	      && _Traits::_S_move_assign)
   1558  1.1.1.3  mrg 	    {
   1559  1.1.1.3  mrg 	      // This construction might throw:
   1560  1.1.1.3  mrg 	      variant __tmp(in_place_index<_Np>,
   1561  1.1.1.3  mrg 			    std::forward<_Args>(__args)...);
   1562  1.1.1.3  mrg 	      // But _Never_valueless_alt<type> means this won't:
   1563  1.1.1.3  mrg 	      *this = std::move(__tmp);
   1564  1.1.1.3  mrg 	    }
   1565  1.1.1.3  mrg 	  else
   1566  1.1.1.3  mrg 	    {
   1567  1.1.1.3  mrg 	      // This case only provides the basic exception-safety guarantee,
   1568  1.1.1.3  mrg 	      // i.e. the variant can become valueless.
   1569  1.1.1.5  mrg 	      __variant::__emplace<_Np>(*this, std::forward<_Args>(__args)...);
   1570      1.1  mrg 	    }
   1571      1.1  mrg 	  return std::get<_Np>(*this);
   1572      1.1  mrg 	}
   1573      1.1  mrg 
   1574      1.1  mrg       template<size_t _Np, typename _Up, typename... _Args>
   1575  1.1.1.5  mrg 	_GLIBCXX20_CONSTEXPR
   1576  1.1.1.5  mrg 	enable_if_t<is_constructible_v<__to_type<_Np>,
   1577      1.1  mrg 				       initializer_list<_Up>&, _Args...>,
   1578  1.1.1.5  mrg 		    __to_type<_Np>&>
   1579      1.1  mrg 	emplace(initializer_list<_Up> __il, _Args&&... __args)
   1580      1.1  mrg 	{
   1581  1.1.1.5  mrg 	  namespace __variant = std::__detail::__variant;
   1582  1.1.1.5  mrg 	  using type = typename _Nth_type<_Np, _Types...>::type;
   1583  1.1.1.3  mrg 	  // Provide the strong exception-safety guarantee when possible,
   1584  1.1.1.3  mrg 	  // to avoid becoming valueless.
   1585  1.1.1.3  mrg 	  if constexpr (is_nothrow_constructible_v<type,
   1586  1.1.1.3  mrg 						   initializer_list<_Up>&,
   1587  1.1.1.3  mrg 						   _Args...>)
   1588      1.1  mrg 	    {
   1589  1.1.1.5  mrg 	      __variant::__emplace<_Np>(*this, __il,
   1590  1.1.1.5  mrg 					std::forward<_Args>(__args)...);
   1591      1.1  mrg 	    }
   1592  1.1.1.5  mrg 	  else if constexpr (__variant::_Never_valueless_alt<type>()
   1593  1.1.1.3  mrg 	      && _Traits::_S_move_assign)
   1594      1.1  mrg 	    {
   1595  1.1.1.3  mrg 	      // This construction might throw:
   1596  1.1.1.3  mrg 	      variant __tmp(in_place_index<_Np>, __il,
   1597  1.1.1.3  mrg 			    std::forward<_Args>(__args)...);
   1598  1.1.1.3  mrg 	      // But _Never_valueless_alt<type> means this won't:
   1599  1.1.1.3  mrg 	      *this = std::move(__tmp);
   1600  1.1.1.3  mrg 	    }
   1601  1.1.1.3  mrg 	  else
   1602  1.1.1.3  mrg 	    {
   1603  1.1.1.3  mrg 	      // This case only provides the basic exception-safety guarantee,
   1604  1.1.1.3  mrg 	      // i.e. the variant can become valueless.
   1605  1.1.1.5  mrg 	      __variant::__emplace<_Np>(*this, __il,
   1606  1.1.1.5  mrg 					std::forward<_Args>(__args)...);
   1607      1.1  mrg 	    }
   1608      1.1  mrg 	  return std::get<_Np>(*this);
   1609      1.1  mrg 	}
   1610      1.1  mrg 
   1611  1.1.1.5  mrg       template<size_t _Np, typename... _Args>
   1612  1.1.1.5  mrg 	enable_if_t<!(_Np < sizeof...(_Types))> emplace(_Args&&...) = delete;
   1613  1.1.1.5  mrg 
   1614  1.1.1.5  mrg       template<typename _Tp, typename... _Args>
   1615  1.1.1.5  mrg 	enable_if_t<!__exactly_once<_Tp>> emplace(_Args&&...) = delete;
   1616  1.1.1.5  mrg 
   1617      1.1  mrg       constexpr bool valueless_by_exception() const noexcept
   1618      1.1  mrg       { return !this->_M_valid(); }
   1619      1.1  mrg 
   1620      1.1  mrg       constexpr size_t index() const noexcept
   1621      1.1  mrg       {
   1622  1.1.1.4  mrg 	using __index_type = typename _Base::__index_type;
   1623  1.1.1.4  mrg 	if constexpr (__detail::__variant::__never_valueless<_Types...>())
   1624  1.1.1.4  mrg 	  return this->_M_index;
   1625  1.1.1.4  mrg 	else if constexpr (sizeof...(_Types) <= __index_type(-1) / 2)
   1626  1.1.1.4  mrg 	  return make_signed_t<__index_type>(this->_M_index);
   1627  1.1.1.4  mrg 	else
   1628  1.1.1.4  mrg 	  return size_t(__index_type(this->_M_index + 1)) - 1;
   1629      1.1  mrg       }
   1630      1.1  mrg 
   1631  1.1.1.5  mrg       _GLIBCXX20_CONSTEXPR
   1632      1.1  mrg       void
   1633      1.1  mrg       swap(variant& __rhs)
   1634      1.1  mrg       noexcept((__is_nothrow_swappable<_Types>::value && ...)
   1635      1.1  mrg 	       && is_nothrow_move_constructible_v<variant>)
   1636      1.1  mrg       {
   1637  1.1.1.5  mrg 	static_assert((is_move_constructible_v<_Types> && ...));
   1638  1.1.1.5  mrg 
   1639  1.1.1.5  mrg 	// Handle this here to simplify the visitation.
   1640  1.1.1.5  mrg 	if (__rhs.valueless_by_exception()) [[__unlikely__]]
   1641  1.1.1.5  mrg 	  {
   1642  1.1.1.5  mrg 	    if (!this->valueless_by_exception()) [[__likely__]]
   1643  1.1.1.5  mrg 	      __rhs.swap(*this);
   1644  1.1.1.5  mrg 	    return;
   1645  1.1.1.5  mrg 	  }
   1646  1.1.1.5  mrg 
   1647  1.1.1.5  mrg 	namespace __variant = __detail::__variant;
   1648  1.1.1.5  mrg 
   1649  1.1.1.5  mrg 	__variant::__raw_idx_visit(
   1650  1.1.1.4  mrg 	  [this, &__rhs](auto&& __rhs_mem, auto __rhs_index) mutable
   1651      1.1  mrg 	  {
   1652  1.1.1.5  mrg 	    constexpr size_t __j = __rhs_index;
   1653  1.1.1.5  mrg 	    if constexpr (__j != variant_npos)
   1654      1.1  mrg 	      {
   1655  1.1.1.5  mrg 		if (this->index() == __j)
   1656  1.1.1.3  mrg 		  {
   1657  1.1.1.3  mrg 		    using std::swap;
   1658  1.1.1.5  mrg 		    swap(std::get<__j>(*this), __rhs_mem);
   1659  1.1.1.3  mrg 		  }
   1660  1.1.1.3  mrg 		else
   1661  1.1.1.3  mrg 		  {
   1662  1.1.1.5  mrg 		    auto __tmp(std::move(__rhs_mem));
   1663  1.1.1.5  mrg 
   1664  1.1.1.5  mrg 		    if constexpr (_Traits::_S_trivial_move_assign)
   1665  1.1.1.5  mrg 		      __rhs = std::move(*this);
   1666  1.1.1.3  mrg 		    else
   1667  1.1.1.5  mrg 		      __variant::__raw_idx_visit(
   1668  1.1.1.5  mrg 			[&__rhs](auto&& __this_mem, auto __this_index) mutable
   1669  1.1.1.5  mrg 			{
   1670  1.1.1.5  mrg 			  constexpr size_t __k = __this_index;
   1671  1.1.1.5  mrg 			  if constexpr (__k != variant_npos)
   1672  1.1.1.5  mrg 			    __variant::__emplace<__k>(__rhs,
   1673  1.1.1.5  mrg 						      std::move(__this_mem));
   1674  1.1.1.5  mrg 			}, *this);
   1675  1.1.1.5  mrg 
   1676  1.1.1.5  mrg 		    __variant::__emplace<__j>(*this, std::move(__tmp));
   1677  1.1.1.3  mrg 		  }
   1678  1.1.1.3  mrg 	      }
   1679  1.1.1.3  mrg 	  }, __rhs);
   1680      1.1  mrg       }
   1681      1.1  mrg 
   1682  1.1.1.3  mrg #if defined(__clang__) && __clang_major__ <= 7
   1683      1.1  mrg     public:
   1684      1.1  mrg       using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852
   1685      1.1  mrg #endif
   1686      1.1  mrg 
   1687  1.1.1.5  mrg     private:
   1688      1.1  mrg       template<size_t _Np, typename _Vp>
   1689  1.1.1.3  mrg 	friend constexpr decltype(auto)
   1690  1.1.1.3  mrg 	__detail::__variant::__get(_Vp&& __v) noexcept;
   1691      1.1  mrg 
   1692      1.1  mrg #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP) \
   1693      1.1  mrg       template<typename... _Tp> \
   1694      1.1  mrg 	friend constexpr bool \
   1695      1.1  mrg 	operator __OP(const variant<_Tp...>& __lhs, \
   1696      1.1  mrg 		      const variant<_Tp...>& __rhs);
   1697      1.1  mrg 
   1698      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(<)
   1699      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(<=)
   1700      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(==)
   1701      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(!=)
   1702      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(>=)
   1703      1.1  mrg       _VARIANT_RELATION_FUNCTION_TEMPLATE(>)
   1704      1.1  mrg 
   1705      1.1  mrg #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
   1706      1.1  mrg     };
   1707      1.1  mrg 
   1708      1.1  mrg   template<size_t _Np, typename... _Types>
   1709      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>>&
   1710      1.1  mrg     get(variant<_Types...>& __v)
   1711      1.1  mrg     {
   1712      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1713  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1714      1.1  mrg       if (__v.index() != _Np)
   1715  1.1.1.4  mrg 	__throw_bad_variant_access(__v.valueless_by_exception());
   1716      1.1  mrg       return __detail::__variant::__get<_Np>(__v);
   1717      1.1  mrg     }
   1718      1.1  mrg 
   1719      1.1  mrg   template<size_t _Np, typename... _Types>
   1720      1.1  mrg     constexpr variant_alternative_t<_Np, variant<_Types...>>&&
   1721      1.1  mrg     get(variant<_Types...>&& __v)
   1722      1.1  mrg     {
   1723      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1724  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1725      1.1  mrg       if (__v.index() != _Np)
   1726  1.1.1.4  mrg 	__throw_bad_variant_access(__v.valueless_by_exception());
   1727      1.1  mrg       return __detail::__variant::__get<_Np>(std::move(__v));
   1728      1.1  mrg     }
   1729      1.1  mrg 
   1730      1.1  mrg   template<size_t _Np, typename... _Types>
   1731      1.1  mrg     constexpr const variant_alternative_t<_Np, variant<_Types...>>&
   1732      1.1  mrg     get(const variant<_Types...>& __v)
   1733      1.1  mrg     {
   1734      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1735  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1736      1.1  mrg       if (__v.index() != _Np)
   1737  1.1.1.4  mrg 	__throw_bad_variant_access(__v.valueless_by_exception());
   1738      1.1  mrg       return __detail::__variant::__get<_Np>(__v);
   1739      1.1  mrg     }
   1740      1.1  mrg 
   1741      1.1  mrg   template<size_t _Np, typename... _Types>
   1742      1.1  mrg     constexpr const variant_alternative_t<_Np, variant<_Types...>>&&
   1743      1.1  mrg     get(const variant<_Types...>&& __v)
   1744      1.1  mrg     {
   1745      1.1  mrg       static_assert(_Np < sizeof...(_Types),
   1746  1.1.1.4  mrg 		    "The index must be in [0, number of alternatives)");
   1747      1.1  mrg       if (__v.index() != _Np)
   1748  1.1.1.4  mrg 	__throw_bad_variant_access(__v.valueless_by_exception());
   1749      1.1  mrg       return __detail::__variant::__get<_Np>(std::move(__v));
   1750      1.1  mrg     }
   1751      1.1  mrg 
   1752  1.1.1.5  mrg   /// @cond undocumented
   1753  1.1.1.4  mrg   template<typename _Result_type, typename _Visitor, typename... _Variants>
   1754      1.1  mrg     constexpr decltype(auto)
   1755  1.1.1.3  mrg     __do_visit(_Visitor&& __visitor, _Variants&&... __variants)
   1756      1.1  mrg     {
   1757  1.1.1.5  mrg       // Get the silly case of visiting no variants out of the way first.
   1758  1.1.1.5  mrg       if constexpr (sizeof...(_Variants) == 0)
   1759  1.1.1.5  mrg 	{
   1760  1.1.1.5  mrg 	  if constexpr (is_void_v<_Result_type>)
   1761  1.1.1.5  mrg 	    return (void) std::forward<_Visitor>(__visitor)();
   1762  1.1.1.5  mrg 	  else
   1763  1.1.1.5  mrg 	    return std::forward<_Visitor>(__visitor)();
   1764  1.1.1.5  mrg 	}
   1765  1.1.1.5  mrg       else
   1766  1.1.1.5  mrg 	{
   1767  1.1.1.5  mrg 	  constexpr size_t __max = 11; // "These go to eleven."
   1768  1.1.1.5  mrg 
   1769  1.1.1.5  mrg 	  // The type of the first variant in the pack.
   1770  1.1.1.5  mrg 	  using _V0 = typename _Nth_type<0, _Variants...>::type;
   1771  1.1.1.5  mrg 	  // The number of alternatives in that first variant.
   1772  1.1.1.5  mrg 	  constexpr auto __n = variant_size_v<remove_reference_t<_V0>>;
   1773  1.1.1.5  mrg 
   1774  1.1.1.5  mrg 	  if constexpr (sizeof...(_Variants) > 1 || __n > __max)
   1775  1.1.1.5  mrg 	    {
   1776  1.1.1.5  mrg 	      // Use a jump table for the general case.
   1777  1.1.1.5  mrg 	      constexpr auto& __vtable = __detail::__variant::__gen_vtable<
   1778  1.1.1.5  mrg 		_Result_type, _Visitor&&, _Variants&&...>::_S_vtable;
   1779  1.1.1.5  mrg 
   1780  1.1.1.5  mrg 	      auto __func_ptr = __vtable._M_access(__variants.index()...);
   1781  1.1.1.5  mrg 	      return (*__func_ptr)(std::forward<_Visitor>(__visitor),
   1782  1.1.1.5  mrg 				   std::forward<_Variants>(__variants)...);
   1783  1.1.1.5  mrg 	    }
   1784  1.1.1.5  mrg 	  else // We have a single variant with a small number of alternatives.
   1785  1.1.1.5  mrg 	    {
   1786  1.1.1.5  mrg 	      // A name for the first variant in the pack.
   1787  1.1.1.5  mrg 	      _V0& __v0
   1788  1.1.1.5  mrg 		= [](_V0& __v, ...) -> _V0& { return __v; }(__variants...);
   1789  1.1.1.5  mrg 
   1790  1.1.1.5  mrg 	      using __detail::__variant::_Multi_array;
   1791  1.1.1.5  mrg 	      using __detail::__variant::__gen_vtable_impl;
   1792  1.1.1.5  mrg 	      using _Ma = _Multi_array<_Result_type (*)(_Visitor&&, _V0&&)>;
   1793      1.1  mrg 
   1794  1.1.1.5  mrg #ifdef _GLIBCXX_DEBUG
   1795  1.1.1.5  mrg # define _GLIBCXX_VISIT_UNREACHABLE __builtin_trap
   1796  1.1.1.5  mrg #else
   1797  1.1.1.5  mrg # define _GLIBCXX_VISIT_UNREACHABLE __builtin_unreachable
   1798  1.1.1.5  mrg #endif
   1799  1.1.1.5  mrg 
   1800  1.1.1.5  mrg #define _GLIBCXX_VISIT_CASE(N)						\
   1801  1.1.1.5  mrg   case N:								\
   1802  1.1.1.5  mrg   {									\
   1803  1.1.1.5  mrg     if constexpr (N < __n)						\
   1804  1.1.1.5  mrg       {									\
   1805  1.1.1.5  mrg 	return __gen_vtable_impl<_Ma, index_sequence<N>>::		\
   1806  1.1.1.5  mrg 	  __visit_invoke(std::forward<_Visitor>(__visitor),		\
   1807  1.1.1.5  mrg 			 std::forward<_V0>(__v0));		\
   1808  1.1.1.5  mrg       }									\
   1809  1.1.1.5  mrg     else _GLIBCXX_VISIT_UNREACHABLE();					\
   1810  1.1.1.5  mrg   }
   1811  1.1.1.5  mrg 
   1812  1.1.1.5  mrg 	      switch (__v0.index())
   1813  1.1.1.5  mrg 		{
   1814  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(0)
   1815  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(1)
   1816  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(2)
   1817  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(3)
   1818  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(4)
   1819  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(5)
   1820  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(6)
   1821  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(7)
   1822  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(8)
   1823  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(9)
   1824  1.1.1.5  mrg 		  _GLIBCXX_VISIT_CASE(10)
   1825  1.1.1.5  mrg 		case variant_npos:
   1826  1.1.1.5  mrg 		  using __detail::__variant::__variant_idx_cookie;
   1827  1.1.1.5  mrg 		  using __detail::__variant::__variant_cookie;
   1828  1.1.1.5  mrg 		  if constexpr (is_same_v<_Result_type, __variant_idx_cookie>
   1829  1.1.1.5  mrg 				|| is_same_v<_Result_type, __variant_cookie>)
   1830  1.1.1.5  mrg 		    {
   1831  1.1.1.5  mrg 		      using _Npos = index_sequence<variant_npos>;
   1832  1.1.1.5  mrg 		      return __gen_vtable_impl<_Ma, _Npos>::
   1833  1.1.1.5  mrg 			__visit_invoke(std::forward<_Visitor>(__visitor),
   1834  1.1.1.5  mrg 				       std::forward<_V0>(__v0));
   1835  1.1.1.5  mrg 		    }
   1836  1.1.1.5  mrg 		  else
   1837  1.1.1.5  mrg 		    _GLIBCXX_VISIT_UNREACHABLE();
   1838  1.1.1.5  mrg 		default:
   1839  1.1.1.5  mrg 		  _GLIBCXX_VISIT_UNREACHABLE();
   1840  1.1.1.5  mrg 		}
   1841  1.1.1.5  mrg #undef _GLIBCXX_VISIT_CASE
   1842  1.1.1.5  mrg #undef _GLIBCXX_VISIT_UNREACHABLE
   1843  1.1.1.5  mrg 	    }
   1844  1.1.1.5  mrg 	}
   1845      1.1  mrg     }
   1846  1.1.1.5  mrg   /// @endcond
   1847      1.1  mrg 
   1848  1.1.1.3  mrg   template<typename _Visitor, typename... _Variants>
   1849  1.1.1.4  mrg     constexpr __detail::__variant::__visit_result_t<_Visitor, _Variants...>
   1850  1.1.1.3  mrg     visit(_Visitor&& __visitor, _Variants&&... __variants)
   1851  1.1.1.3  mrg     {
   1852  1.1.1.5  mrg       namespace __variant = std::__detail::__variant;
   1853  1.1.1.5  mrg 
   1854  1.1.1.5  mrg       if ((__variant::__as(__variants).valueless_by_exception() || ...))
   1855  1.1.1.4  mrg 	__throw_bad_variant_access("std::visit: variant is valueless");
   1856  1.1.1.4  mrg 
   1857  1.1.1.4  mrg       using _Result_type
   1858  1.1.1.4  mrg 	= __detail::__variant::__visit_result_t<_Visitor, _Variants...>;
   1859  1.1.1.3  mrg 
   1860  1.1.1.4  mrg       using _Tag = __detail::__variant::__deduce_visit_result<_Result_type>;
   1861  1.1.1.4  mrg 
   1862  1.1.1.5  mrg       if constexpr (sizeof...(_Variants) == 1)
   1863  1.1.1.5  mrg 	{
   1864  1.1.1.5  mrg 	  using _Vp = decltype(__variant::__as(std::declval<_Variants>()...));
   1865  1.1.1.5  mrg 
   1866  1.1.1.5  mrg 	  constexpr bool __visit_rettypes_match = __detail::__variant::
   1867  1.1.1.5  mrg 	    __check_visitor_results<_Visitor, _Vp>(
   1868  1.1.1.5  mrg 	      make_index_sequence<variant_size_v<remove_reference_t<_Vp>>>());
   1869  1.1.1.5  mrg 	  if constexpr (!__visit_rettypes_match)
   1870  1.1.1.5  mrg 	    {
   1871  1.1.1.5  mrg 	      static_assert(__visit_rettypes_match,
   1872  1.1.1.5  mrg 			  "std::visit requires the visitor to have the same "
   1873  1.1.1.5  mrg 			  "return type for all alternatives of a variant");
   1874  1.1.1.5  mrg 	      return;
   1875  1.1.1.5  mrg 	    }
   1876  1.1.1.5  mrg 	  else
   1877  1.1.1.5  mrg 	    return std::__do_visit<_Tag>(
   1878  1.1.1.5  mrg 	      std::forward<_Visitor>(__visitor),
   1879  1.1.1.5  mrg 	      static_cast<_Vp>(__variants)...);
   1880  1.1.1.5  mrg 	}
   1881  1.1.1.5  mrg       else
   1882  1.1.1.5  mrg 	return std::__do_visit<_Tag>(
   1883  1.1.1.5  mrg 	  std::forward<_Visitor>(__visitor),
   1884  1.1.1.5  mrg 	  __variant::__as(std::forward<_Variants>(__variants))...);
   1885  1.1.1.3  mrg     }
   1886  1.1.1.3  mrg 
   1887  1.1.1.3  mrg #if __cplusplus > 201703L
   1888  1.1.1.3  mrg   template<typename _Res, typename _Visitor, typename... _Variants>
   1889  1.1.1.3  mrg     constexpr _Res
   1890  1.1.1.3  mrg     visit(_Visitor&& __visitor, _Variants&&... __variants)
   1891  1.1.1.3  mrg     {
   1892  1.1.1.5  mrg       namespace __variant = std::__detail::__variant;
   1893  1.1.1.5  mrg 
   1894  1.1.1.5  mrg       if ((__variant::__as(__variants).valueless_by_exception() || ...))
   1895  1.1.1.4  mrg 	__throw_bad_variant_access("std::visit<R>: variant is valueless");
   1896  1.1.1.3  mrg 
   1897  1.1.1.4  mrg       return std::__do_visit<_Res>(std::forward<_Visitor>(__visitor),
   1898  1.1.1.5  mrg 	  __variant::__as(std::forward<_Variants>(__variants))...);
   1899  1.1.1.3  mrg     }
   1900  1.1.1.3  mrg #endif
   1901  1.1.1.3  mrg 
   1902  1.1.1.5  mrg   /// @cond undocumented
   1903      1.1  mrg   template<bool, typename... _Types>
   1904      1.1  mrg     struct __variant_hash_call_base_impl
   1905      1.1  mrg     {
   1906      1.1  mrg       size_t
   1907      1.1  mrg       operator()(const variant<_Types...>& __t) const
   1908      1.1  mrg       noexcept((is_nothrow_invocable_v<hash<decay_t<_Types>>, _Types> && ...))
   1909      1.1  mrg       {
   1910  1.1.1.3  mrg 	size_t __ret;
   1911  1.1.1.4  mrg 	__detail::__variant::__raw_visit(
   1912  1.1.1.4  mrg 	  [&__t, &__ret](auto&& __t_mem) mutable
   1913      1.1  mrg 	  {
   1914  1.1.1.3  mrg 	    using _Type = __remove_cvref_t<decltype(__t_mem)>;
   1915  1.1.1.3  mrg 	    if constexpr (!is_same_v<_Type,
   1916  1.1.1.3  mrg 			             __detail::__variant::__variant_cookie>)
   1917  1.1.1.3  mrg 	      __ret = std::hash<size_t>{}(__t.index())
   1918  1.1.1.3  mrg 		      + std::hash<_Type>{}(__t_mem);
   1919  1.1.1.3  mrg 	    else
   1920  1.1.1.3  mrg 	      __ret = std::hash<size_t>{}(__t.index());
   1921  1.1.1.3  mrg 	  }, __t);
   1922  1.1.1.3  mrg 	return __ret;
   1923      1.1  mrg       }
   1924      1.1  mrg     };
   1925      1.1  mrg 
   1926      1.1  mrg   template<typename... _Types>
   1927      1.1  mrg     struct __variant_hash_call_base_impl<false, _Types...> {};
   1928      1.1  mrg 
   1929      1.1  mrg   template<typename... _Types>
   1930      1.1  mrg     using __variant_hash_call_base =
   1931      1.1  mrg     __variant_hash_call_base_impl<(__poison_hash<remove_const_t<_Types>>::
   1932      1.1  mrg 				   __enable_hash_call &&...), _Types...>;
   1933  1.1.1.5  mrg   /// @endcond
   1934      1.1  mrg 
   1935      1.1  mrg   template<typename... _Types>
   1936      1.1  mrg     struct hash<variant<_Types...>>
   1937      1.1  mrg     : private __detail::__variant::_Variant_hash_base<
   1938  1.1.1.2  mrg 	variant<_Types...>, std::index_sequence_for<_Types...>>,
   1939      1.1  mrg       public __variant_hash_call_base<_Types...>
   1940      1.1  mrg     {
   1941  1.1.1.2  mrg       using result_type [[__deprecated__]] = size_t;
   1942  1.1.1.2  mrg       using argument_type [[__deprecated__]] = variant<_Types...>;
   1943      1.1  mrg     };
   1944      1.1  mrg 
   1945      1.1  mrg   template<>
   1946      1.1  mrg     struct hash<monostate>
   1947      1.1  mrg     {
   1948  1.1.1.2  mrg       using result_type [[__deprecated__]] = size_t;
   1949  1.1.1.2  mrg       using argument_type [[__deprecated__]] = monostate;
   1950      1.1  mrg 
   1951      1.1  mrg       size_t
   1952  1.1.1.4  mrg       operator()(const monostate&) const noexcept
   1953      1.1  mrg       {
   1954      1.1  mrg 	constexpr size_t __magic_monostate_hash = -7777;
   1955      1.1  mrg 	return __magic_monostate_hash;
   1956      1.1  mrg       }
   1957      1.1  mrg     };
   1958      1.1  mrg 
   1959  1.1.1.2  mrg   template<typename... _Types>
   1960  1.1.1.2  mrg     struct __is_fast_hash<hash<variant<_Types...>>>
   1961  1.1.1.2  mrg     : bool_constant<(__is_fast_hash<_Types>::value && ...)>
   1962  1.1.1.2  mrg     { };
   1963  1.1.1.2  mrg 
   1964      1.1  mrg _GLIBCXX_END_NAMESPACE_VERSION
   1965      1.1  mrg } // namespace std
   1966      1.1  mrg 
   1967      1.1  mrg #endif // C++17
   1968      1.1  mrg 
   1969      1.1  mrg #endif // _GLIBCXX_VARIANT
   1970