1 // Copyright 2018 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // -----------------------------------------------------------------------------
16 // variant.h
17 // -----------------------------------------------------------------------------
18 //
19 // This header file defines an `absl::variant` type for holding a type-safe
20 // value of some prescribed set of types (noted as alternative types), and
21 // associated functions for managing variants.
22 //
23 // The `absl::variant` type is a form of type-safe union. An `absl::variant`
24 // should always hold a value of one of its alternative types (except in the
25 // "valueless by exception state" -- see below). A default-constructed
26 // `absl::variant` will hold the value of its first alternative type, provided
27 // it is default-constructible.
28 //
29 // In exceptional cases due to error, an `absl::variant` can hold no
30 // value (known as a "valueless by exception" state), though this is not the
31 // norm.
32 //
33 // As with `absl::optional`, an `absl::variant` -- when it holds a value --
34 // allocates a value of that type directly within the `variant` itself; it
35 // cannot hold a reference, array, or the type `void`; it can, however, hold a
36 // pointer to externally managed memory.
37 //
38 // `absl::variant` is a C++11 compatible version of the C++17 `std::variant`
39 // abstraction and is designed to be a drop-in replacement for code compliant
40 // with C++17.
41 
42 #ifndef ABSL_TYPES_VARIANT_H_
43 #define ABSL_TYPES_VARIANT_H_
44 
45 #include "absl/base/config.h"
46 #include "absl/utility/utility.h"
47 
48 #ifdef ABSL_USES_STD_VARIANT
49 
50 #include <variant>  // IWYU pragma: export
51 
52 namespace absl {
53 ABSL_NAMESPACE_BEGIN
54 using std::bad_variant_access;
55 using std::get;
56 using std::get_if;
57 using std::holds_alternative;
58 using std::monostate;
59 using std::variant;
60 using std::variant_alternative;
61 using std::variant_alternative_t;
62 using std::variant_npos;
63 using std::variant_size;
64 using std::variant_size_v;
65 using std::visit;
66 ABSL_NAMESPACE_END
67 }  // namespace absl
68 
69 #else  // ABSL_USES_STD_VARIANT
70 
71 #include <functional>
72 #include <new>
73 #include <type_traits>
74 #include <utility>
75 
76 #include "absl/base/macros.h"
77 #include "absl/base/port.h"
78 #include "absl/meta/type_traits.h"
79 #include "absl/types/internal/variant.h"
80 
81 namespace absl {
82 ABSL_NAMESPACE_BEGIN
83 
84 // -----------------------------------------------------------------------------
85 // absl::variant
86 // -----------------------------------------------------------------------------
87 //
88 // An `absl::variant` type is a form of type-safe union. An `absl::variant` --
89 // except in exceptional cases -- always holds a value of one of its alternative
90 // types.
91 //
92 // Example:
93 //
94 //   // Construct a variant that holds either an integer or a std::string and
95 //   // assign it to a std::string.
96 //   absl::variant<int, std::string> v = std::string("abc");
97 //
98 //   // A default-constructed variant will hold a value-initialized value of
99 //   // the first alternative type.
100 //   auto a = absl::variant<int, std::string>();   // Holds an int of value '0'.
101 //
102 //   // variants are assignable.
103 //
104 //   // copy assignment
105 //   auto v1 = absl::variant<int, std::string>("abc");
106 //   auto v2 = absl::variant<int, std::string>(10);
107 //   v2 = v1;  // copy assign
108 //
109 //   // move assignment
110 //   auto v1 = absl::variant<int, std::string>("abc");
111 //   v1 = absl::variant<int, std::string>(10);
112 //
113 //   // assignment through type conversion
114 //   a = 128;         // variant contains int
115 //   a = "128";       // variant contains std::string
116 //
117 // An `absl::variant` holding a value of one of its alternative types `T` holds
118 // an allocation of `T` directly within the variant itself. An `absl::variant`
119 // is not allowed to allocate additional storage, such as dynamic memory, to
120 // allocate the contained value. The contained value shall be allocated in a
121 // region of the variant storage suitably aligned for all alternative types.
122 template <typename... Ts>
123 class variant;
124 
125 // swap()
126 //
127 // Swaps two `absl::variant` values. This function is equivalent to `v.swap(w)`
128 // where `v` and `w` are `absl::variant` types.
129 //
130 // Note that this function requires all alternative types to be both swappable
131 // and move-constructible, because any two variants may refer to either the same
132 // type (in which case, they will be swapped) or to two different types (in
133 // which case the values will need to be moved).
134 //
135 template <
136     typename... Ts,
137     absl::enable_if_t<
138         absl::conjunction<std::is_move_constructible<Ts>...,
139                           type_traits_internal::IsSwappable<Ts>...>::value,
140         int> = 0>
swap(variant<Ts...> & v,variant<Ts...> & w)141 void swap(variant<Ts...>& v, variant<Ts...>& w) noexcept(noexcept(v.swap(w))) {
142   v.swap(w);
143 }
144 
145 // variant_size
146 //
147 // Returns the number of alternative types available for a given `absl::variant`
148 // type as a compile-time constant expression. As this is a class template, it
149 // is not generally useful for accessing the number of alternative types of
150 // any given `absl::variant` instance.
151 //
152 // Example:
153 //
154 //   auto a = absl::variant<int, std::string>;
155 //   constexpr int num_types =
156 //       absl::variant_size<absl::variant<int, std::string>>();
157 //
158 //   // You can also use the member constant `value`.
159 //   constexpr int num_types =
160 //       absl::variant_size<absl::variant<int, std::string>>::value;
161 //
162 //   // `absl::variant_size` is more valuable for use in generic code:
163 //   template <typename Variant>
164 //   constexpr bool IsVariantMultivalue() {
165 //       return absl::variant_size<Variant>() > 1;
166 //   }
167 //
168 // Note that the set of cv-qualified specializations of `variant_size` are
169 // provided to ensure that those specializations compile (especially when passed
170 // within template logic).
171 template <class T>
172 struct variant_size;
173 
174 template <class... Ts>
175 struct variant_size<variant<Ts...>>
176     : std::integral_constant<std::size_t, sizeof...(Ts)> {};
177 
178 // Specialization of `variant_size` for const qualified variants.
179 template <class T>
180 struct variant_size<const T> : variant_size<T>::type {};
181 
182 // Specialization of `variant_size` for volatile qualified variants.
183 template <class T>
184 struct variant_size<volatile T> : variant_size<T>::type {};
185 
186 // Specialization of `variant_size` for const volatile qualified variants.
187 template <class T>
188 struct variant_size<const volatile T> : variant_size<T>::type {};
189 
190 // variant_alternative
191 //
192 // Returns the alternative type for a given `absl::variant` at the passed
193 // index value as a compile-time constant expression. As this is a class
194 // template resulting in a type, it is not useful for access of the run-time
195 // value of any given `absl::variant` variable.
196 //
197 // Example:
198 //
199 //   // The type of the 0th alternative is "int".
200 //   using alternative_type_0
201 //     = absl::variant_alternative<0, absl::variant<int, std::string>>::type;
202 //
203 //   static_assert(std::is_same<alternative_type_0, int>::value, "");
204 //
205 //   // `absl::variant_alternative` is more valuable for use in generic code:
206 //   template <typename Variant>
207 //   constexpr bool IsFirstElementTrivial() {
208 //       return std::is_trivial_v<variant_alternative<0, Variant>::type>;
209 //   }
210 //
211 // Note that the set of cv-qualified specializations of `variant_alternative`
212 // are provided to ensure that those specializations compile (especially when
213 // passed within template logic).
214 template <std::size_t I, class T>
215 struct variant_alternative;
216 
217 template <std::size_t I, class... Types>
218 struct variant_alternative<I, variant<Types...>> {
219   using type =
220       variant_internal::VariantAlternativeSfinaeT<I, variant<Types...>>;
221 };
222 
223 // Specialization of `variant_alternative` for const qualified variants.
224 template <std::size_t I, class T>
225 struct variant_alternative<I, const T> {
226   using type = const typename variant_alternative<I, T>::type;
227 };
228 
229 // Specialization of `variant_alternative` for volatile qualified variants.
230 template <std::size_t I, class T>
231 struct variant_alternative<I, volatile T> {
232   using type = volatile typename variant_alternative<I, T>::type;
233 };
234 
235 // Specialization of `variant_alternative` for const volatile qualified
236 // variants.
237 template <std::size_t I, class T>
238 struct variant_alternative<I, const volatile T> {
239   using type = const volatile typename variant_alternative<I, T>::type;
240 };
241 
242 // Template type alias for variant_alternative<I, T>::type.
243 //
244 // Example:
245 //
246 //   using alternative_type_0
247 //     = absl::variant_alternative_t<0, absl::variant<int, std::string>>;
248 //   static_assert(std::is_same<alternative_type_0, int>::value, "");
249 template <std::size_t I, class T>
250 using variant_alternative_t = typename variant_alternative<I, T>::type;
251 
252 // holds_alternative()
253 //
254 // Checks whether the given variant currently holds a given alternative type,
255 // returning `true` if so.
256 //
257 // Example:
258 //
259 //   absl::variant<int, std::string> foo = 42;
260 //   if (absl::holds_alternative<int>(foo)) {
261 //       std::cout << "The variant holds an integer";
262 //   }
263 template <class T, class... Types>
264 constexpr bool holds_alternative(const variant<Types...>& v) noexcept {
265   static_assert(
266       variant_internal::UnambiguousIndexOfImpl<variant<Types...>, T,
267                                                0>::value != sizeof...(Types),
268       "The type T must occur exactly once in Types...");
269   return v.index() ==
270          variant_internal::UnambiguousIndexOf<variant<Types...>, T>::value;
271 }
272 
273 // get()
274 //
275 // Returns a reference to the value currently within a given variant, using
276 // either a unique alternative type amongst the variant's set of alternative
277 // types, or the variant's index value. Attempting to get a variant's value
278 // using a type that is not unique within the variant's set of alternative types
279 // is a compile-time error. If the index of the alternative being specified is
280 // different from the index of the alternative that is currently stored, throws
281 // `absl::bad_variant_access`.
282 //
283 // Example:
284 //
285 //   auto a = absl::variant<int, std::string>;
286 //
287 //   // Get the value by type (if unique).
288 //   int i = absl::get<int>(a);
289 //
290 //   auto b = absl::variant<int, int>;
291 //
292 //   // Getting the value by a type that is not unique is ill-formed.
293 //   int j = absl::get<int>(b);     // Compile Error!
294 //
295 //   // Getting value by index not ambiguous and allowed.
296 //   int k = absl::get<1>(b);
297 
298 // Overload for getting a variant's lvalue by type.
299 template <class T, class... Types>
300 constexpr T& get(variant<Types...>& v) {  // NOLINT
301   return variant_internal::VariantCoreAccess::CheckedAccess<
302       variant_internal::IndexOf<T, Types...>::value>(v);
303 }
304 
305 // Overload for getting a variant's rvalue by type.
306 // Note: `absl::move()` is required to allow use of constexpr in C++11.
307 template <class T, class... Types>
308 constexpr T&& get(variant<Types...>&& v) {
309   return variant_internal::VariantCoreAccess::CheckedAccess<
310       variant_internal::IndexOf<T, Types...>::value>(absl::move(v));
311 }
312 
313 // Overload for getting a variant's const lvalue by type.
314 template <class T, class... Types>
315 constexpr const T& get(const variant<Types...>& v) {
316   return variant_internal::VariantCoreAccess::CheckedAccess<
317       variant_internal::IndexOf<T, Types...>::value>(v);
318 }
319 
320 // Overload for getting a variant's const rvalue by type.
321 // Note: `absl::move()` is required to allow use of constexpr in C++11.
322 template <class T, class... Types>
323 constexpr const T&& get(const variant<Types...>&& v) {
324   return variant_internal::VariantCoreAccess::CheckedAccess<
325       variant_internal::IndexOf<T, Types...>::value>(absl::move(v));
326 }
327 
328 // Overload for getting a variant's lvalue by index.
329 template <std::size_t I, class... Types>
330 constexpr variant_alternative_t<I, variant<Types...>>& get(
331     variant<Types...>& v) {  // NOLINT
332   return variant_internal::VariantCoreAccess::CheckedAccess<I>(v);
333 }
334 
335 // Overload for getting a variant's rvalue by index.
336 // Note: `absl::move()` is required to allow use of constexpr in C++11.
337 template <std::size_t I, class... Types>
338 constexpr variant_alternative_t<I, variant<Types...>>&& get(
339     variant<Types...>&& v) {
340   return variant_internal::VariantCoreAccess::CheckedAccess<I>(absl::move(v));
341 }
342 
343 // Overload for getting a variant's const lvalue by index.
344 template <std::size_t I, class... Types>
345 constexpr const variant_alternative_t<I, variant<Types...>>& get(
346     const variant<Types...>& v) {
347   return variant_internal::VariantCoreAccess::CheckedAccess<I>(v);
348 }
349 
350 // Overload for getting a variant's const rvalue by index.
351 // Note: `absl::move()` is required to allow use of constexpr in C++11.
352 template <std::size_t I, class... Types>
353 constexpr const variant_alternative_t<I, variant<Types...>>&& get(
354     const variant<Types...>&& v) {
355   return variant_internal::VariantCoreAccess::CheckedAccess<I>(absl::move(v));
356 }
357 
358 // get_if()
359 //
360 // Returns a pointer to the value currently stored within a given variant, if
361 // present, using either a unique alternative type amongst the variant's set of
362 // alternative types, or the variant's index value. If such a value does not
363 // exist, returns `nullptr`.
364 //
365 // As with `get`, attempting to get a variant's value using a type that is not
366 // unique within the variant's set of alternative types is a compile-time error.
367 
368 // Overload for getting a pointer to the value stored in the given variant by
369 // index.
370 template <std::size_t I, class... Types>
371 constexpr absl::add_pointer_t<variant_alternative_t<I, variant<Types...>>>
372 get_if(variant<Types...>* v) noexcept {
373   return (v != nullptr && v->index() == I)
374              ? std::addressof(
375                    variant_internal::VariantCoreAccess::Access<I>(*v))
376              : nullptr;
377 }
378 
379 // Overload for getting a pointer to the const value stored in the given
380 // variant by index.
381 template <std::size_t I, class... Types>
382 constexpr absl::add_pointer_t<const variant_alternative_t<I, variant<Types...>>>
383 get_if(const variant<Types...>* v) noexcept {
384   return (v != nullptr && v->index() == I)
385              ? std::addressof(
386                    variant_internal::VariantCoreAccess::Access<I>(*v))
387              : nullptr;
388 }
389 
390 // Overload for getting a pointer to the value stored in the given variant by
391 // type.
392 template <class T, class... Types>
393 constexpr absl::add_pointer_t<T> get_if(variant<Types...>* v) noexcept {
394   return absl::get_if<variant_internal::IndexOf<T, Types...>::value>(v);
395 }
396 
397 // Overload for getting a pointer to the const value stored in the given variant
398 // by type.
399 template <class T, class... Types>
400 constexpr absl::add_pointer_t<const T> get_if(
401     const variant<Types...>* v) noexcept {
402   return absl::get_if<variant_internal::IndexOf<T, Types...>::value>(v);
403 }
404 
405 // visit()
406 //
407 // Calls a provided functor on a given set of variants. `absl::visit()` is
408 // commonly used to conditionally inspect the state of a given variant (or set
409 // of variants).
410 //
411 // The functor must return the same type when called with any of the variants'
412 // alternatives.
413 //
414 // Example:
415 //
416 //   // Define a visitor functor
417 //   struct GetVariant {
418 //       template<typename T>
419 //       void operator()(const T& i) const {
420 //         std::cout << "The variant's value is: " << i;
421 //       }
422 //   };
423 //
424 //   // Declare our variant, and call `absl::visit()` on it.
425 //   // Note that `GetVariant()` returns void in either case.
426 //   absl::variant<int, std::string> foo = std::string("foo");
427 //   GetVariant visitor;
428 //   absl::visit(visitor, foo);  // Prints `The variant's value is: foo'
429 template <typename Visitor, typename... Variants>
430 variant_internal::VisitResult<Visitor, Variants...> visit(Visitor&& vis,
431                                                           Variants&&... vars) {
432   return variant_internal::
433       VisitIndices<variant_size<absl::decay_t<Variants> >::value...>::Run(
434           variant_internal::PerformVisitation<Visitor, Variants...>{
435               std::forward_as_tuple(absl::forward<Variants>(vars)...),
436               absl::forward<Visitor>(vis)},
437           vars.index()...);
438 }
439 
440 // monostate
441 //
442 // The monostate class serves as a first alternative type for a variant for
443 // which the first variant type is otherwise not default-constructible.
444 struct monostate {};
445 
446 // `absl::monostate` Relational Operators
447 
448 constexpr bool operator<(monostate, monostate) noexcept { return false; }
449 constexpr bool operator>(monostate, monostate) noexcept { return false; }
450 constexpr bool operator<=(monostate, monostate) noexcept { return true; }
451 constexpr bool operator>=(monostate, monostate) noexcept { return true; }
452 constexpr bool operator==(monostate, monostate) noexcept { return true; }
453 constexpr bool operator!=(monostate, monostate) noexcept { return false; }
454 
455 
456 //------------------------------------------------------------------------------
457 // `absl::variant` Template Definition
458 //------------------------------------------------------------------------------
459 template <typename T0, typename... Tn>
460 class variant<T0, Tn...> : private variant_internal::VariantBase<T0, Tn...> {
461   static_assert(absl::conjunction<std::is_object<T0>,
462                                   std::is_object<Tn>...>::value,
463                 "Attempted to instantiate a variant containing a non-object "
464                 "type.");
465   // Intentionally not qualifying `negation` with `absl::` to work around a bug
466   // in MSVC 2015 with inline namespace and variadic template.
467   static_assert(absl::conjunction<negation<std::is_array<T0> >,
468                                   negation<std::is_array<Tn> >...>::value,
469                 "Attempted to instantiate a variant containing an array type.");
470   static_assert(absl::conjunction<std::is_nothrow_destructible<T0>,
471                                   std::is_nothrow_destructible<Tn>...>::value,
472                 "Attempted to instantiate a variant containing a non-nothrow "
473                 "destructible type.");
474 
475   friend struct variant_internal::VariantCoreAccess;
476 
477  private:
478   using Base = variant_internal::VariantBase<T0, Tn...>;
479 
480  public:
481   // Constructors
482 
483   // Constructs a variant holding a default-initialized value of the first
484   // alternative type.
485   constexpr variant() /*noexcept(see 111above)*/ = default;
486 
487   // Copy constructor, standard semantics
488   variant(const variant& other) = default;
489 
490   // Move constructor, standard semantics
491   variant(variant&& other) /*noexcept(see above)*/ = default;
492 
493   // Constructs a variant of an alternative type specified by overload
494   // resolution of the provided forwarding arguments through
495   // direct-initialization.
496   //
497   // Note: If the selected constructor is a constexpr constructor, this
498   // constructor shall be a constexpr constructor.
499   //
500   // NOTE: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0608r1.html
501   // has been voted passed the design phase in the C++ standard meeting in Mar
502   // 2018. It will be implemented and integrated into `absl::variant`.
503   template <
504       class T,
505       std::size_t I = std::enable_if<
506           variant_internal::IsNeitherSelfNorInPlace<variant,
507                                                     absl::decay_t<T>>::value,
508           variant_internal::IndexOfConstructedType<variant, T>>::type::value,
509       class Tj = absl::variant_alternative_t<I, variant>,
510       absl::enable_if_t<std::is_constructible<Tj, T>::value>* =
511           nullptr>
512   constexpr variant(T&& t) noexcept(std::is_nothrow_constructible<Tj, T>::value)
513       : Base(variant_internal::EmplaceTag<I>(), absl::forward<T>(t)) {}
514 
515   // Constructs a variant of an alternative type from the arguments through
516   // direct-initialization.
517   //
518   // Note: If the selected constructor is a constexpr constructor, this
519   // constructor shall be a constexpr constructor.
520   template <class T, class... Args,
521             typename std::enable_if<std::is_constructible<
522                 variant_internal::UnambiguousTypeOfT<variant, T>,
523                 Args...>::value>::type* = nullptr>
524   constexpr explicit variant(in_place_type_t<T>, Args&&... args)
525       : Base(variant_internal::EmplaceTag<
526                  variant_internal::UnambiguousIndexOf<variant, T>::value>(),
527              absl::forward<Args>(args)...) {}
528 
529   // Constructs a variant of an alternative type from an initializer list
530   // and other arguments through direct-initialization.
531   //
532   // Note: If the selected constructor is a constexpr constructor, this
533   // constructor shall be a constexpr constructor.
534   template <class T, class U, class... Args,
535             typename std::enable_if<std::is_constructible<
536                 variant_internal::UnambiguousTypeOfT<variant, T>,
537                 std::initializer_list<U>&, Args...>::value>::type* = nullptr>
538   constexpr explicit variant(in_place_type_t<T>, std::initializer_list<U> il,
539                              Args&&... args)
540       : Base(variant_internal::EmplaceTag<
541                  variant_internal::UnambiguousIndexOf<variant, T>::value>(),
542              il, absl::forward<Args>(args)...) {}
543 
544   // Constructs a variant of an alternative type from a provided index,
545   // through value-initialization using the provided forwarded arguments.
546   template <std::size_t I, class... Args,
547             typename std::enable_if<std::is_constructible<
548                 variant_internal::VariantAlternativeSfinaeT<I, variant>,
549                 Args...>::value>::type* = nullptr>
550   constexpr explicit variant(in_place_index_t<I>, Args&&... args)
551       : Base(variant_internal::EmplaceTag<I>(), absl::forward<Args>(args)...) {}
552 
553   // Constructs a variant of an alternative type from a provided index,
554   // through value-initialization of an initializer list and the provided
555   // forwarded arguments.
556   template <std::size_t I, class U, class... Args,
557             typename std::enable_if<std::is_constructible<
558                 variant_internal::VariantAlternativeSfinaeT<I, variant>,
559                 std::initializer_list<U>&, Args...>::value>::type* = nullptr>
560   constexpr explicit variant(in_place_index_t<I>, std::initializer_list<U> il,
561                              Args&&... args)
562       : Base(variant_internal::EmplaceTag<I>(), il,
563              absl::forward<Args>(args)...) {}
564 
565   // Destructors
566 
567   // Destroys the variant's currently contained value, provided that
568   // `absl::valueless_by_exception()` is false.
569   ~variant() = default;
570 
571   // Assignment Operators
572 
573   // Copy assignment operator
574   variant& operator=(const variant& other) = default;
575 
576   // Move assignment operator
577   variant& operator=(variant&& other) /*noexcept(see above)*/ = default;
578 
579   // Converting assignment operator
580   //
581   // NOTE: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0608r1.html
582   // has been voted passed the design phase in the C++ standard meeting in Mar
583   // 2018. It will be implemented and integrated into `absl::variant`.
584   template <
585       class T,
586       std::size_t I = std::enable_if<
587           !std::is_same<absl::decay_t<T>, variant>::value,
588           variant_internal::IndexOfConstructedType<variant, T>>::type::value,
589       class Tj = absl::variant_alternative_t<I, variant>,
590       typename std::enable_if<std::is_assignable<Tj&, T>::value &&
591                               std::is_constructible<Tj, T>::value>::type* =
592           nullptr>
593   variant& operator=(T&& t) noexcept(
594       std::is_nothrow_assignable<Tj&, T>::value&&
595           std::is_nothrow_constructible<Tj, T>::value) {
596     variant_internal::VisitIndices<sizeof...(Tn) + 1>::Run(
597         variant_internal::VariantCoreAccess::MakeConversionAssignVisitor(
598             this, absl::forward<T>(t)),
599         index());
600 
601     return *this;
602   }
603 
604 
605   // emplace() Functions
606 
607   // Constructs a value of the given alternative type T within the variant.
608   //
609   // Example:
610   //
611   //   absl::variant<std::vector<int>, int, std::string> v;
612   //   v.emplace<int>(99);
613   //   v.emplace<std::string>("abc");
614   template <
615       class T, class... Args,
616       typename std::enable_if<std::is_constructible<
617           absl::variant_alternative_t<
618               variant_internal::UnambiguousIndexOf<variant, T>::value, variant>,
619           Args...>::value>::type* = nullptr>
620   T& emplace(Args&&... args) {
621     return variant_internal::VariantCoreAccess::Replace<
622         variant_internal::UnambiguousIndexOf<variant, T>::value>(
623         this, absl::forward<Args>(args)...);
624   }
625 
626   // Constructs a value of the given alternative type T within the variant using
627   // an initializer list.
628   //
629   // Example:
630   //
631   //   absl::variant<std::vector<int>, int, std::string> v;
632   //   v.emplace<std::vector<int>>({0, 1, 2});
633   template <
634       class T, class U, class... Args,
635       typename std::enable_if<std::is_constructible<
636           absl::variant_alternative_t<
637               variant_internal::UnambiguousIndexOf<variant, T>::value, variant>,
638           std::initializer_list<U>&, Args...>::value>::type* = nullptr>
639   T& emplace(std::initializer_list<U> il, Args&&... args) {
640     return variant_internal::VariantCoreAccess::Replace<
641         variant_internal::UnambiguousIndexOf<variant, T>::value>(
642         this, il, absl::forward<Args>(args)...);
643   }
644 
645   // Destroys the current value of the variant (provided that
646   // `absl::valueless_by_exception()` is false, and constructs a new value at
647   // the given index.
648   //
649   // Example:
650   //
651   //   absl::variant<std::vector<int>, int, int> v;
652   //   v.emplace<1>(99);
653   //   v.emplace<2>(98);
654   //   v.emplace<int>(99);  // Won't compile. 'int' isn't a unique type.
655   template <std::size_t I, class... Args,
656             typename std::enable_if<
657                 std::is_constructible<absl::variant_alternative_t<I, variant>,
658                                       Args...>::value>::type* = nullptr>
659   absl::variant_alternative_t<I, variant>& emplace(Args&&... args) {
660     return variant_internal::VariantCoreAccess::Replace<I>(
661         this, absl::forward<Args>(args)...);
662   }
663 
664   // Destroys the current value of the variant (provided that
665   // `absl::valueless_by_exception()` is false, and constructs a new value at
666   // the given index using an initializer list and the provided arguments.
667   //
668   // Example:
669   //
670   //   absl::variant<std::vector<int>, int, int> v;
671   //   v.emplace<0>({0, 1, 2});
672   template <std::size_t I, class U, class... Args,
673             typename std::enable_if<std::is_constructible<
674                 absl::variant_alternative_t<I, variant>,
675                 std::initializer_list<U>&, Args...>::value>::type* = nullptr>
676   absl::variant_alternative_t<I, variant>& emplace(std::initializer_list<U> il,
677                                                    Args&&... args) {
678     return variant_internal::VariantCoreAccess::Replace<I>(
679         this, il, absl::forward<Args>(args)...);
680   }
681 
682   // variant::valueless_by_exception()
683   //
684   // Returns false if and only if the variant currently holds a valid value.
685   constexpr bool valueless_by_exception() const noexcept {
686     return this->index_ == absl::variant_npos;
687   }
688 
689   // variant::index()
690   //
691   // Returns the index value of the variant's currently selected alternative
692   // type.
693   constexpr std::size_t index() const noexcept { return this->index_; }
694 
695   // variant::swap()
696   //
697   // Swaps the values of two variant objects.
698   //
699   void swap(variant& rhs) noexcept(
700       absl::conjunction<
701           std::is_nothrow_move_constructible<T0>,
702           std::is_nothrow_move_constructible<Tn>...,
703           type_traits_internal::IsNothrowSwappable<T0>,
704           type_traits_internal::IsNothrowSwappable<Tn>...>::value) {
705     return variant_internal::VisitIndices<sizeof...(Tn) + 1>::Run(
706         variant_internal::Swap<T0, Tn...>{this, &rhs}, rhs.index());
707   }
708 };
709 
710 // We need a valid declaration of variant<> for SFINAE and overload resolution
711 // to work properly above, but we don't need a full declaration since this type
712 // will never be constructed. This declaration, though incomplete, suffices.
713 template <>
714 class variant<>;
715 
716 //------------------------------------------------------------------------------
717 // Relational Operators
718 //------------------------------------------------------------------------------
719 //
720 // If neither operand is in the `variant::valueless_by_exception` state:
721 //
722 //   * If the index of both variants is the same, the relational operator
723 //     returns the result of the corresponding relational operator for the
724 //     corresponding alternative type.
725 //   * If the index of both variants is not the same, the relational operator
726 //     returns the result of that operation applied to the value of the left
727 //     operand's index and the value of the right operand's index.
728 //   * If at least one operand is in the valueless_by_exception state:
729 //     - A variant in the valueless_by_exception state is only considered equal
730 //       to another variant in the valueless_by_exception state.
731 //     - If exactly one operand is in the valueless_by_exception state, the
732 //       variant in the valueless_by_exception state is less than the variant
733 //       that is not in the valueless_by_exception state.
734 //
735 // Note: The value 1 is added to each index in the relational comparisons such
736 // that the index corresponding to the valueless_by_exception state wraps around
737 // to 0 (the lowest value for the index type), and the remaining indices stay in
738 // the same relative order.
739 
740 // Equal-to operator
741 template <typename... Types>
742 constexpr variant_internal::RequireAllHaveEqualT<Types...> operator==(
743     const variant<Types...>& a, const variant<Types...>& b) {
744   return (a.index() == b.index()) &&
745          variant_internal::VisitIndices<sizeof...(Types)>::Run(
746              variant_internal::EqualsOp<Types...>{&a, &b}, a.index());
747 }
748 
749 // Not equal operator
750 template <typename... Types>
751 constexpr variant_internal::RequireAllHaveNotEqualT<Types...> operator!=(
752     const variant<Types...>& a, const variant<Types...>& b) {
753   return (a.index() != b.index()) ||
754          variant_internal::VisitIndices<sizeof...(Types)>::Run(
755              variant_internal::NotEqualsOp<Types...>{&a, &b}, a.index());
756 }
757 
758 // Less-than operator
759 template <typename... Types>
760 constexpr variant_internal::RequireAllHaveLessThanT<Types...> operator<(
761     const variant<Types...>& a, const variant<Types...>& b) {
762   return (a.index() != b.index())
763              ? (a.index() + 1) < (b.index() + 1)
764              : variant_internal::VisitIndices<sizeof...(Types)>::Run(
765                    variant_internal::LessThanOp<Types...>{&a, &b}, a.index());
766 }
767 
768 // Greater-than operator
769 template <typename... Types>
770 constexpr variant_internal::RequireAllHaveGreaterThanT<Types...> operator>(
771     const variant<Types...>& a, const variant<Types...>& b) {
772   return (a.index() != b.index())
773              ? (a.index() + 1) > (b.index() + 1)
774              : variant_internal::VisitIndices<sizeof...(Types)>::Run(
775                    variant_internal::GreaterThanOp<Types...>{&a, &b},
776                    a.index());
777 }
778 
779 // Less-than or equal-to operator
780 template <typename... Types>
781 constexpr variant_internal::RequireAllHaveLessThanOrEqualT<Types...> operator<=(
782     const variant<Types...>& a, const variant<Types...>& b) {
783   return (a.index() != b.index())
784              ? (a.index() + 1) < (b.index() + 1)
785              : variant_internal::VisitIndices<sizeof...(Types)>::Run(
786                    variant_internal::LessThanOrEqualsOp<Types...>{&a, &b},
787                    a.index());
788 }
789 
790 // Greater-than or equal-to operator
791 template <typename... Types>
792 constexpr variant_internal::RequireAllHaveGreaterThanOrEqualT<Types...>
793 operator>=(const variant<Types...>& a, const variant<Types...>& b) {
794   return (a.index() != b.index())
795              ? (a.index() + 1) > (b.index() + 1)
796              : variant_internal::VisitIndices<sizeof...(Types)>::Run(
797                    variant_internal::GreaterThanOrEqualsOp<Types...>{&a, &b},
798                    a.index());
799 }
800 
801 ABSL_NAMESPACE_END
802 }  // namespace absl
803 
804 namespace std {
805 
806 // hash()
807 template <>  // NOLINT
808 struct hash<absl::monostate> {
809   std::size_t operator()(absl::monostate) const { return 0; }
810 };
811 
812 template <class... T>  // NOLINT
813 struct hash<absl::variant<T...>>
814     : absl::variant_internal::VariantHashBase<absl::variant<T...>, void,
815                                               absl::remove_const_t<T>...> {};
816 
817 }  // namespace std
818 
819 #endif  // ABSL_USES_STD_VARIANT
820 
821 namespace absl {
822 ABSL_NAMESPACE_BEGIN
823 namespace variant_internal {
824 
825 // Helper visitor for converting a variant<Ts...>` into another type (mostly
826 // variant) that can be constructed from any type.
827 template <typename To>
828 struct ConversionVisitor {
829   template <typename T>
830   To operator()(T&& v) const {
831     return To(std::forward<T>(v));
832   }
833 };
834 
835 }  // namespace variant_internal
836 
837 // ConvertVariantTo()
838 //
839 // Helper functions to convert an `absl::variant` to a variant of another set of
840 // types, provided that the alternative type of the new variant type can be
841 // converted from any type in the source variant.
842 //
843 // Example:
844 //
845 //   absl::variant<name1, name2, float> InternalReq(const Req&);
846 //
847 //   // name1 and name2 are convertible to name
848 //   absl::variant<name, float> ExternalReq(const Req& req) {
849 //     return absl::ConvertVariantTo<absl::variant<name, float>>(
850 //              InternalReq(req));
851 //   }
852 template <typename To, typename Variant>
853 To ConvertVariantTo(Variant&& variant) {
854   return absl::visit(variant_internal::ConversionVisitor<To>{},
855                      std::forward<Variant>(variant));
856 }
857 
858 ABSL_NAMESPACE_END
859 }  // namespace absl
860 
861 #endif  // ABSL_TYPES_VARIANT_H_
862