6#ifdef __clang_analyzer__
10namespace CppClingo::Util {
36#ifdef __clang_analyzer__
37 template <
class... Args>
39 : data_{std::make_shared<T>(std::forward<Args>(args)...)} {}
47 template <
class... Args>
49 : data_{new data_type(std::forward<Args>(args)...)} {}
70 data_ = std::exchange(other.data_,
nullptr);
80 [[nodiscard]]
auto has_value() const noexcept ->
bool {
return data_ !=
nullptr; }
83 [[nodiscard]]
explicit operator bool() const noexcept {
return has_value(); }
87#ifdef __clang_analyzer__
101 [[nodiscard]]
operator T
const &()
const noexcept {
return get(); }
104#ifdef __clang_analyzer__
105 std::shared_ptr<T> data_;
108 template <
class... Args> data_type(Args &&...args) : value{std::forward<Args>(args)...} {}
113 void inc_() const noexcept {
114 if (data_ !=
nullptr) {
119 void dec_() noexcept {
120 if (data_ !=
nullptr) {
122 if (data_->refs == 0) {
129 data_type *data_ =
nullptr;
135 static_assert(std::is_constructible_v<U, Args...>);
142template <
class X,
class Y>
147 return lhs.get() == rhs.get();
153template <
class X,
class Y>
156 return *lhs <=> *rhs;
158 return lhs.
get() <=> rhs.
get();
An immutable value imlementation.
Definition immutable_value.hh:19
auto operator->() const noexcept -> element_type const *
Get the member of pointer.
Definition immutable_value.hh:98
T element_type
The type of the stored pointer.
Definition immutable_value.hh:22
auto get() const noexcept -> element_type const &
Get the value.
Definition immutable_value.hh:86
constexpr immutable_value() noexcept=default
Construct a null pointer.
auto has_value() const noexcept -> bool
Check if the value is engaged.
Definition immutable_value.hh:80
immutable_value(std::in_place_t tag, Args &&...args)
Construct a value in place.
Definition immutable_value.hh:48
~immutable_value() noexcept
Decrement reference count and delete contained pointer if zero.
Definition immutable_value.hh:76
immutable_value(immutable_value &&other) noexcept
Move construct an immutable value.
Definition immutable_value.hh:55
auto operator=(immutable_value const &other) noexcept -> immutable_value &
Copy assign an immutable value.
Definition immutable_value.hh:59
immutable_value(immutable_value const &other) noexcept
Copy an immutable value.
Definition immutable_value.hh:52
auto operator*() const noexcept -> element_type const &
Get the value.
Definition immutable_value.hh:95
auto operator=(immutable_value &&other) noexcept -> immutable_value &
Move assign an immutable value.
Definition immutable_value.hh:67
immutable_value(U &&value)
Construct a value.
Definition immutable_value.hh:34
auto make_immutable(Args &&...args) -> immutable_value< U >
Construct an immutable value.
Definition immutable_value.hh:134
auto operator==(const immutable_value< X > &lhs, const immutable_value< Y > &rhs) -> bool
Compare two immutable values.
Definition immutable_value.hh:143