This commit is contained in:
Denis Blank 2017-11-14 03:13:54 +01:00
parent a6b6148f44
commit b3d350cb11
2 changed files with 32 additions and 6 deletions

View File

@ -40,13 +40,16 @@
namespace cti { namespace cti {
namespace detail { namespace detail {
namespace expected { namespace expected {
/// A tag which is passed to the visitor when the expected type is empty
struct empty_guard_tag {};
/// A class similar to the one in the expected proposal, /// A class similar to the one in the expected proposal,
/// however it is capable of carrying an exception_ptr if /// however it is capable of carrying an exception_ptr if
/// exceptions are used. /// exceptions are used.
template <typename T, typename Storage = std::aligned_storage_t<std::max( template <typename T, typename Storage = std::aligned_storage_t<std::max(
sizeof(types::error_type), sizeof(T))>> sizeof(types::error_type), sizeof(T))>>
class expected { class expected {
enum class slot_t { empty, type, error }; enum class slot_t { empty, value, error };
Storage storage_; Storage storage_;
slot_t slot_; slot_t slot_;
@ -55,7 +58,30 @@ public:
explicit expected() : slot_(slot_t::empty) { explicit expected() : slot_(slot_t::empty) {
} }
explicit expected(T value) : slot_(slot_t::error) { explicit expected(T value) : slot_(slot_t::value) {
}
explicit expected(types::error_type error) : slot_(slot_t::value) {
}
bool is_empty() const noexcept {
return slot_ == slot_t::empty;
}
bool is_value() const noexcept {
return slot_ == slot_t::value;
}
bool is_error() const noexcept {
return slot_ == slot_t::error;
}
template <typename T>
auto visit(T&& visitor)
-> decltype(std::forward<T>(visitor)(empty_guard_tag{})) {
switch(slot_)
{
}
} }
}; };
} // namespace expected } // namespace expected

View File

@ -36,12 +36,12 @@ struct coroutine_traits<void, T...> {
void set_exception(exception_ptr const&) noexcept { void set_exception(exception_ptr const&) noexcept {
} }
bool initial_suspend() noexcept { suspend_never initial_suspend() noexcept {
return false; return {};
} }
bool final_suspend() noexcept { suspend_never final_suspend() noexcept {
return false; return {};
} }
void return_void() noexcept { void return_void() noexcept {