// Copyright Daniel James 2005. Use, modification, and distribution are // subject to the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #if !defined(BOOST_UNORDERED_TEST_HELPERS_ALLOCATOR_HEADER) #define BOOST_UNORDERED_TEST_HELPERS_ALLOCATOR_HEADER #include #include #include namespace test { struct allocator_base { typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; int tag; allocator_base(int x); allocator_base(allocator_base const&); ~allocator_base(); size_type max_size() const; void* allocate(size_type, void const*, size_type); void construct(void*); void destroy(void*); void deallocate(void*, size_type); void swap(allocator_base&); private: allocator_base& operator=(allocator_base const&); }; std::ostream& operator<<(std::ostream&, allocator_base const&); bool allocator_equals(allocator_base const& x, allocator_base const& y); template struct allocator : allocator_base { typedef T* pointer; typedef T const* const_pointer; typedef T& reference; typedef T const& const_reference; typedef T value_type; template struct rebind { typedef allocator other; }; pointer address(reference x) const { return &x; } const_pointer address(const_reference x) const { return &x; } allocator(int x = 1) : allocator_base(x) {} template allocator(allocator const& x) : allocator_base(x) {} allocator(allocator const& x) : allocator_base(x) {} ~allocator() {} pointer allocate(size_type n, T const* hint = 0) { return static_cast( allocator_base::allocate(n, hint, sizeof(T))); } void construct(pointer ptr, T const& x) { allocator_base::construct(ptr); new((void*)ptr)T(x); } void destroy(pointer ptr) { allocator_base::destroy(ptr); ptr->~T(); } void deallocate(pointer ptr, size_type n) { allocator_base::deallocate(ptr, n); } }; template inline bool operator==(allocator const& x, allocator const& y) { return test::allocator_equals(x, y); } template inline bool operator!=(allocator const& x, allocator const& y) { return !test::allocator_equals(x, y); } template void swap(allocator& x, allocator& y) { x.swap(y); } template allocator create_allocator(allocator*) { return allocator(); } template allocator create_allocator(allocator*, int x) { return allocator(x); } template struct minimal_allocator; typedef unsigned short minimal_size_type; template class minimal_pointer_base { protected: typedef minimal_pointer_base pointer_base; minimal_pointer_base() : ptr_(0) {} explicit minimal_pointer_base(T* ptr) : ptr_(ptr) {} ~minimal_pointer_base() {} Ptr& get() { return *static_cast(this); } T* ptr_; public: typedef void (minimal_pointer_base::*bool_type)() const; void this_type_does_not_support_comparisons() const {} T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } Ptr& operator++() { ++ptr_; return get(); } Ptr operator++(int) { Ptr tmp(get()); ++ptr_; return tmp; } Ptr operator+(minimal_size_type s) const { return Ptr(ptr_ + s); } T& operator[](minimal_size_type s) const { return ptr_[s]; } operator bool_type() const { return ptr_ ? &minimal_pointer_base::this_type_does_not_support_comparisons : 0; } bool operator!() const { return !ptr_; } 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_; } 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_; } friend std::ostream& operator<<(std::ostream& out, minimal_pointer_base const& x) { out< class minimal_pointer; template class minimal_const_pointer; template class minimal_pointer : public minimal_pointer_base, T> { friend struct minimal_allocator; friend class minimal_pointer_base, T>; friend class minimal_const_pointer; typedef typename minimal_pointer::pointer_base base; minimal_pointer(T* ptr) : base(ptr) {} typedef minimal_const_pointer const_pointer; typedef minimal_pointer pointer; public: minimal_pointer() : base() {} bool operator==(pointer const& x) const { return base::operator==(x); } bool operator!=(pointer const& x) const { return base::operator!=(x); } bool operator<(pointer const& x) const { return base::operator<(x);} bool operator>(pointer const& x) const { return base::operator>(x);} bool operator<=(pointer const& x) const { return base::operator<=(x);} bool operator>=(pointer const& x) const { return base::operator<=(x);} bool operator==(const_pointer const& x) const { return x == *this; } bool operator!=(const_pointer const& x) const { return x != *this; } bool operator<(const_pointer const& x) const { return x > *this; } bool operator>(const_pointer const& x) const { return x < *this; } bool operator<=(const_pointer const& x) const { return x >= *this; } bool operator>=(const_pointer const& x) const { return x <= *this; } }; template class minimal_const_pointer : public minimal_pointer_base, T const> { friend struct minimal_allocator; friend class minimal_pointer_base, T const>; typedef typename minimal_const_pointer::pointer_base base; minimal_const_pointer(T* ptr) : base(ptr) {} typedef minimal_const_pointer const_pointer; typedef minimal_pointer pointer; public: minimal_const_pointer() : base() {} minimal_const_pointer(minimal_pointer const& x) : base(x.ptr_) {} bool operator==(const_pointer const& x) const { return base::operator==(x); } bool operator!=(const_pointer const& x) const { return base::operator!=(x); } bool operator<(const_pointer const& x) const { return base::operator<(x);} bool operator>(const_pointer const& x) const { return base::operator>(x);} bool operator<=(const_pointer const& x) const { return base::operator<=(x);} bool operator>=(const_pointer const& x) const { return base::operator<=(x);} bool operator==(pointer const& x) const { return operator==(const_pointer(x)); } bool operator!=(pointer const& x) const { return operator!=(const_pointer(x)); } bool operator<(pointer const& x) const { return operator<(const_pointer(x));} bool operator>(pointer const& x) const { return operator>(const_pointer(x));} bool operator<=(pointer const& x) const { return operator<=(const_pointer(x));} bool operator>=(pointer const& x) const { return operator<=(const_pointer(x));} }; struct minimal_allocator_base { typedef minimal_size_type size_type; typedef std::ptrdiff_t difference_type; int tag; minimal_allocator_base(int x); minimal_allocator_base(minimal_allocator_base const&); ~minimal_allocator_base(); size_type max_size() const; void* allocate(size_type, void const*, size_type); void construct(void*); void destroy(void*); void deallocate(void*, size_type); void swap(minimal_allocator_base&); private: minimal_allocator_base& operator=(minimal_allocator_base const&); }; std::ostream& operator<<(std::ostream&, minimal_allocator_base const&); bool allocator_equals(minimal_allocator_base const&, minimal_allocator_base const&); template struct minimal_allocator : minimal_allocator_base { typedef minimal_pointer pointer; typedef minimal_const_pointer const_pointer; typedef T& reference; typedef T const& const_reference; typedef T value_type; template struct rebind { typedef minimal_allocator other; }; pointer address(reference r) { return pointer(&r); } const_pointer address(const_reference r) { return const_pointer(&r); } pointer allocate(size_type n) { return pointer(static_cast( minimal_allocator_base::allocate(n, 0, sizeof(T)))); } pointer allocate(size_type n, const_pointer u) { return pointer(static_cast( minimal_allocator_base::allocate(n, u.ptr_, sizeof(T)))); } void deallocate(pointer p, size_type n) { minimal_allocator_base::deallocate(p.ptr_, n); } minimal_allocator() : minimal_allocator_base(0) { } explicit minimal_allocator(int tag) : minimal_allocator_base(tag) { } template minimal_allocator(minimal_allocator const& x) : minimal_allocator_base(x) { } minimal_allocator(minimal_allocator const& x) : minimal_allocator_base(x) { } void construct(pointer p, T const& t) { minimal_allocator_base::construct(p.ptr_); new((void*)p.ptr_) T(t); } void destroy(pointer p) { minimal_allocator_base::destroy(p.ptr_); ((T*)p.ptr_)->~T(); } private: minimal_allocator& operator=(minimal_allocator const&); }; template inline bool operator==(minimal_allocator const& x, minimal_allocator const& y) { return test::allocator_equals(x, y); } template inline bool operator!=(minimal_allocator const& x, minimal_allocator const& y) { return !test::allocator_equals(x, y); } template void swap(minimal_allocator& x, minimal_allocator& y) { x.swap(y); } template minimal_allocator create_allocator(minimal_allocator*) { return minimal_allocator(); } template minimal_allocator create_allocator(minimal_allocator*, int x) { return minimal_allocator(x); } } #endif