|
|
@@ -13,8 +13,6 @@
|
|
|
|
|
|
#include "pointer_fwd.hpp"
|
|
|
|
|
|
-#include "not_null.hpp"
|
|
|
-
|
|
|
class unchecked_pointer_exception : public std::logic_error {
|
|
|
using std::logic_error::logic_error;
|
|
|
};
|
|
|
@@ -29,16 +27,19 @@ public:
|
|
|
using reference = element_type &;
|
|
|
|
|
|
maybe_null() : _ptr(nullptr) {}
|
|
|
- template <typename... Args> maybe_null(Args && ...args) : _ptr(std::forward<Args>(args)...) { }
|
|
|
+ maybe_null(T const & p) : _ptr(p) { }
|
|
|
+ maybe_null(T && p) : _ptr(std::move(p)) { }
|
|
|
maybe_null(maybe_null const&) = default;
|
|
|
- template <typename Y> maybe_null(maybe_null<Y> const& other) : _ptr(other.ptr_) { }
|
|
|
- template <typename Y> maybe_null(not_null<Y> const& other) : _ptr(other.get()) { }
|
|
|
|
|
|
- maybe_null& operator=(T ptr) { return operator=(maybe_null<T>(ptr)); }
|
|
|
+ template <typename Y>
|
|
|
+ explicit operator maybe_null<Y>() const {
|
|
|
+ return _ptr;
|
|
|
+ }
|
|
|
+
|
|
|
maybe_null& operator=(maybe_null const&) = default;
|
|
|
template <typename Y> maybe_null& operator=(maybe_null<Y> const&other) {
|
|
|
- if (_ptr != other.get()) {
|
|
|
- _ptr = other.get();
|
|
|
+ if (_ptr != other._ptr) {
|
|
|
+ _ptr = other._ptr;
|
|
|
#if defined( DEBUG )
|
|
|
tested_ = other.tested_;
|
|
|
#endif
|
|
|
@@ -46,34 +47,25 @@ public:
|
|
|
return *this;
|
|
|
}
|
|
|
|
|
|
- template <typename Y> maybe_null& operator=(not_null<Y> const&other) {
|
|
|
- _ptr = other.get();
|
|
|
-#if defined( DEBUG )
|
|
|
- tested_ = true;
|
|
|
-#endif
|
|
|
- return *this;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
operator bool() const {
|
|
|
#if defined( DEBUG )
|
|
|
tested_ = true;
|
|
|
#endif
|
|
|
- return bool(_ptr);
|
|
|
+ return static_cast<bool>(_ptr);
|
|
|
}
|
|
|
|
|
|
- pointer get() const {
|
|
|
+ pointer get() const { return std::addressof(*_ptr); }
|
|
|
+ pointer operator->() const {
|
|
|
+ return std::addressof(operator*());
|
|
|
+ }
|
|
|
+ reference operator*() const {
|
|
|
#if defined( DEBUG )
|
|
|
if ( !tested_ ) {
|
|
|
throw unchecked_pointer_exception{"did not verify that pointer was non-null"};
|
|
|
}
|
|
|
#endif
|
|
|
- return std::addressof(operator*());
|
|
|
+ return *_ptr;
|
|
|
}
|
|
|
- // operator T() const { return get(); }
|
|
|
- pointer operator->() const { return get(); }
|
|
|
- reference operator*() const { return *_ptr; }
|
|
|
-
|
|
|
bool operator==(maybe_null const&rhs) const { return _ptr == rhs._ptr; }
|
|
|
bool operator!=(maybe_null const&rhs) const { return _ptr != rhs._ptr; }
|
|
|
bool operator<=(maybe_null const&rhs) const { return _ptr <= rhs._ptr; }
|