Akumuli
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends
expected.h
1 #pragma once
2 #include <exception>
3 #include <stdexcept>
4 
5 namespace Akumuli {
6 
9 template <class Target> class Expected {
10  union {
11  std::exception_ptr except_;
12  Target value_;
13  };
14  bool is_set_;
15 
16 public:
18  Expected(Target const& t)
19  : value_(t)
20  , is_set_(true) {}
21 
24  : is_set_(t.is_set_) {
25  if (is_set_) {
26  value_ = t.value_;
27  } else {
28  except_ = t.except_;
29  }
30  }
31 
34  if (&t == this) {
35  return *this;
36  }
37  is_set_ = t.is_set_;
38  if (is_set_) {
39  value_ = t.value_;
40  } else {
41  except_ = t.except_;
42  }
43  return *this;
44  }
45 
46  ~Expected() {
47  if (is_set_) {
48  (&value_)->~Target();
49  } else {
50  (&except_)->~exception_ptr();
51  }
52  }
53 
55  Expected(std::exception_ptr&& ptr)
56  : except_(std::move(ptr))
57  , is_set_(false) {}
58 
60  template <class E> static Expected<Target> from(E const& e) {
61  return Expected<Target>(std::make_exception_ptr(e));
62  }
63 
65  const Target& get() const {
66  if (!is_set_) {
67  std::rethrow_exception(except_);
68  }
69  return value_;
70  }
71 
73  bool ok() const { return is_set_; }
74 
76  template <class Exception> bool unpack_error(Exception* err) {
77  if (is_set_) {
78  return false;
79  } else {
80  try {
81  std::rethrow_exception(except_);
82  } catch (Exception const& e) {
83  *err = e;
84  }
85  }
86  return true;
87  }
88 };
89 }
Definition: util.h:59
bool unpack_error(Exception *err)
Extract error from value.
Definition: expected.h:76
Expected(Target const &t)
Value c-tor.
Definition: expected.h:18
Definition: expected.h:9
Expected(Expected< Target > const &t)
Copy expected value.
Definition: expected.h:23
Expected< Target > & operator=(Expected< Target > const &t)
Assignment.
Definition: expected.h:33
Expected(std::exception_ptr &&ptr)
Construct from exception ptr.
Definition: expected.h:55
bool ok() const
Check for error.
Definition: expected.h:73
static Expected< Target > from(E const &e)
Construct from any exception.
Definition: expected.h:60