-
Notifications
You must be signed in to change notification settings - Fork 34
/
optref.hpp
82 lines (63 loc) · 1.45 KB
/
optref.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
* Copyright Quadrivium LLC
* All Rights Reserved
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <optional>
#include <type_traits>
#include <boost/assert.hpp>
namespace kagome {
template <typename T>
class OptRef {
public:
OptRef() = default;
OptRef(const OptRef &) = default;
OptRef(OptRef &&) noexcept = default;
OptRef(T &data) : data{&data} {}
OptRef(T &&) = delete;
OptRef(std::nullopt_t) {}
~OptRef() = default;
OptRef &operator=(const OptRef &) = default;
OptRef &operator=(OptRef &&) noexcept = default;
T &operator*() {
BOOST_ASSERT(data);
return *data;
}
const T &operator*() const {
BOOST_ASSERT(data);
return *data;
}
T *operator->() {
BOOST_ASSERT(data);
return data;
}
const T *operator->() const {
BOOST_ASSERT(data);
return data;
}
T &value() {
BOOST_ASSERT(data);
return *data;
}
const T &value() const {
BOOST_ASSERT(data);
return *data;
}
explicit operator bool() const {
return data != nullptr;
}
bool operator!() const {
return data == nullptr;
}
bool has_value() const {
return data != nullptr;
}
bool operator==(const OptRef<T> &) const = default;
bool operator==(const T &other) const {
return has_value() && (*data == other);
}
private:
T *data = nullptr;
};
} // namespace kagome