9
9
#ifndef LLVM_LIBC_SRC___SUPPORT_CPP_EXPECTED_H
10
10
#define LLVM_LIBC_SRC___SUPPORT_CPP_EXPECTED_H
11
11
12
+ #include " src/__support/macros/attributes.h"
13
+
12
14
namespace LIBC_NAMESPACE ::cpp {
13
15
14
16
// This is used to hold an unexpected value so that a different constructor is
@@ -17,10 +19,12 @@ template <class T> class unexpected {
17
19
T value;
18
20
19
21
public:
20
- constexpr explicit unexpected (T value) : value(value) {}
21
- constexpr T error () { return value; }
22
+ LIBC_INLINE constexpr explicit unexpected (T value) : value(value) {}
23
+ LIBC_INLINE constexpr T error () { return value; }
22
24
};
23
25
26
+ template <class T > explicit unexpected (T) -> unexpected<T>;
27
+
24
28
template <class T , class E > class expected {
25
29
union {
26
30
T exp;
@@ -29,23 +33,23 @@ template <class T, class E> class expected {
29
33
bool is_expected;
30
34
31
35
public:
32
- constexpr expected (T exp) : exp(exp), is_expected(true ) {}
33
- constexpr expected (unexpected<E> unexp)
36
+ LIBC_INLINE constexpr expected (T exp) : exp(exp), is_expected(true ) {}
37
+ LIBC_INLINE constexpr expected (unexpected<E> unexp)
34
38
: unexp(unexp.error()), is_expected(false ) {}
35
39
36
- constexpr bool has_value () const { return is_expected; }
40
+ LIBC_INLINE constexpr bool has_value () const { return is_expected; }
37
41
38
- constexpr T &value () { return exp; }
39
- constexpr E &error () { return unexp; }
40
- constexpr const T &value () const { return exp; }
41
- constexpr const E &error () const { return unexp; }
42
+ LIBC_INLINE constexpr T &value () { return exp; }
43
+ LIBC_INLINE constexpr E &error () { return unexp; }
44
+ LIBC_INLINE constexpr const T &value () const { return exp; }
45
+ LIBC_INLINE constexpr const E &error () const { return unexp; }
42
46
43
- constexpr operator bool () const { return is_expected; }
47
+ LIBC_INLINE constexpr operator bool () const { return is_expected; }
44
48
45
- constexpr T &operator *() { return exp; }
46
- constexpr const T &operator *() const { return exp; }
47
- constexpr T *operator ->() { return &exp; }
48
- constexpr const T *operator ->() const { return &exp; }
49
+ LIBC_INLINE constexpr T &operator *() { return exp; }
50
+ LIBC_INLINE constexpr const T &operator *() const { return exp; }
51
+ LIBC_INLINE constexpr T *operator ->() { return &exp; }
52
+ LIBC_INLINE constexpr const T *operator ->() const { return &exp; }
49
53
};
50
54
51
55
} // namespace LIBC_NAMESPACE::cpp
0 commit comments