diff --git a/test/cfoa/helpers.hpp b/test/cfoa/helpers.hpp index 02ecfa05..a4db7e44 100644 --- a/test/cfoa/helpers.hpp +++ b/test/cfoa/helpers.hpp @@ -458,6 +458,7 @@ template class ptr public: ptr() : ptr_(0) {} + ptr(std::nullptr_t) : ptr_(nullptr) {} explicit ptr(void_ptr const& x) : ptr_((T*)x.ptr_) {} T& operator*() const { return *ptr_; } diff --git a/test/objects/minimal.hpp b/test/objects/minimal.hpp index c2690db3..bf94d924 100644 --- a/test/objects/minimal.hpp +++ b/test/objects/minimal.hpp @@ -307,6 +307,7 @@ namespace test { public: ptr() : ptr_(0) {} + ptr(std::nullptr_t) : ptr_(0) {} explicit ptr(void_ptr const& x) : ptr_((T*)x.ptr_) {} T& operator*() const { return *ptr_; } @@ -325,6 +326,18 @@ namespace test { ptr operator+(std::ptrdiff_t s) const { return ptr(ptr_ + s); } friend ptr operator+(std::ptrdiff_t s, ptr p) { return ptr(s + p.ptr_); } + ptr& operator+=(std::ptrdiff_t s) + { + ptr_ += s; + return *this; + } + + ptr& operator-=(std::ptrdiff_t s) + { + ptr_ -= s; + return *this; + } + std::ptrdiff_t operator-(ptr p) const { return ptr_ - p.ptr_; } ptr operator-(std::ptrdiff_t s) const { return ptr(ptr_ - s); } T& operator[](std::ptrdiff_t s) const { return ptr_[s]; } @@ -340,6 +353,8 @@ namespace test { bool operator==(ptr const& x) const { return ptr_ == x.ptr_; } bool operator!=(ptr const& x) const { return ptr_ != x.ptr_; } + bool operator==(std::nullptr_t) const { return ptr_ == nullptr; } + bool operator!=(std::nullptr_t) const { return ptr_ != nullptr; } bool operator<(ptr const& x) const { return ptr_ < x.ptr_; } bool operator>(ptr const& x) const { return ptr_ > x.ptr_; } bool operator<=(ptr const& x) const { return ptr_ <= x.ptr_; } @@ -660,6 +675,9 @@ namespace boost { { typedef ::test::minimal::ptr type; }; + + template + using rebind=typename rebind_to::type; }; } diff --git a/test/objects/test.hpp b/test/objects/test.hpp index 853e2205..bb2b2896 100644 --- a/test/objects/test.hpp +++ b/test/objects/test.hpp @@ -16,6 +16,9 @@ #include #include +template struct allocator1; +template struct allocator2; + namespace test { // Note that the default hash function will work for any equal_to (but not // very well). @@ -506,14 +509,18 @@ namespace test { template class ptr { + friend struct ::allocator1; + friend struct ::allocator2; friend class allocator2; friend class const_ptr; friend struct void_ptr; - public: T* ptr_; ptr(T* x) : ptr_(x) {} + + public: ptr() : ptr_(0) {} + ptr(std::nullptr_t) : ptr_(nullptr) {} explicit ptr(void_ptr const& x) : ptr_((T*)x.ptr_) {} T& operator*() const { return *ptr_; } @@ -537,6 +544,7 @@ namespace test { ptr operator-(std::ptrdiff_t s) const { return ptr(ptr_ - s); } ptr& operator+=(std::ptrdiff_t s) { ptr_ += s; return *this; } + ptr& operator-=(std::ptrdiff_t s) { ptr_ -= s; return *this; } T& operator[](std::ptrdiff_t s) const { return ptr_[s]; } bool operator!() const { return !ptr_; } @@ -727,6 +735,9 @@ namespace boost { { typedef ::test::ptr type; }; + + template + using rebind=typename rebind_to::type; }; } // namespace boost