mirror of
https://github.com/Naios/continuable.git
synced 2025-12-07 01:06:44 +08:00
More work on implementing the optional_variant type
This commit is contained in:
parent
224e8c835f
commit
42c04f0fcb
@ -222,16 +222,19 @@ public:
|
|||||||
|
|
||||||
template <typename V, std::size_t Index =
|
template <typename V, std::size_t Index =
|
||||||
traits::index_of_t<std::decay_t<V>, T...>::value>
|
traits::index_of_t<std::decay_t<V>, T...>::value>
|
||||||
explicit optional_variant(V&& value) //
|
// Since the optional_variant is never a part of the contained
|
||||||
|
// values itself this overload is safed against the linted issue.
|
||||||
|
// NOLINTNEXTLINE(misc-forwarding-reference-overload)
|
||||||
|
explicit optional_variant(V&& value)
|
||||||
: optional_variant(std::forward<V>(value), Index) {
|
: optional_variant(std::forward<V>(value), Index) {
|
||||||
}
|
}
|
||||||
|
|
||||||
optional_variant& operator=(T value) {
|
template <typename V, std::size_t Index =
|
||||||
set_value(std::move(value));
|
traits::index_of_t<std::decay_t<V>, T...>::value>
|
||||||
return *this;
|
optional_variant& operator=(V&& value) {
|
||||||
}
|
weak_destroy();
|
||||||
optional_variant& operator=(types::error_type error) {
|
init(std::forward<V>(value));
|
||||||
set_exception(std::move(error));
|
set_slot(Index);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,6 +252,18 @@ public:
|
|||||||
return !is_empty();
|
return !is_empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
V& cast() noexcept {
|
||||||
|
assert(!is_slot(traits::index_of_t<std::decay_t<V>, T...>::value));
|
||||||
|
return *reinterpret_cast<std::decay_t<V>*>(&this->storage_);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename V>
|
||||||
|
V const& cast() const noexcept {
|
||||||
|
assert(!is_slot(traits::index_of_t<std::decay_t<V>, T...>::value));
|
||||||
|
return *reinterpret_cast<std::decay_t<V> const*>(&this->storage_);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename V>
|
template <typename V>
|
||||||
void visit(V&& visitor) {
|
void visit(V&& visitor) {
|
||||||
@ -275,17 +290,6 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
V& cast() noexcept {
|
|
||||||
assert(!is_empty());
|
|
||||||
return *reinterpret_cast<V*>(&this->storage_);
|
|
||||||
}
|
|
||||||
template <typename V>
|
|
||||||
V const& cast() const noexcept {
|
|
||||||
assert(!is_empty());
|
|
||||||
return *reinterpret_cast<V const*>(&this->storage_);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
template <typename V>
|
||||||
void init(V&& value) {
|
void init(V&& value) {
|
||||||
assert(is_empty());
|
assert(is_empty());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user