14 template <
class T,
class Tag =
void>
34 explicit(not detail::is_implicitly_default_constructible_v<T>)
36 requires std::default_initializable<T> =
default;
45 explicit(not std::is_convertible_v<const T&, T>)
46 constexpr single(
const T& rhs)
47 requires std::copy_constructible<T>
51 template <
class U = T>
52 requires std::constructible_from<T, U&&>
53 explicit(not std::is_convertible_v<U, T>)
55 : instance_(std::forward<U>(rhs)) {}
58 template <tuple_like Tuple>
60 not std::constructible_from<T, Tuple&&> and
61 std::constructible_from<T, detail::copy_reference_t<Tuple, std::tuple_element_t<0, Tuple>>&&>
63 explicit(not std::is_convertible_v<std::tuple_element_t<0, Tuple>, T>)
64 constexpr single(Tuple&& rhs)
65 : instance_(get<0>(std::forward<Tuple>(rhs))) {}
68 template <
class... Args>
69 requires std::constructible_from<T, Args&&...>
70 constexpr single(std::in_place_t, Args&&... args)
71 : instance_(std::forward<Args>(args)...) {}
74 template <
class U,
class... Args>
75 requires std::constructible_from<T, std::initializer_list<U>, Args&&...>
76 constexpr single(std::in_place_t, std::initializer_list<U> il, Args&&... args)
77 : instance_(il, std::forward<Args>(args)...) {}
83 requires std::is_copy_assignable_v<T> {
90 noexcept(std::is_nothrow_move_assignable_v<T>)
91 requires std::is_move_assignable_v<T> {
92 instance_ = *std::move(rhs);
97 template <std::convertible_to<T> U = T>
98 single& operator=(U&& rhs) {
99 instance_ = std::forward<U>(rhs);
104 template <tuple_like Tuple>
106 not std::convertible_to<Tuple, T> and
107 std::convertible_to<std::tuple_element_t<0, Tuple>, T>
109 constexpr single&
operator=(Tuple&& rhs) {
110 instance_ = get<0>(std::forward<Tuple>(rhs));
116 auto operator<=>(
const single&)
const
117 requires std::equality_comparable<T> =
default;
122 noexcept(std::is_nothrow_swappable_v<T>)
123 requires std::swappable<T> {
125 swap(instance_, other.instance_);
130 constexpr decltype(
auto)
operator*() & {
134 constexpr decltype(
auto)
operator*()
const& {
138 constexpr decltype(
auto)
operator*() && {
139 return std::move(instance_);
142 constexpr decltype(
auto)
operator*()
const&& {
143 return std::move(instance_);
148 constexpr auto operator->() {
149 return std::addressof(instance_);
152 constexpr auto operator->()
const {
153 return std::addressof(instance_);
163 template <
class T,
class Tag =
void>
167 template <std::swappable T,
class Tag>
169 noexcept(std::is_nothrow_swappable_v<T>) {
174 template <std::
size_t Idx,
class T,
class Tag>
181 template <std::
size_t Idx,
class T,
class Tag>
188 template <std::
size_t Idx,
class T,
class Tag>
191 return *std::move(s);
195 template <std::
size_t Idx,
class T,
class Tag>
198 return *std::move(s);
207template <
class T,
class Tag>
211template <std::
size_t Idx,
class T,
class Tag>
void swap(single< T, Tag > &lhs, single< T, Tag > &rhs) noexcept(std::is_nothrow_swappable_v< T >)
swap for single
Definition: single.hpp:168
constexpr decltype(auto) get(single< T, Tag > &s)
get for single
Definition: single.hpp:176
std::integral_constant< std::size_t, N > index_constant
index_constant
Definition: stdfundamental.hpp:24
A class that holds a single value.
Definition: single.hpp:15