variant 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451
  1. // <variant> -*- C++ -*-
  2. // Copyright (C) 2016-2018 Free Software Foundation, Inc.
  3. //
  4. // This file is part of the GNU ISO C++ Library. This library is free
  5. // software; you can redistribute it and/or modify it under the
  6. // terms of the GNU General Public License as published by the
  7. // Free Software Foundation; either version 3, or (at your option)
  8. // any later version.
  9. // This library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. // Under Section 7 of GPL version 3, you are granted additional
  14. // permissions described in the GCC Runtime Library Exception, version
  15. // 3.1, as published by the Free Software Foundation.
  16. // You should have received a copy of the GNU General Public License and
  17. // a copy of the GCC Runtime Library Exception along with this program;
  18. // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
  19. // <http://www.gnu.org/licenses/>.
  20. /** @file variant
  21. * This is the <variant> C++ Library header.
  22. */
  23. #ifndef _GLIBCXX_VARIANT
  24. #define _GLIBCXX_VARIANT 1
  25. #pragma GCC system_header
  26. #if __cplusplus >= 201703L
  27. #include <type_traits>
  28. #include <utility>
  29. #include <bits/enable_special_members.h>
  30. #include <bits/functexcept.h>
  31. #include <bits/move.h>
  32. #include <bits/functional_hash.h>
  33. #include <bits/invoke.h>
  34. #include <ext/aligned_buffer.h>
  35. #include <bits/parse_numbers.h>
  36. #include <bits/stl_iterator_base_types.h>
  37. #include <bits/stl_iterator_base_funcs.h>
  38. #include <bits/stl_construct.h>
  39. namespace std _GLIBCXX_VISIBILITY(default)
  40. {
  41. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  42. namespace __detail
  43. {
  44. namespace __variant
  45. {
  46. template<size_t _Np, typename... _Types>
  47. struct _Nth_type;
  48. template<size_t _Np, typename _First, typename... _Rest>
  49. struct _Nth_type<_Np, _First, _Rest...>
  50. : _Nth_type<_Np-1, _Rest...> { };
  51. template<typename _First, typename... _Rest>
  52. struct _Nth_type<0, _First, _Rest...>
  53. { using type = _First; };
  54. } // namespace __variant
  55. } // namespace __detail
  56. #define __cpp_lib_variant 201603
  57. template<typename... _Types> class tuple;
  58. template<typename... _Types> class variant;
  59. template <typename> struct hash;
  60. template<typename _Variant>
  61. struct variant_size;
  62. template<typename _Variant>
  63. struct variant_size<const _Variant> : variant_size<_Variant> {};
  64. template<typename _Variant>
  65. struct variant_size<volatile _Variant> : variant_size<_Variant> {};
  66. template<typename _Variant>
  67. struct variant_size<const volatile _Variant> : variant_size<_Variant> {};
  68. template<typename... _Types>
  69. struct variant_size<variant<_Types...>>
  70. : std::integral_constant<size_t, sizeof...(_Types)> {};
  71. template<typename _Variant>
  72. inline constexpr size_t variant_size_v = variant_size<_Variant>::value;
  73. template<size_t _Np, typename _Variant>
  74. struct variant_alternative;
  75. template<size_t _Np, typename _First, typename... _Rest>
  76. struct variant_alternative<_Np, variant<_First, _Rest...>>
  77. : variant_alternative<_Np-1, variant<_Rest...>> {};
  78. template<typename _First, typename... _Rest>
  79. struct variant_alternative<0, variant<_First, _Rest...>>
  80. { using type = _First; };
  81. template<size_t _Np, typename _Variant>
  82. using variant_alternative_t =
  83. typename variant_alternative<_Np, _Variant>::type;
  84. template<size_t _Np, typename _Variant>
  85. struct variant_alternative<_Np, const _Variant>
  86. { using type = add_const_t<variant_alternative_t<_Np, _Variant>>; };
  87. template<size_t _Np, typename _Variant>
  88. struct variant_alternative<_Np, volatile _Variant>
  89. { using type = add_volatile_t<variant_alternative_t<_Np, _Variant>>; };
  90. template<size_t _Np, typename _Variant>
  91. struct variant_alternative<_Np, const volatile _Variant>
  92. { using type = add_cv_t<variant_alternative_t<_Np, _Variant>>; };
  93. inline constexpr size_t variant_npos = -1;
  94. template<size_t _Np, typename... _Types>
  95. constexpr variant_alternative_t<_Np, variant<_Types...>>&
  96. get(variant<_Types...>&);
  97. template<size_t _Np, typename... _Types>
  98. constexpr variant_alternative_t<_Np, variant<_Types...>>&&
  99. get(variant<_Types...>&&);
  100. template<size_t _Np, typename... _Types>
  101. constexpr variant_alternative_t<_Np, variant<_Types...>> const&
  102. get(const variant<_Types...>&);
  103. template<size_t _Np, typename... _Types>
  104. constexpr variant_alternative_t<_Np, variant<_Types...>> const&&
  105. get(const variant<_Types...>&&);
  106. namespace __detail
  107. {
  108. namespace __variant
  109. {
  110. // Returns the first apparence of _Tp in _Types.
  111. // Returns sizeof...(_Types) if _Tp is not in _Types.
  112. template<typename _Tp, typename... _Types>
  113. struct __index_of : std::integral_constant<size_t, 0> {};
  114. template<typename _Tp, typename... _Types>
  115. inline constexpr size_t __index_of_v = __index_of<_Tp, _Types...>::value;
  116. template<typename _Tp, typename _First, typename... _Rest>
  117. struct __index_of<_Tp, _First, _Rest...> :
  118. std::integral_constant<size_t, is_same_v<_Tp, _First>
  119. ? 0 : __index_of_v<_Tp, _Rest...> + 1> {};
  120. // _Uninitialized<T> is guaranteed to be a literal type, even if T is not.
  121. // We have to do this, because [basic.types]p10.5.3 (n4606) is not implemented
  122. // yet. When it's implemented, _Uninitialized<T> can be changed to the alias
  123. // to T, therefore equivalent to being removed entirely.
  124. //
  125. // Another reason we may not want to remove _Uninitialzied<T> may be that, we
  126. // want _Uninitialized<T> to be trivially destructible, no matter whether T
  127. // is; but we will see.
  128. template<typename _Type, bool = std::is_literal_type_v<_Type>>
  129. struct _Uninitialized;
  130. template<typename _Type>
  131. struct _Uninitialized<_Type, true>
  132. {
  133. template<typename... _Args>
  134. constexpr _Uninitialized(in_place_index_t<0>, _Args&&... __args)
  135. : _M_storage(std::forward<_Args>(__args)...)
  136. { }
  137. constexpr const _Type& _M_get() const &
  138. { return _M_storage; }
  139. constexpr _Type& _M_get() &
  140. { return _M_storage; }
  141. constexpr const _Type&& _M_get() const &&
  142. { return std::move(_M_storage); }
  143. constexpr _Type&& _M_get() &&
  144. { return std::move(_M_storage); }
  145. _Type _M_storage;
  146. };
  147. template<typename _Type>
  148. struct _Uninitialized<_Type, false>
  149. {
  150. template<typename... _Args>
  151. constexpr _Uninitialized(in_place_index_t<0>, _Args&&... __args)
  152. { ::new (&_M_storage) _Type(std::forward<_Args>(__args)...); }
  153. const _Type& _M_get() const &
  154. { return *_M_storage._M_ptr(); }
  155. _Type& _M_get() &
  156. { return *_M_storage._M_ptr(); }
  157. const _Type&& _M_get() const &&
  158. { return std::move(*_M_storage._M_ptr()); }
  159. _Type&& _M_get() &&
  160. { return std::move(*_M_storage._M_ptr()); }
  161. __gnu_cxx::__aligned_membuf<_Type> _M_storage;
  162. };
  163. template<typename _Ref>
  164. _Ref __ref_cast(void* __ptr)
  165. {
  166. return static_cast<_Ref>(*static_cast<remove_reference_t<_Ref>*>(__ptr));
  167. }
  168. template<typename _Union>
  169. constexpr decltype(auto) __get(in_place_index_t<0>, _Union&& __u)
  170. { return std::forward<_Union>(__u)._M_first._M_get(); }
  171. template<size_t _Np, typename _Union>
  172. constexpr decltype(auto) __get(in_place_index_t<_Np>, _Union&& __u)
  173. {
  174. return __variant::__get(in_place_index<_Np-1>,
  175. std::forward<_Union>(__u)._M_rest);
  176. }
  177. // Returns the typed storage for __v.
  178. template<size_t _Np, typename _Variant>
  179. constexpr decltype(auto) __get(_Variant&& __v)
  180. {
  181. return __variant::__get(std::in_place_index<_Np>,
  182. std::forward<_Variant>(__v)._M_u);
  183. }
  184. // Various functions as "vtable" entries, where those vtables are used by
  185. // polymorphic operations.
  186. template<typename _Lhs, typename _Rhs>
  187. void
  188. __erased_ctor(void* __lhs, void* __rhs)
  189. {
  190. using _Type = remove_reference_t<_Lhs>;
  191. ::new (__lhs) _Type(__variant::__ref_cast<_Rhs>(__rhs));
  192. }
  193. template<typename _Variant, size_t _Np>
  194. void
  195. __erased_dtor(_Variant&& __v)
  196. { std::_Destroy(std::__addressof(__variant::__get<_Np>(__v))); }
  197. template<typename _Lhs, typename _Rhs>
  198. void
  199. __erased_assign(void* __lhs, void* __rhs)
  200. {
  201. __variant::__ref_cast<_Lhs>(__lhs) = __variant::__ref_cast<_Rhs>(__rhs);
  202. }
  203. template<typename _Lhs, typename _Rhs>
  204. void
  205. __erased_swap(void* __lhs, void* __rhs)
  206. {
  207. using std::swap;
  208. swap(__variant::__ref_cast<_Lhs>(__lhs),
  209. __variant::__ref_cast<_Rhs>(__rhs));
  210. }
  211. #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP, __NAME) \
  212. template<typename _Variant, size_t _Np> \
  213. constexpr bool \
  214. __erased_##__NAME(const _Variant& __lhs, const _Variant& __rhs) \
  215. { \
  216. return __variant::__get<_Np>(std::forward<_Variant>(__lhs)) \
  217. __OP __variant::__get<_Np>(std::forward<_Variant>(__rhs)); \
  218. }
  219. _VARIANT_RELATION_FUNCTION_TEMPLATE(<, less)
  220. _VARIANT_RELATION_FUNCTION_TEMPLATE(<=, less_equal)
  221. _VARIANT_RELATION_FUNCTION_TEMPLATE(==, equal)
  222. _VARIANT_RELATION_FUNCTION_TEMPLATE(!=, not_equal)
  223. _VARIANT_RELATION_FUNCTION_TEMPLATE(>=, greater_equal)
  224. _VARIANT_RELATION_FUNCTION_TEMPLATE(>, greater)
  225. #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
  226. template<typename _Tp>
  227. size_t
  228. __erased_hash(void* __t)
  229. {
  230. return std::hash<remove_cv_t<remove_reference_t<_Tp>>>{}(
  231. __variant::__ref_cast<_Tp>(__t));
  232. }
  233. template<typename... _Types>
  234. struct _Traits
  235. {
  236. static constexpr bool _S_default_ctor =
  237. is_default_constructible_v<typename _Nth_type<0, _Types...>::type>;
  238. static constexpr bool _S_copy_ctor =
  239. (is_copy_constructible_v<_Types> && ...);
  240. static constexpr bool _S_move_ctor =
  241. (is_move_constructible_v<_Types> && ...);
  242. static constexpr bool _S_copy_assign =
  243. _S_copy_ctor && _S_move_ctor
  244. && (is_copy_assignable_v<_Types> && ...);
  245. static constexpr bool _S_move_assign =
  246. _S_move_ctor
  247. && (is_move_assignable_v<_Types> && ...);
  248. static constexpr bool _S_trivial_dtor =
  249. (is_trivially_destructible_v<_Types> && ...);
  250. static constexpr bool _S_trivial_copy_ctor =
  251. (is_trivially_copy_constructible_v<_Types> && ...);
  252. static constexpr bool _S_trivial_move_ctor =
  253. (is_trivially_move_constructible_v<_Types> && ...);
  254. static constexpr bool _S_trivial_copy_assign =
  255. _S_trivial_dtor && (is_trivially_copy_assignable_v<_Types> && ...);
  256. static constexpr bool _S_trivial_move_assign =
  257. _S_trivial_dtor && (is_trivially_move_assignable_v<_Types> && ...);
  258. // The following nothrow traits are for non-trivial SMFs. Trivial SMFs
  259. // are always nothrow.
  260. static constexpr bool _S_nothrow_default_ctor =
  261. is_nothrow_default_constructible_v<
  262. typename _Nth_type<0, _Types...>::type>;
  263. static constexpr bool _S_nothrow_copy_ctor = false;
  264. static constexpr bool _S_nothrow_move_ctor =
  265. (is_nothrow_move_constructible_v<_Types> && ...);
  266. static constexpr bool _S_nothrow_copy_assign = false;
  267. static constexpr bool _S_nothrow_move_assign =
  268. _S_nothrow_move_ctor && (is_nothrow_move_assignable_v<_Types> && ...);
  269. };
  270. // Defines members and ctors.
  271. template<typename... _Types>
  272. union _Variadic_union { };
  273. template<typename _First, typename... _Rest>
  274. union _Variadic_union<_First, _Rest...>
  275. {
  276. constexpr _Variadic_union() : _M_rest() { }
  277. template<typename... _Args>
  278. constexpr _Variadic_union(in_place_index_t<0>, _Args&&... __args)
  279. : _M_first(in_place_index<0>, std::forward<_Args>(__args)...)
  280. { }
  281. template<size_t _Np, typename... _Args>
  282. constexpr _Variadic_union(in_place_index_t<_Np>, _Args&&... __args)
  283. : _M_rest(in_place_index<_Np-1>, std::forward<_Args>(__args)...)
  284. { }
  285. _Uninitialized<_First> _M_first;
  286. _Variadic_union<_Rest...> _M_rest;
  287. };
  288. // Defines index and the dtor, possibly trivial.
  289. template<bool __trivially_destructible, typename... _Types>
  290. struct _Variant_storage;
  291. template <typename... _Types>
  292. using __select_index =
  293. typename __select_int::_Select_int_base<sizeof...(_Types) + 1,
  294. unsigned char,
  295. unsigned short>::type::value_type;
  296. template<typename... _Types>
  297. struct _Variant_storage<false, _Types...>
  298. {
  299. template<size_t... __indices>
  300. static constexpr void (*_S_vtable[])(const _Variant_storage&) =
  301. { &__erased_dtor<const _Variant_storage&, __indices>... };
  302. constexpr _Variant_storage() : _M_index(variant_npos) { }
  303. template<size_t _Np, typename... _Args>
  304. constexpr _Variant_storage(in_place_index_t<_Np>, _Args&&... __args)
  305. : _M_u(in_place_index<_Np>, std::forward<_Args>(__args)...),
  306. _M_index(_Np)
  307. { }
  308. template<size_t... __indices>
  309. constexpr void _M_reset_impl(std::index_sequence<__indices...>)
  310. {
  311. if (_M_index != __index_type(variant_npos))
  312. _S_vtable<__indices...>[_M_index](*this);
  313. }
  314. void _M_reset()
  315. {
  316. _M_reset_impl(std::index_sequence_for<_Types...>{});
  317. _M_index = variant_npos;
  318. }
  319. ~_Variant_storage()
  320. { _M_reset(); }
  321. void*
  322. _M_storage() const
  323. {
  324. return const_cast<void*>(static_cast<const void*>(
  325. std::addressof(_M_u)));
  326. }
  327. constexpr bool
  328. _M_valid() const noexcept
  329. {
  330. return this->_M_index != __index_type(variant_npos);
  331. }
  332. _Variadic_union<_Types...> _M_u;
  333. using __index_type = __select_index<_Types...>;
  334. __index_type _M_index;
  335. };
  336. template<typename... _Types>
  337. struct _Variant_storage<true, _Types...>
  338. {
  339. constexpr _Variant_storage() : _M_index(variant_npos) { }
  340. template<size_t _Np, typename... _Args>
  341. constexpr _Variant_storage(in_place_index_t<_Np>, _Args&&... __args)
  342. : _M_u(in_place_index<_Np>, std::forward<_Args>(__args)...),
  343. _M_index(_Np)
  344. { }
  345. void _M_reset()
  346. { _M_index = variant_npos; }
  347. void*
  348. _M_storage() const
  349. {
  350. return const_cast<void*>(static_cast<const void*>(
  351. std::addressof(_M_u)));
  352. }
  353. constexpr bool
  354. _M_valid() const noexcept
  355. {
  356. return this->_M_index != __index_type(variant_npos);
  357. }
  358. _Variadic_union<_Types...> _M_u;
  359. using __index_type = __select_index<_Types...>;
  360. __index_type _M_index;
  361. };
  362. template<typename... _Types>
  363. using _Variant_storage_alias =
  364. _Variant_storage<_Traits<_Types...>::_S_trivial_dtor, _Types...>;
  365. // The following are (Copy|Move) (ctor|assign) layers for forwarding
  366. // triviality and handling non-trivial SMF behaviors.
  367. template<bool, typename... _Types>
  368. struct _Copy_ctor_base : _Variant_storage_alias<_Types...>
  369. {
  370. using _Base = _Variant_storage_alias<_Types...>;
  371. using _Base::_Base;
  372. _Copy_ctor_base(const _Copy_ctor_base& __rhs)
  373. noexcept(_Traits<_Types...>::_S_nothrow_copy_ctor)
  374. {
  375. if (__rhs._M_valid())
  376. {
  377. static constexpr void (*_S_vtable[])(void*, void*) =
  378. { &__erased_ctor<_Types&, const _Types&>... };
  379. _S_vtable[__rhs._M_index](this->_M_storage(), __rhs._M_storage());
  380. this->_M_index = __rhs._M_index;
  381. }
  382. }
  383. _Copy_ctor_base(_Copy_ctor_base&&) = default;
  384. _Copy_ctor_base& operator=(const _Copy_ctor_base&) = default;
  385. _Copy_ctor_base& operator=(_Copy_ctor_base&&) = default;
  386. };
  387. template<typename... _Types>
  388. struct _Copy_ctor_base<true, _Types...> : _Variant_storage_alias<_Types...>
  389. {
  390. using _Base = _Variant_storage_alias<_Types...>;
  391. using _Base::_Base;
  392. };
  393. template<typename... _Types>
  394. using _Copy_ctor_alias =
  395. _Copy_ctor_base<_Traits<_Types...>::_S_trivial_copy_ctor, _Types...>;
  396. template<bool, typename... _Types>
  397. struct _Move_ctor_base : _Copy_ctor_alias<_Types...>
  398. {
  399. using _Base = _Copy_ctor_alias<_Types...>;
  400. using _Base::_Base;
  401. _Move_ctor_base(_Move_ctor_base&& __rhs)
  402. noexcept(_Traits<_Types...>::_S_nothrow_move_ctor)
  403. {
  404. if (__rhs._M_valid())
  405. {
  406. static constexpr void (*_S_vtable[])(void*, void*) =
  407. { &__erased_ctor<_Types&, _Types&&>... };
  408. _S_vtable[__rhs._M_index](this->_M_storage(), __rhs._M_storage());
  409. this->_M_index = __rhs._M_index;
  410. }
  411. }
  412. void _M_destructive_move(_Move_ctor_base&& __rhs)
  413. {
  414. this->~_Move_ctor_base();
  415. __try
  416. {
  417. ::new (this) _Move_ctor_base(std::move(__rhs));
  418. }
  419. __catch (...)
  420. {
  421. this->_M_index = variant_npos;
  422. __throw_exception_again;
  423. }
  424. }
  425. _Move_ctor_base(const _Move_ctor_base&) = default;
  426. _Move_ctor_base& operator=(const _Move_ctor_base&) = default;
  427. _Move_ctor_base& operator=(_Move_ctor_base&&) = default;
  428. };
  429. template<typename... _Types>
  430. struct _Move_ctor_base<true, _Types...> : _Copy_ctor_alias<_Types...>
  431. {
  432. using _Base = _Copy_ctor_alias<_Types...>;
  433. using _Base::_Base;
  434. void _M_destructive_move(_Move_ctor_base&& __rhs)
  435. {
  436. this->~_Move_ctor_base();
  437. ::new (this) _Move_ctor_base(std::move(__rhs));
  438. }
  439. };
  440. template<typename... _Types>
  441. using _Move_ctor_alias =
  442. _Move_ctor_base<_Traits<_Types...>::_S_trivial_move_ctor, _Types...>;
  443. template<bool, typename... _Types>
  444. struct _Copy_assign_base : _Move_ctor_alias<_Types...>
  445. {
  446. using _Base = _Move_ctor_alias<_Types...>;
  447. using _Base::_Base;
  448. _Copy_assign_base&
  449. operator=(const _Copy_assign_base& __rhs)
  450. noexcept(_Traits<_Types...>::_S_nothrow_copy_assign)
  451. {
  452. if (this->_M_index == __rhs._M_index)
  453. {
  454. if (__rhs._M_valid())
  455. {
  456. static constexpr void (*_S_vtable[])(void*, void*) =
  457. { &__erased_assign<_Types&, const _Types&>... };
  458. _S_vtable[__rhs._M_index](this->_M_storage(),
  459. __rhs._M_storage());
  460. }
  461. }
  462. else
  463. {
  464. _Copy_assign_base __tmp(__rhs);
  465. this->_M_destructive_move(std::move(__tmp));
  466. }
  467. __glibcxx_assert(this->_M_index == __rhs._M_index);
  468. return *this;
  469. }
  470. _Copy_assign_base(const _Copy_assign_base&) = default;
  471. _Copy_assign_base(_Copy_assign_base&&) = default;
  472. _Copy_assign_base& operator=(_Copy_assign_base&&) = default;
  473. };
  474. template<typename... _Types>
  475. struct _Copy_assign_base<true, _Types...> : _Move_ctor_alias<_Types...>
  476. {
  477. using _Base = _Move_ctor_alias<_Types...>;
  478. using _Base::_Base;
  479. };
  480. template<typename... _Types>
  481. using _Copy_assign_alias =
  482. _Copy_assign_base<_Traits<_Types...>::_S_trivial_copy_assign,
  483. _Types...>;
  484. template<bool, typename... _Types>
  485. struct _Move_assign_base : _Copy_assign_alias<_Types...>
  486. {
  487. using _Base = _Copy_assign_alias<_Types...>;
  488. using _Base::_Base;
  489. _Move_assign_base&
  490. operator=(_Move_assign_base&& __rhs)
  491. noexcept(_Traits<_Types...>::_S_nothrow_move_assign)
  492. {
  493. if (this->_M_index == __rhs._M_index)
  494. {
  495. if (__rhs._M_valid())
  496. {
  497. static constexpr void (*_S_vtable[])(void*, void*) =
  498. { &__erased_assign<_Types&, _Types&&>... };
  499. _S_vtable[__rhs._M_index]
  500. (this->_M_storage(), __rhs._M_storage());
  501. }
  502. }
  503. else
  504. {
  505. _Move_assign_base __tmp(std::move(__rhs));
  506. this->_M_destructive_move(std::move(__tmp));
  507. }
  508. __glibcxx_assert(this->_M_index == __rhs._M_index);
  509. return *this;
  510. }
  511. _Move_assign_base(const _Move_assign_base&) = default;
  512. _Move_assign_base(_Move_assign_base&&) = default;
  513. _Move_assign_base& operator=(const _Move_assign_base&) = default;
  514. };
  515. template<typename... _Types>
  516. struct _Move_assign_base<true, _Types...> : _Copy_assign_alias<_Types...>
  517. {
  518. using _Base = _Copy_assign_alias<_Types...>;
  519. using _Base::_Base;
  520. };
  521. template<typename... _Types>
  522. using _Move_assign_alias =
  523. _Move_assign_base<_Traits<_Types...>::_S_trivial_move_assign,
  524. _Types...>;
  525. template<typename... _Types>
  526. struct _Variant_base : _Move_assign_alias<_Types...>
  527. {
  528. using _Base = _Move_assign_alias<_Types...>;
  529. constexpr
  530. _Variant_base()
  531. noexcept(_Traits<_Types...>::_S_nothrow_default_ctor)
  532. : _Variant_base(in_place_index<0>) { }
  533. template<size_t _Np, typename... _Args>
  534. constexpr explicit
  535. _Variant_base(in_place_index_t<_Np> __i, _Args&&... __args)
  536. : _Base(__i, std::forward<_Args>(__args)...)
  537. { }
  538. _Variant_base(const _Variant_base&) = default;
  539. _Variant_base(_Variant_base&&) = default;
  540. _Variant_base& operator=(const _Variant_base&) = default;
  541. _Variant_base& operator=(_Variant_base&&) = default;
  542. };
  543. // For how many times does _Tp appear in _Tuple?
  544. template<typename _Tp, typename _Tuple>
  545. struct __tuple_count;
  546. template<typename _Tp, typename _Tuple>
  547. inline constexpr size_t __tuple_count_v =
  548. __tuple_count<_Tp, _Tuple>::value;
  549. template<typename _Tp, typename... _Types>
  550. struct __tuple_count<_Tp, tuple<_Types...>>
  551. : integral_constant<size_t, 0> { };
  552. template<typename _Tp, typename _First, typename... _Rest>
  553. struct __tuple_count<_Tp, tuple<_First, _Rest...>>
  554. : integral_constant<
  555. size_t,
  556. __tuple_count_v<_Tp, tuple<_Rest...>> + is_same_v<_Tp, _First>> { };
  557. // TODO: Reuse this in <tuple> ?
  558. template<typename _Tp, typename... _Types>
  559. inline constexpr bool __exactly_once =
  560. __tuple_count_v<_Tp, tuple<_Types...>> == 1;
  561. // Takes _Types and create an overloaded _S_fun for each type.
  562. // If a type appears more than once in _Types, create only one overload.
  563. template<typename... _Types>
  564. struct __overload_set
  565. { static void _S_fun(); };
  566. template<typename _First, typename... _Rest>
  567. struct __overload_set<_First, _Rest...> : __overload_set<_Rest...>
  568. {
  569. using __overload_set<_Rest...>::_S_fun;
  570. static integral_constant<size_t, sizeof...(_Rest)> _S_fun(_First);
  571. };
  572. template<typename... _Rest>
  573. struct __overload_set<void, _Rest...> : __overload_set<_Rest...>
  574. {
  575. using __overload_set<_Rest...>::_S_fun;
  576. };
  577. // Helper for variant(_Tp&&) and variant::operator=(_Tp&&).
  578. // __accepted_index maps the arbitrary _Tp to an alternative type in _Variant.
  579. template<typename _Tp, typename _Variant, typename = void>
  580. struct __accepted_index
  581. { static constexpr size_t value = variant_npos; };
  582. template<typename _Tp, typename... _Types>
  583. struct __accepted_index<
  584. _Tp, variant<_Types...>,
  585. decltype(__overload_set<_Types...>::_S_fun(std::declval<_Tp>()),
  586. std::declval<void>())>
  587. {
  588. static constexpr size_t value = sizeof...(_Types) - 1
  589. - decltype(__overload_set<_Types...>::
  590. _S_fun(std::declval<_Tp>()))::value;
  591. };
  592. // Returns the raw storage for __v.
  593. template<typename _Variant>
  594. void* __get_storage(_Variant&& __v)
  595. { return __v._M_storage(); }
  596. // Used for storing multi-dimensional vtable.
  597. template<typename _Tp, size_t... _Dimensions>
  598. struct _Multi_array
  599. {
  600. constexpr const _Tp&
  601. _M_access() const
  602. { return _M_data; }
  603. _Tp _M_data;
  604. };
  605. template<typename _Tp, size_t __first, size_t... __rest>
  606. struct _Multi_array<_Tp, __first, __rest...>
  607. {
  608. template<typename... _Args>
  609. constexpr const _Tp&
  610. _M_access(size_t __first_index, _Args... __rest_indices) const
  611. { return _M_arr[__first_index]._M_access(__rest_indices...); }
  612. _Multi_array<_Tp, __rest...> _M_arr[__first];
  613. };
  614. // Creates a multi-dimensional vtable recursively.
  615. //
  616. // For example,
  617. // visit([](auto, auto){},
  618. // variant<int, char>(), // typedef'ed as V1
  619. // variant<float, double, long double>()) // typedef'ed as V2
  620. // will trigger instantiations of:
  621. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 2, 3>,
  622. // tuple<V1&&, V2&&>, std::index_sequence<>>
  623. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 3>,
  624. // tuple<V1&&, V2&&>, std::index_sequence<0>>
  625. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  626. // tuple<V1&&, V2&&>, std::index_sequence<0, 0>>
  627. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  628. // tuple<V1&&, V2&&>, std::index_sequence<0, 1>>
  629. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  630. // tuple<V1&&, V2&&>, std::index_sequence<0, 2>>
  631. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&), 3>,
  632. // tuple<V1&&, V2&&>, std::index_sequence<1>>
  633. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  634. // tuple<V1&&, V2&&>, std::index_sequence<1, 0>>
  635. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  636. // tuple<V1&&, V2&&>, std::index_sequence<1, 1>>
  637. // __gen_vtable_impl<_Multi_array<void(*)(V1&&, V2&&)>,
  638. // tuple<V1&&, V2&&>, std::index_sequence<1, 2>>
  639. // The returned multi-dimensional vtable can be fast accessed by the visitor
  640. // using index calculation.
  641. template<typename _Array_type, typename _Variant_tuple, typename _Index_seq>
  642. struct __gen_vtable_impl;
  643. template<typename _Result_type, typename _Visitor, size_t... __dimensions,
  644. typename... _Variants, size_t... __indices>
  645. struct __gen_vtable_impl<
  646. _Multi_array<_Result_type (*)(_Visitor, _Variants...), __dimensions...>,
  647. tuple<_Variants...>, std::index_sequence<__indices...>>
  648. {
  649. using _Next =
  650. remove_reference_t<typename _Nth_type<sizeof...(__indices),
  651. _Variants...>::type>;
  652. using _Array_type =
  653. _Multi_array<_Result_type (*)(_Visitor, _Variants...),
  654. __dimensions...>;
  655. static constexpr _Array_type
  656. _S_apply()
  657. {
  658. _Array_type __vtable{};
  659. _S_apply_all_alts(
  660. __vtable, make_index_sequence<variant_size_v<_Next>>());
  661. return __vtable;
  662. }
  663. template<size_t... __var_indices>
  664. static constexpr void
  665. _S_apply_all_alts(_Array_type& __vtable,
  666. std::index_sequence<__var_indices...>)
  667. {
  668. (_S_apply_single_alt<__var_indices>(
  669. __vtable._M_arr[__var_indices]), ...);
  670. }
  671. template<size_t __index, typename _Tp>
  672. static constexpr void
  673. _S_apply_single_alt(_Tp& __element)
  674. {
  675. using _Alternative = variant_alternative_t<__index, _Next>;
  676. __element = __gen_vtable_impl<
  677. remove_reference_t<
  678. decltype(__element)>, tuple<_Variants...>,
  679. std::index_sequence<__indices..., __index>>::_S_apply();
  680. }
  681. };
  682. template<typename _Result_type, typename _Visitor, typename... _Variants,
  683. size_t... __indices>
  684. struct __gen_vtable_impl<
  685. _Multi_array<_Result_type (*)(_Visitor, _Variants...)>,
  686. tuple<_Variants...>, std::index_sequence<__indices...>>
  687. {
  688. using _Array_type =
  689. _Multi_array<_Result_type (*)(_Visitor&&, _Variants...)>;
  690. decltype(auto)
  691. static constexpr __visit_invoke(_Visitor&& __visitor, _Variants... __vars)
  692. {
  693. return std::__invoke(std::forward<_Visitor>(__visitor),
  694. std::get<__indices>(std::forward<_Variants>(__vars))...);
  695. }
  696. static constexpr auto
  697. _S_apply()
  698. { return _Array_type{&__visit_invoke}; }
  699. };
  700. template<typename _Result_type, typename _Visitor, typename... _Variants>
  701. struct __gen_vtable
  702. {
  703. using _Func_ptr = _Result_type (*)(_Visitor&&, _Variants...);
  704. using _Array_type =
  705. _Multi_array<_Func_ptr,
  706. variant_size_v<remove_reference_t<_Variants>>...>;
  707. static constexpr _Array_type
  708. _S_apply()
  709. {
  710. return __gen_vtable_impl<_Array_type, tuple<_Variants...>,
  711. std::index_sequence<>>::_S_apply();
  712. }
  713. static constexpr auto _S_vtable = _S_apply();
  714. };
  715. template<size_t _Np, typename _Tp>
  716. struct _Base_dedup : public _Tp { };
  717. template<typename _Variant, typename __indices>
  718. struct _Variant_hash_base;
  719. template<typename... _Types, size_t... __indices>
  720. struct _Variant_hash_base<variant<_Types...>,
  721. std::index_sequence<__indices...>>
  722. : _Base_dedup<__indices, __poison_hash<remove_const_t<_Types>>>... { };
  723. } // namespace __variant
  724. } // namespace __detail
  725. template<typename _Tp, typename... _Types>
  726. inline constexpr bool holds_alternative(const variant<_Types...>& __v)
  727. noexcept
  728. {
  729. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  730. "T should occur for exactly once in alternatives");
  731. return __v.index() == __detail::__variant::__index_of_v<_Tp, _Types...>;
  732. }
  733. template<typename _Tp, typename... _Types>
  734. constexpr inline _Tp& get(variant<_Types...>& __v)
  735. {
  736. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  737. "T should occur for exactly once in alternatives");
  738. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  739. return std::get<__detail::__variant::__index_of_v<_Tp, _Types...>>(__v);
  740. }
  741. template<typename _Tp, typename... _Types>
  742. constexpr inline _Tp&& get(variant<_Types...>&& __v)
  743. {
  744. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  745. "T should occur for exactly once in alternatives");
  746. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  747. return std::get<__detail::__variant::__index_of_v<_Tp, _Types...>>(
  748. std::move(__v));
  749. }
  750. template<typename _Tp, typename... _Types>
  751. constexpr inline const _Tp& get(const variant<_Types...>& __v)
  752. {
  753. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  754. "T should occur for exactly once in alternatives");
  755. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  756. return std::get<__detail::__variant::__index_of_v<_Tp, _Types...>>(__v);
  757. }
  758. template<typename _Tp, typename... _Types>
  759. constexpr inline const _Tp&& get(const variant<_Types...>&& __v)
  760. {
  761. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  762. "T should occur for exactly once in alternatives");
  763. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  764. return std::get<__detail::__variant::__index_of_v<_Tp, _Types...>>(
  765. std::move(__v));
  766. }
  767. template<size_t _Np, typename... _Types>
  768. constexpr inline
  769. add_pointer_t<variant_alternative_t<_Np, variant<_Types...>>>
  770. get_if(variant<_Types...>* __ptr) noexcept
  771. {
  772. using _Alternative_type = variant_alternative_t<_Np, variant<_Types...>>;
  773. static_assert(_Np < sizeof...(_Types),
  774. "The index should be in [0, number of alternatives)");
  775. static_assert(!is_void_v<_Alternative_type>, "_Tp should not be void");
  776. if (__ptr && __ptr->index() == _Np)
  777. return &__detail::__variant::__get<_Np>(*__ptr);
  778. return nullptr;
  779. }
  780. template<size_t _Np, typename... _Types>
  781. constexpr inline
  782. add_pointer_t<const variant_alternative_t<_Np, variant<_Types...>>>
  783. get_if(const variant<_Types...>* __ptr) noexcept
  784. {
  785. using _Alternative_type = variant_alternative_t<_Np, variant<_Types...>>;
  786. static_assert(_Np < sizeof...(_Types),
  787. "The index should be in [0, number of alternatives)");
  788. static_assert(!is_void_v<_Alternative_type>, "_Tp should not be void");
  789. if (__ptr && __ptr->index() == _Np)
  790. return &__detail::__variant::__get<_Np>(*__ptr);
  791. return nullptr;
  792. }
  793. template<typename _Tp, typename... _Types>
  794. constexpr inline add_pointer_t<_Tp>
  795. get_if(variant<_Types...>* __ptr) noexcept
  796. {
  797. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  798. "T should occur for exactly once in alternatives");
  799. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  800. return std::get_if<__detail::__variant::__index_of_v<_Tp, _Types...>>(
  801. __ptr);
  802. }
  803. template<typename _Tp, typename... _Types>
  804. constexpr inline add_pointer_t<const _Tp>
  805. get_if(const variant<_Types...>* __ptr)
  806. noexcept
  807. {
  808. static_assert(__detail::__variant::__exactly_once<_Tp, _Types...>,
  809. "T should occur for exactly once in alternatives");
  810. static_assert(!is_void_v<_Tp>, "_Tp should not be void");
  811. return std::get_if<__detail::__variant::__index_of_v<_Tp, _Types...>>(
  812. __ptr);
  813. }
  814. struct monostate { };
  815. #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP, __NAME) \
  816. template<typename... _Types> \
  817. constexpr bool operator __OP(const variant<_Types...>& __lhs, \
  818. const variant<_Types...>& __rhs) \
  819. { \
  820. return __lhs._M_##__NAME(__rhs, std::index_sequence_for<_Types...>{}); \
  821. } \
  822. \
  823. constexpr bool operator __OP(monostate, monostate) noexcept \
  824. { return 0 __OP 0; }
  825. _VARIANT_RELATION_FUNCTION_TEMPLATE(<, less)
  826. _VARIANT_RELATION_FUNCTION_TEMPLATE(<=, less_equal)
  827. _VARIANT_RELATION_FUNCTION_TEMPLATE(==, equal)
  828. _VARIANT_RELATION_FUNCTION_TEMPLATE(!=, not_equal)
  829. _VARIANT_RELATION_FUNCTION_TEMPLATE(>=, greater_equal)
  830. _VARIANT_RELATION_FUNCTION_TEMPLATE(>, greater)
  831. #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
  832. template<typename _Visitor, typename... _Variants>
  833. constexpr decltype(auto) visit(_Visitor&&, _Variants&&...);
  834. template<typename... _Types>
  835. inline enable_if_t<(is_move_constructible_v<_Types> && ...)
  836. && (is_swappable_v<_Types> && ...)>
  837. swap(variant<_Types...>& __lhs, variant<_Types...>& __rhs)
  838. noexcept(noexcept(__lhs.swap(__rhs)))
  839. { __lhs.swap(__rhs); }
  840. template<typename... _Types>
  841. enable_if_t<!((is_move_constructible_v<_Types> && ...)
  842. && (is_swappable_v<_Types> && ...))>
  843. swap(variant<_Types...>&, variant<_Types...>&) = delete;
  844. class bad_variant_access : public exception
  845. {
  846. public:
  847. bad_variant_access() noexcept : _M_reason("Unknown reason") { }
  848. const char* what() const noexcept override
  849. { return _M_reason; }
  850. private:
  851. bad_variant_access(const char* __reason) : _M_reason(__reason) { }
  852. const char* _M_reason;
  853. friend void __throw_bad_variant_access(const char* __what);
  854. };
  855. inline void
  856. __throw_bad_variant_access(const char* __what)
  857. { _GLIBCXX_THROW_OR_ABORT(bad_variant_access(__what)); }
  858. template<typename... _Types>
  859. class variant
  860. : private __detail::__variant::_Variant_base<_Types...>,
  861. private _Enable_default_constructor<
  862. __detail::__variant::_Traits<_Types...>::_S_default_ctor,
  863. variant<_Types...>>,
  864. private _Enable_copy_move<
  865. __detail::__variant::_Traits<_Types...>::_S_copy_ctor,
  866. __detail::__variant::_Traits<_Types...>::_S_copy_assign,
  867. __detail::__variant::_Traits<_Types...>::_S_move_ctor,
  868. __detail::__variant::_Traits<_Types...>::_S_move_assign,
  869. variant<_Types...>>
  870. {
  871. private:
  872. static_assert(sizeof...(_Types) > 0,
  873. "variant must have at least one alternative");
  874. static_assert(!(std::is_reference_v<_Types> || ...),
  875. "variant must have no reference alternative");
  876. static_assert(!(std::is_void_v<_Types> || ...),
  877. "variant must have no void alternative");
  878. using _Base = __detail::__variant::_Variant_base<_Types...>;
  879. using _Default_ctor_enabler =
  880. _Enable_default_constructor<
  881. __detail::__variant::_Traits<_Types...>::_S_default_ctor,
  882. variant<_Types...>>;
  883. template<typename _Tp>
  884. static constexpr bool
  885. __exactly_once = __detail::__variant::__exactly_once<_Tp, _Types...>;
  886. template<typename _Tp>
  887. static constexpr size_t __accepted_index =
  888. __detail::__variant::__accepted_index<_Tp&&, variant>::value;
  889. template<size_t _Np, bool = _Np < sizeof...(_Types)>
  890. struct __to_type_impl;
  891. template<size_t _Np>
  892. struct __to_type_impl<_Np, true>
  893. { using type = variant_alternative_t<_Np, variant>; };
  894. template<size_t _Np>
  895. using __to_type = typename __to_type_impl<_Np>::type;
  896. template<typename _Tp>
  897. using __accepted_type = __to_type<__accepted_index<_Tp>>;
  898. template<typename _Tp>
  899. static constexpr size_t __index_of =
  900. __detail::__variant::__index_of_v<_Tp, _Types...>;
  901. using _Traits = __detail::__variant::_Traits<_Types...>;
  902. public:
  903. variant() = default;
  904. variant(const variant& __rhs) = default;
  905. variant(variant&&) = default;
  906. variant& operator=(const variant&) = default;
  907. variant& operator=(variant&&) = default;
  908. ~variant() = default;
  909. template<typename _Tp,
  910. typename = enable_if_t<!is_same_v<decay_t<_Tp>, variant>>,
  911. typename = enable_if_t<(sizeof...(_Types)>0)>,
  912. typename = enable_if_t<__exactly_once<__accepted_type<_Tp&&>>
  913. && is_constructible_v<__accepted_type<_Tp&&>, _Tp&&>>>
  914. constexpr
  915. variant(_Tp&& __t)
  916. noexcept(is_nothrow_constructible_v<__accepted_type<_Tp&&>, _Tp&&>)
  917. : variant(in_place_index<__accepted_index<_Tp&&>>,
  918. std::forward<_Tp>(__t))
  919. { __glibcxx_assert(holds_alternative<__accepted_type<_Tp&&>>(*this)); }
  920. template<typename _Tp, typename... _Args,
  921. typename = enable_if_t<__exactly_once<_Tp>
  922. && is_constructible_v<_Tp, _Args&&...>>>
  923. constexpr explicit
  924. variant(in_place_type_t<_Tp>, _Args&&... __args)
  925. : variant(in_place_index<__index_of<_Tp>>,
  926. std::forward<_Args>(__args)...)
  927. { __glibcxx_assert(holds_alternative<_Tp>(*this)); }
  928. template<typename _Tp, typename _Up, typename... _Args,
  929. typename = enable_if_t<__exactly_once<_Tp>
  930. && is_constructible_v<
  931. _Tp, initializer_list<_Up>&, _Args&&...>>>
  932. constexpr explicit
  933. variant(in_place_type_t<_Tp>, initializer_list<_Up> __il,
  934. _Args&&... __args)
  935. : variant(in_place_index<__index_of<_Tp>>, __il,
  936. std::forward<_Args>(__args)...)
  937. { __glibcxx_assert(holds_alternative<_Tp>(*this)); }
  938. template<size_t _Np, typename... _Args,
  939. typename = enable_if_t<
  940. is_constructible_v<__to_type<_Np>, _Args&&...>>>
  941. constexpr explicit
  942. variant(in_place_index_t<_Np>, _Args&&... __args)
  943. : _Base(in_place_index<_Np>, std::forward<_Args>(__args)...),
  944. _Default_ctor_enabler(_Enable_default_constructor_tag{})
  945. { __glibcxx_assert(index() == _Np); }
  946. template<size_t _Np, typename _Up, typename... _Args,
  947. typename = enable_if_t<is_constructible_v<__to_type<_Np>,
  948. initializer_list<_Up>&, _Args&&...>>>
  949. constexpr explicit
  950. variant(in_place_index_t<_Np>, initializer_list<_Up> __il,
  951. _Args&&... __args)
  952. : _Base(in_place_index<_Np>, __il, std::forward<_Args>(__args)...),
  953. _Default_ctor_enabler(_Enable_default_constructor_tag{})
  954. { __glibcxx_assert(index() == _Np); }
  955. template<typename _Tp>
  956. enable_if_t<__exactly_once<__accepted_type<_Tp&&>>
  957. && is_constructible_v<__accepted_type<_Tp&&>, _Tp&&>
  958. && is_assignable_v<__accepted_type<_Tp&&>&, _Tp&&>
  959. && !is_same_v<decay_t<_Tp>, variant>, variant&>
  960. operator=(_Tp&& __rhs)
  961. noexcept(is_nothrow_assignable_v<__accepted_type<_Tp&&>&, _Tp&&>
  962. && is_nothrow_constructible_v<__accepted_type<_Tp&&>, _Tp&&>)
  963. {
  964. constexpr auto __index = __accepted_index<_Tp&&>;
  965. if (index() == __index)
  966. std::get<__index>(*this) = std::forward<_Tp>(__rhs);
  967. else
  968. this->emplace<__index>(std::forward<_Tp>(__rhs));
  969. __glibcxx_assert(holds_alternative<__accepted_type<_Tp&&>>(*this));
  970. return *this;
  971. }
  972. template<typename _Tp, typename... _Args>
  973. enable_if_t<is_constructible_v<_Tp, _Args...> && __exactly_once<_Tp>,
  974. _Tp&>
  975. emplace(_Args&&... __args)
  976. {
  977. auto& ret =
  978. this->emplace<__index_of<_Tp>>(std::forward<_Args>(__args)...);
  979. __glibcxx_assert(holds_alternative<_Tp>(*this));
  980. return ret;
  981. }
  982. template<typename _Tp, typename _Up, typename... _Args>
  983. enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
  984. && __exactly_once<_Tp>,
  985. _Tp&>
  986. emplace(initializer_list<_Up> __il, _Args&&... __args)
  987. {
  988. auto& ret =
  989. this->emplace<__index_of<_Tp>>(__il,
  990. std::forward<_Args>(__args)...);
  991. __glibcxx_assert(holds_alternative<_Tp>(*this));
  992. return ret;
  993. }
  994. template<size_t _Np, typename... _Args>
  995. enable_if_t<is_constructible_v<variant_alternative_t<_Np, variant>,
  996. _Args...>,
  997. variant_alternative_t<_Np, variant>&>
  998. emplace(_Args&&... __args)
  999. {
  1000. static_assert(_Np < sizeof...(_Types),
  1001. "The index should be in [0, number of alternatives)");
  1002. this->~variant();
  1003. __try
  1004. {
  1005. ::new (this) variant(in_place_index<_Np>,
  1006. std::forward<_Args>(__args)...);
  1007. }
  1008. __catch (...)
  1009. {
  1010. this->_M_index = variant_npos;
  1011. __throw_exception_again;
  1012. }
  1013. __glibcxx_assert(index() == _Np);
  1014. return std::get<_Np>(*this);
  1015. }
  1016. template<size_t _Np, typename _Up, typename... _Args>
  1017. enable_if_t<is_constructible_v<variant_alternative_t<_Np, variant>,
  1018. initializer_list<_Up>&, _Args...>,
  1019. variant_alternative_t<_Np, variant>&>
  1020. emplace(initializer_list<_Up> __il, _Args&&... __args)
  1021. {
  1022. static_assert(_Np < sizeof...(_Types),
  1023. "The index should be in [0, number of alternatives)");
  1024. this->~variant();
  1025. __try
  1026. {
  1027. ::new (this) variant(in_place_index<_Np>, __il,
  1028. std::forward<_Args>(__args)...);
  1029. }
  1030. __catch (...)
  1031. {
  1032. this->_M_index = variant_npos;
  1033. __throw_exception_again;
  1034. }
  1035. __glibcxx_assert(index() == _Np);
  1036. return std::get<_Np>(*this);
  1037. }
  1038. constexpr bool valueless_by_exception() const noexcept
  1039. { return !this->_M_valid(); }
  1040. constexpr size_t index() const noexcept
  1041. {
  1042. if (this->_M_index ==
  1043. typename _Base::__index_type(variant_npos))
  1044. return variant_npos;
  1045. return this->_M_index;
  1046. }
  1047. void
  1048. swap(variant& __rhs)
  1049. noexcept((__is_nothrow_swappable<_Types>::value && ...)
  1050. && is_nothrow_move_constructible_v<variant>)
  1051. {
  1052. if (this->index() == __rhs.index())
  1053. {
  1054. if (this->_M_valid())
  1055. {
  1056. static constexpr void (*_S_vtable[])(void*, void*) =
  1057. { &__detail::__variant::__erased_swap<_Types&, _Types&>... };
  1058. _S_vtable[__rhs._M_index](this->_M_storage(),
  1059. __rhs._M_storage());
  1060. }
  1061. }
  1062. else if (!this->_M_valid())
  1063. {
  1064. this->_M_destructive_move(std::move(__rhs));
  1065. __rhs._M_reset();
  1066. }
  1067. else if (!__rhs._M_valid())
  1068. {
  1069. __rhs._M_destructive_move(std::move(*this));
  1070. this->_M_reset();
  1071. }
  1072. else
  1073. {
  1074. auto __tmp = std::move(__rhs);
  1075. __rhs._M_destructive_move(std::move(*this));
  1076. this->_M_destructive_move(std::move(__tmp));
  1077. }
  1078. }
  1079. private:
  1080. #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP, __NAME) \
  1081. template<size_t... __indices> \
  1082. static constexpr bool \
  1083. (*_S_erased_##__NAME[])(const variant&, const variant&) = \
  1084. { &__detail::__variant::__erased_##__NAME< \
  1085. const variant&, __indices>... }; \
  1086. template<size_t... __indices> \
  1087. constexpr inline bool \
  1088. _M_##__NAME(const variant& __rhs, \
  1089. std::index_sequence<__indices...>) const \
  1090. { \
  1091. auto __lhs_index = this->index(); \
  1092. auto __rhs_index = __rhs.index(); \
  1093. if (__lhs_index != __rhs_index || valueless_by_exception()) \
  1094. /* Modulo addition. */ \
  1095. return __lhs_index + 1 __OP __rhs_index + 1; \
  1096. return _S_erased_##__NAME<__indices...>[__lhs_index](*this, __rhs); \
  1097. }
  1098. _VARIANT_RELATION_FUNCTION_TEMPLATE(<, less)
  1099. _VARIANT_RELATION_FUNCTION_TEMPLATE(<=, less_equal)
  1100. _VARIANT_RELATION_FUNCTION_TEMPLATE(==, equal)
  1101. _VARIANT_RELATION_FUNCTION_TEMPLATE(!=, not_equal)
  1102. _VARIANT_RELATION_FUNCTION_TEMPLATE(>=, greater_equal)
  1103. _VARIANT_RELATION_FUNCTION_TEMPLATE(>, greater)
  1104. #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
  1105. #ifdef __clang__
  1106. public:
  1107. using _Base::_M_u; // See https://bugs.llvm.org/show_bug.cgi?id=31852
  1108. private:
  1109. #endif
  1110. template<size_t _Np, typename _Vp>
  1111. friend constexpr decltype(auto) __detail::__variant::__get(_Vp&& __v);
  1112. template<typename _Vp>
  1113. friend void* __detail::__variant::__get_storage(_Vp&& __v);
  1114. #define _VARIANT_RELATION_FUNCTION_TEMPLATE(__OP) \
  1115. template<typename... _Tp> \
  1116. friend constexpr bool \
  1117. operator __OP(const variant<_Tp...>& __lhs, \
  1118. const variant<_Tp...>& __rhs);
  1119. _VARIANT_RELATION_FUNCTION_TEMPLATE(<)
  1120. _VARIANT_RELATION_FUNCTION_TEMPLATE(<=)
  1121. _VARIANT_RELATION_FUNCTION_TEMPLATE(==)
  1122. _VARIANT_RELATION_FUNCTION_TEMPLATE(!=)
  1123. _VARIANT_RELATION_FUNCTION_TEMPLATE(>=)
  1124. _VARIANT_RELATION_FUNCTION_TEMPLATE(>)
  1125. #undef _VARIANT_RELATION_FUNCTION_TEMPLATE
  1126. };
  1127. template<size_t _Np, typename... _Types>
  1128. constexpr variant_alternative_t<_Np, variant<_Types...>>&
  1129. get(variant<_Types...>& __v)
  1130. {
  1131. static_assert(_Np < sizeof...(_Types),
  1132. "The index should be in [0, number of alternatives)");
  1133. if (__v.index() != _Np)
  1134. __throw_bad_variant_access("Unexpected index");
  1135. return __detail::__variant::__get<_Np>(__v);
  1136. }
  1137. template<size_t _Np, typename... _Types>
  1138. constexpr variant_alternative_t<_Np, variant<_Types...>>&&
  1139. get(variant<_Types...>&& __v)
  1140. {
  1141. static_assert(_Np < sizeof...(_Types),
  1142. "The index should be in [0, number of alternatives)");
  1143. if (__v.index() != _Np)
  1144. __throw_bad_variant_access("Unexpected index");
  1145. return __detail::__variant::__get<_Np>(std::move(__v));
  1146. }
  1147. template<size_t _Np, typename... _Types>
  1148. constexpr const variant_alternative_t<_Np, variant<_Types...>>&
  1149. get(const variant<_Types...>& __v)
  1150. {
  1151. static_assert(_Np < sizeof...(_Types),
  1152. "The index should be in [0, number of alternatives)");
  1153. if (__v.index() != _Np)
  1154. __throw_bad_variant_access("Unexpected index");
  1155. return __detail::__variant::__get<_Np>(__v);
  1156. }
  1157. template<size_t _Np, typename... _Types>
  1158. constexpr const variant_alternative_t<_Np, variant<_Types...>>&&
  1159. get(const variant<_Types...>&& __v)
  1160. {
  1161. static_assert(_Np < sizeof...(_Types),
  1162. "The index should be in [0, number of alternatives)");
  1163. if (__v.index() != _Np)
  1164. __throw_bad_variant_access("Unexpected index");
  1165. return __detail::__variant::__get<_Np>(std::move(__v));
  1166. }
  1167. template<typename _Visitor, typename... _Variants>
  1168. constexpr decltype(auto)
  1169. visit(_Visitor&& __visitor, _Variants&&... __variants)
  1170. {
  1171. if ((__variants.valueless_by_exception() || ...))
  1172. __throw_bad_variant_access("Unexpected index");
  1173. using _Result_type =
  1174. decltype(std::forward<_Visitor>(__visitor)(
  1175. std::get<0>(std::forward<_Variants>(__variants))...));
  1176. constexpr auto& __vtable = __detail::__variant::__gen_vtable<
  1177. _Result_type, _Visitor&&, _Variants&&...>::_S_vtable;
  1178. auto __func_ptr = __vtable._M_access(__variants.index()...);
  1179. return (*__func_ptr)(std::forward<_Visitor>(__visitor),
  1180. std::forward<_Variants>(__variants)...);
  1181. }
  1182. template<bool, typename... _Types>
  1183. struct __variant_hash_call_base_impl
  1184. {
  1185. size_t
  1186. operator()(const variant<_Types...>& __t) const
  1187. noexcept((is_nothrow_invocable_v<hash<decay_t<_Types>>, _Types> && ...))
  1188. {
  1189. if (!__t.valueless_by_exception())
  1190. {
  1191. namespace __edv = __detail::__variant;
  1192. static constexpr size_t (*_S_vtable[])(void*) =
  1193. { &__edv::__erased_hash<const _Types&>... };
  1194. return hash<size_t>{}(__t.index())
  1195. + _S_vtable[__t.index()](__edv::__get_storage(__t));
  1196. }
  1197. return hash<size_t>{}(__t.index());
  1198. }
  1199. };
  1200. template<typename... _Types>
  1201. struct __variant_hash_call_base_impl<false, _Types...> {};
  1202. template<typename... _Types>
  1203. using __variant_hash_call_base =
  1204. __variant_hash_call_base_impl<(__poison_hash<remove_const_t<_Types>>::
  1205. __enable_hash_call &&...), _Types...>;
  1206. template<typename... _Types>
  1207. struct hash<variant<_Types...>>
  1208. : private __detail::__variant::_Variant_hash_base<
  1209. variant<_Types...>, std::index_sequence_for<_Types...>>,
  1210. public __variant_hash_call_base<_Types...>
  1211. {
  1212. using result_type [[__deprecated__]] = size_t;
  1213. using argument_type [[__deprecated__]] = variant<_Types...>;
  1214. };
  1215. template<>
  1216. struct hash<monostate>
  1217. {
  1218. using result_type [[__deprecated__]] = size_t;
  1219. using argument_type [[__deprecated__]] = monostate;
  1220. size_t
  1221. operator()(const monostate& __t) const noexcept
  1222. {
  1223. constexpr size_t __magic_monostate_hash = -7777;
  1224. return __magic_monostate_hash;
  1225. }
  1226. };
  1227. template<typename... _Types>
  1228. struct __is_fast_hash<hash<variant<_Types...>>>
  1229. : bool_constant<(__is_fast_hash<_Types>::value && ...)>
  1230. { };
  1231. _GLIBCXX_END_NAMESPACE_VERSION
  1232. } // namespace std
  1233. #endif // C++17
  1234. #endif // _GLIBCXX_VARIANT