6#ifdef __clang_analyzer__
10namespace CppClingo::Util {
34#ifdef __clang_analyzer__
35 template <
class... Args>
37 : data_{std::make_shared<T>(std::forward<Args>(args)...)} {}
45 template <
class... Args>
47 : data_{new data_type(std::forward<Args>(args)...)} {}
68 data_ = std::exchange(other.data_,
nullptr);
78 [[nodiscard]]
auto has_value() const noexcept ->
bool {
return data_ !=
nullptr; }
81 [[nodiscard]]
explicit operator bool() const noexcept {
return has_value(); }
85#ifdef __clang_analyzer__
99 [[nodiscard]]
operator T
const &()
const noexcept {
return get(); }
102#ifdef __clang_analyzer__
103 std::shared_ptr<T> data_;
106 template <
class... Args> data_type(Args &&...args) : value{std::forward<Args>(args)...} {}
111 void inc_() const noexcept {
112 if (data_ !=
nullptr) {
117 void dec_() noexcept {
118 if (data_ !=
nullptr) {
120 if (data_->refs == 0) {
127 data_type *data_ =
nullptr;
133 static_assert(std::is_constructible_v<U, Args...>);
140template <
class X,
class Y>
145 return lhs.get() == rhs.get();
151template <
class X,
class Y>
154 return *lhs <=> *rhs;
156 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:96
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:84
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:78
immutable_value(std::in_place_t tag, Args &&...args)
Construct a value in place.
Definition immutable_value.hh:46
~immutable_value() noexcept
Decrement reference count and delete contained pointer if zero.
Definition immutable_value.hh:74
immutable_value(immutable_value &&other) noexcept
Move construct an immutable value.
Definition immutable_value.hh:53
immutable_value(U &&value)
Construct a value.
Definition immutable_value.hh:32
auto operator=(immutable_value const &other) noexcept -> immutable_value &
Copy assign an immutable value.
Definition immutable_value.hh:57
immutable_value(immutable_value const &other) noexcept
Copy an immutable value.
Definition immutable_value.hh:50
auto operator*() const noexcept -> element_type const &
Get the value.
Definition immutable_value.hh:93
auto operator=(immutable_value &&other) noexcept -> immutable_value &
Move assign an immutable value.
Definition immutable_value.hh:65
auto make_immutable(Args &&...args) -> immutable_value< U >
Construct an immutable value.
Definition immutable_value.hh:132
auto operator==(const immutable_value< X > &lhs, const immutable_value< Y > &rhs) -> bool
Compare two immutable values.
Definition immutable_value.hh:141