From 954db4e2460a57e9efadf0f0857312fdbafbc6f8 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Fri, 20 May 2022 14:14:01 -0700 Subject: [PATCH] Extend fancy pointer types used by test allocators to support a wider array of semantic operations --- test/objects/minimal.hpp | 23 +++++++++++++++++++---- test/objects/test.hpp | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/test/objects/minimal.hpp b/test/objects/minimal.hpp index de723260..f5298265 100644 --- a/test/objects/minimal.hpp +++ b/test/objects/minimal.hpp @@ -12,6 +12,7 @@ #define BOOST_UNORDERED_OBJECTS_MINIMAL_HEADER #include +#include #include #include #include @@ -311,13 +312,17 @@ namespace test { return tmp; } 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_); - } + friend ptr operator+(std::ptrdiff_t s, ptr p) { return ptr(s + p.ptr_); } + + 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]; } bool operator!() const { return !ptr_; } + static ptr pointer_to(T& p) { + return ptr(&p); + } + // I'm not using the safe bool idiom because the containers should be // able to cope with bool conversions. operator bool() const { return !!ptr_; } @@ -637,4 +642,14 @@ namespace test { #pragma warning(pop) #endif +namespace boost { + template <> struct pointer_traits< ::test::minimal::void_ptr> + { + template struct rebind_to + { + typedef ::test::minimal::ptr type; + }; + }; +} + #endif diff --git a/test/objects/test.hpp b/test/objects/test.hpp index 53569d30..b3d9c2e8 100644 --- a/test/objects/test.hpp +++ b/test/objects/test.hpp @@ -521,11 +521,22 @@ namespace test { ++ptr_; return tmp; } + 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_); } + + std::ptrdiff_t operator-(ptr p) const { return ptr_ - p.ptr_; } + ptr operator-(std::ptrdiff_t s) const { return ptr(ptr_ - s); } + + 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_; } + static ptr pointer_to(T& p) { + return ptr(&p); + } + // I'm not using the safe bool idiom because the containers should be // able to cope with bool conversions. operator bool() const { return !!ptr_; } @@ -701,4 +712,14 @@ namespace test { } } +namespace boost { + template <> struct pointer_traits< ::test::void_ptr> + { + template struct rebind_to + { + typedef ::test::ptr type; + }; + }; +} // namespace boost + #endif