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// SPDX-FileCopyrightText: Copyright (C) 2024 Tobias Hienzsch
3
4#ifndef TETL_VARIANT_VARIADIC_UNION_HPP
5#define TETL_VARIANT_VARIADIC_UNION_HPP
6
7#include <etl/_config/all.hpp>
8
9#include <etl/_cstddef/size_t.hpp>
10#include <etl/_type_traits/index_constant.hpp>
11#include <etl/_type_traits/is_trivially_destructible.hpp>
12#include <etl/_utility/forward.hpp>
13#include <etl/_utility/move.hpp>
14#include <etl/_variant/uninitialized_union.hpp>
15
16namespace etl {
17
18template <typename... Ts>
20};
21
22template <typename T, typename... Ts>
24 explicit constexpr variadic_union(uninitialized_union /*tag*/) { }
25
26 template <typename... Args>
27 explicit constexpr variadic_union(index_constant<0> /*index*/, Args&&... args)
28 : head(etl::forward<Args>(args)...)
29 {
30 }
31
32 template <size_t I, typename... Args>
33 requires(I > 0)
34 explicit constexpr variadic_union(index_constant<I> /*index*/, Args&&... args)
35 : tail(index_v<I - 1>, etl::forward<Args>(args)...)
36 {
37 }
38
39 constexpr variadic_union(variadic_union const& other) = default;
40 constexpr auto operator=(variadic_union const& other) -> variadic_union& = default;
41
42 constexpr variadic_union(variadic_union&& other) = default;
43 constexpr auto operator=(variadic_union&& other) -> variadic_union& = default;
44
45 constexpr ~variadic_union()
46 requires(is_trivially_destructible_v<T> and ... and is_trivially_destructible_v<Ts>)
47 = default;
48
49 constexpr ~variadic_union() { }
50
51 template <size_t I>
52 constexpr auto operator[](index_constant<I> /*index*/) & -> auto&
53 {
54 if constexpr (I == 0) {
55 return head;
56 } else {
57 return tail[index_v<I - 1>];
58 }
59 }
60
61 template <size_t I>
62 constexpr auto operator[](index_constant<I> /*index*/) const& -> auto const&
63 {
64 if constexpr (I == 0) {
65 return head;
66 } else {
67 return tail[index_v<I - 1>];
68 }
69 }
70
71 template <size_t I>
72 constexpr auto operator[](index_constant<I> /*index*/) && -> auto&&
73 {
74 if constexpr (I == 0) {
75 return etl::move(head);
76 } else {
77 return etl::move(tail)[index_v<I - 1>];
78 }
79 }
80
81 template <size_t I>
82 constexpr auto operator[](index_constant<I> /*index*/) const&& -> auto const&&
83 {
84 if constexpr (I == 0) {
85 return etl::move(head);
86 } else {
87 return etl::move(tail)[index_v<I - 1>];
88 }
89 }
90
93};
94
95} // namespace etl
96
97#endif // TETL_VARIANT_VARIADIC_UNION_HPP
Definition adjacent_find.hpp:9
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:82
constexpr auto operator[](index_constant< I >) &-> auto &
Definition variadic_union.hpp:52
constexpr variadic_union(variadic_union const &other)=default
constexpr variadic_union(index_constant< I >, Args &&... args)
Definition variadic_union.hpp:34
constexpr variadic_union(uninitialized_union)
Definition variadic_union.hpp:24
constexpr auto operator[](index_constant< I >) const &-> auto const &
Definition variadic_union.hpp:62
constexpr variadic_union(variadic_union &&other)=default
TETL_NO_UNIQUE_ADDRESS variadic_union< Ts... > tail
Definition variadic_union.hpp:92
constexpr ~variadic_union()
Definition variadic_union.hpp:49
constexpr auto operator[](index_constant< I >) &&-> auto &&
Definition variadic_union.hpp:72
constexpr auto operator=(variadic_union const &other) -> variadic_union &=default
constexpr variadic_union(index_constant< 0 >, Args &&... args)
Definition variadic_union.hpp:27
TETL_NO_UNIQUE_ADDRESS T head
Definition variadic_union.hpp:91
Definition variadic_union.hpp:19