tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
variadic_union.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_VARIANT_VARIADIC_UNION_HPP
4#define TETL_VARIANT_VARIADIC_UNION_HPP
5
6#include <etl/_config/all.hpp>
7
12#include <etl/_utility/move.hpp>
14
15namespace etl {
16
17template <typename... Ts>
19};
20
21template <typename T, typename... Ts>
23 explicit constexpr variadic_union(uninitialized_union /*tag*/) { }
24
25 template <typename... Args>
26 explicit constexpr variadic_union(index_constant<0> /*index*/, Args&&... args)
27 : head(etl::forward<Args>(args)...)
28 {
29 }
30
31 template <size_t I, typename... Args>
32 requires(I > 0)
33 explicit constexpr variadic_union(index_constant<I> /*index*/, Args&&... args)
34 : tail(index_v<I - 1>, etl::forward<Args>(args)...)
35 {
36 }
37
38 constexpr variadic_union(variadic_union const& other) = default;
39 constexpr auto operator=(variadic_union const& other) -> variadic_union& = default;
40
41 constexpr variadic_union(variadic_union&& other) = default;
42 constexpr auto operator=(variadic_union&& other) -> variadic_union& = default;
43
44 constexpr ~variadic_union()
46 = default;
47
48 constexpr ~variadic_union() { }
49
50 template <size_t I>
51 constexpr auto operator[](index_constant<I> /*index*/) & -> auto&
52 {
53 if constexpr (I == 0) {
54 return head;
55 } else {
56 return tail[index_v<I - 1>];
57 }
58 }
59
60 template <size_t I>
61 constexpr auto operator[](index_constant<I> /*index*/) const& -> auto const&
62 {
63 if constexpr (I == 0) {
64 return head;
65 } else {
66 return tail[index_v<I - 1>];
67 }
68 }
69
70 template <size_t I>
71 constexpr auto operator[](index_constant<I> /*index*/) && -> auto&&
72 {
73 if constexpr (I == 0) {
74 return etl::move(head);
75 } else {
76 return etl::move(tail)[index_v<I - 1>];
77 }
78 }
79
80 template <size_t I>
81 constexpr auto operator[](index_constant<I> /*index*/) const&& -> auto const&&
82 {
83 if constexpr (I == 0) {
84 return etl::move(head);
85 } else {
86 return etl::move(tail)[index_v<I - 1>];
87 }
88 }
89
92};
93
94} // namespace etl
95
96#endif // TETL_VARIANT_VARIADIC_UNION_HPP
#define TETL_TRIVIAL_ABI
Definition attributes.hpp:47
#define TETL_NO_UNIQUE_ADDRESS
Definition attributes.hpp:41
constexpr auto move(InputIt first, InputIt last, OutputIt destination) -> OutputIt
Moves the elements in the range [first, last), to another range beginning at destination,...
Definition move.hpp:26
Definition adjacent_find.hpp:8
integral_constant< size_t, I > index_constant
Definition index_constant.hpp:12
constexpr auto index_v
Definition index_constant.hpp:15
constexpr bool is_trivially_destructible_v
Definition is_trivially_destructible.hpp:33
constexpr auto forward(remove_reference_t< T > &param) noexcept -> T &&
Forwards lvalues as either lvalues or as rvalues, depending on T. When t is a forwarding reference (a...
Definition forward.hpp:18
Definition uninitialized_union.hpp:9
constexpr auto operator=(variadic_union &&other) -> variadic_union &=default
constexpr auto operator[](index_constant< I >) const &&-> auto const &&
Definition variadic_union.hpp:81
constexpr auto operator[](index_constant< I >) &-> auto &
Definition variadic_union.hpp:51
constexpr variadic_union(variadic_union const &other)=default
constexpr ~variadic_union()=default
constexpr variadic_union(index_constant< I >, Args &&... args)
Definition variadic_union.hpp:33
constexpr variadic_union(uninitialized_union)
Definition variadic_union.hpp:23
constexpr auto operator[](index_constant< I >) const &-> auto const &
Definition variadic_union.hpp:61
constexpr variadic_union(variadic_union &&other)=default
TETL_NO_UNIQUE_ADDRESS variadic_union< Ts... > tail
Definition variadic_union.hpp:91
constexpr ~variadic_union()
Definition variadic_union.hpp:48
constexpr auto operator[](index_constant< I >) &&-> auto &&
Definition variadic_union.hpp:71
constexpr auto operator=(variadic_union const &other) -> variadic_union &=default
constexpr variadic_union(index_constant< 0 >, Args &&... args)
Definition variadic_union.hpp:26
TETL_NO_UNIQUE_ADDRESS T head
Definition variadic_union.hpp:90
Definition variadic_union.hpp:18