diff options
Diffstat (limited to 'libs/container/test/allocator_traits_test.cpp')
-rw-r--r-- | libs/container/test/allocator_traits_test.cpp | 227 |
1 files changed, 131 insertions, 96 deletions
diff --git a/libs/container/test/allocator_traits_test.cpp b/libs/container/test/allocator_traits_test.cpp index 407a62b49..3f4dff0c8 100644 --- a/libs/container/test/allocator_traits_test.cpp +++ b/libs/container/test/allocator_traits_test.cpp @@ -11,18 +11,25 @@ #include <cstddef> #include <boost/container/allocator_traits.hpp> #include <boost/static_assert.hpp> -#include <boost/type_traits/is_same.hpp> -#include <boost/type_traits/integral_constant.hpp> +#include <boost/container/detail/type_traits.hpp> #include <boost/container/detail/function_detector.hpp> #include <boost/move/utility_core.hpp> #include <memory> +#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#include <boost/move/detail/fwd_macros.hpp> +#endif +#include <boost/core/lightweight_test.hpp> template<class T> class SimpleAllocator { + public: bool allocate_called_; bool deallocate_called_; - public: + + typedef boost::container::container_detail:: + true_type is_always_equal; + typedef T value_type; template <class U> @@ -47,15 +54,26 @@ class SimpleAllocator bool deallocate_called() const { return deallocate_called_; } + + friend bool operator==(const SimpleAllocator &, const SimpleAllocator &) + { return true; } + + friend bool operator!=(const SimpleAllocator &, const SimpleAllocator &) + { return false; } }; template<class T> class SimpleSmartPtr { + void unspecified_bool_type_func() const {} + typedef void (SimpleSmartPtr::*unspecified_bool_type)() const; + public: - SimpleSmartPtr() - : ptr_(0) + typedef T* pointer; + + explicit SimpleSmartPtr(pointer p = 0) + : ptr_(p) {} SimpleSmartPtr(const SimpleSmartPtr &c) @@ -64,7 +82,8 @@ class SimpleSmartPtr SimpleSmartPtr & operator=(const SimpleSmartPtr &c) { this->ptr_ = c.ptr_; } - typedef T* pointer; + operator unspecified_bool_type() const + { return ptr_? &SimpleSmartPtr::unspecified_bool_type_func : 0; } private: T *ptr_; @@ -73,6 +92,7 @@ class SimpleSmartPtr template<class T> class ComplexAllocator { + public: bool allocate_called_; bool deallocate_called_; bool allocate_hint_called_; @@ -80,8 +100,8 @@ class ComplexAllocator mutable bool max_size_called_; mutable bool select_on_container_copy_construction_called_; bool construct_called_; + mutable bool storage_is_unpropagable_; - public: typedef T value_type; typedef SimpleSmartPtr<T> pointer; typedef SimpleSmartPtr<const T> const_pointer; @@ -93,9 +113,14 @@ class ComplexAllocator typedef SimpleSmartPtr<const void> const_void_pointer; typedef signed short difference_type; typedef unsigned short size_type; - typedef boost::true_type propagate_on_container_copy_assignment; - typedef boost::true_type propagate_on_container_move_assignment; - typedef boost::true_type propagate_on_container_swap; + typedef boost::container::container_detail:: + true_type propagate_on_container_copy_assignment; + typedef boost::container::container_detail:: + true_type propagate_on_container_move_assignment; + typedef boost::container::container_detail:: + true_type propagate_on_container_swap; + typedef boost::container::container_detail:: + true_type is_partially_propagable; ComplexAllocator() : allocate_called_(false) @@ -127,23 +152,30 @@ class ComplexAllocator size_type max_size() const { max_size_called_ = true; return size_type(size_type(0)-1); } - #define BOOST_PP_LOCAL_MACRO(n) \ - template<class U BOOST_PP_ENUM_TRAILING_PARAMS(n, class P) > \ - void construct(U *p BOOST_PP_ENUM_TRAILING(n, BOOST_CONTAINER_PP_PARAM_LIST, _)) \ - { \ - construct_called_ = true; \ - ::new (p) U (BOOST_PP_ENUM(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _)); \ - } \ + #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + + #define BOOST_CONTAINER_COMPLEXALLOCATOR_CONSTRUCT_IMPL(N)\ + \ + template< class U BOOST_MOVE_I##N BOOST_MOVE_CLASS##N > \ + void construct(U *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N) \ + { construct_called_ = true; ::new(p) U ( BOOST_MOVE_FWD##N ); }\ // - #define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS) - #include BOOST_PP_LOCAL_ITERATE() + BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_COMPLEXALLOCATOR_CONSTRUCT_IMPL) + #undef BOOST_CONTAINER_COMPLEXALLOCATOR_CONSTRUCT_IMPL + #else + + template< class U, class ...Args> + void construct(U *p, BOOST_FWD_REF(Args) ...args) + { construct_called_ = true; ::new(p) U( ::boost::forward<Args>(args)...); } + + #endif template<class U> void construct(U *p, boost::container::default_init_t) - { - construct_called_ = true; - ::new (p) U; - } + { construct_called_ = true; ::new(p)U; } + + bool storage_is_unpropagable(pointer p) const + { storage_is_unpropagable_ = true; return !p; } //getters bool allocate_called() const @@ -166,6 +198,9 @@ class ComplexAllocator bool construct_called() const { return construct_called_; } + + bool storage_is_unpropagable_called() const + { return storage_is_unpropagable_; } }; class copymovable @@ -212,22 +247,23 @@ void test_void_allocator() int main() { + using namespace boost::container::container_detail; test_void_allocator(); //SimpleAllocator - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::value_type, int>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::pointer, int*>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::const_pointer, const int*>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::void_pointer, void*>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::const_void_pointer, const void*>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::difference_type, std::ptrdiff_t>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::size_type, std::size_t>::value )); BOOST_STATIC_ASSERT(( boost::container::allocator_traits < SimpleAllocator<int> >::propagate_on_container_copy_assignment::value == false )); @@ -235,27 +271,31 @@ int main() < SimpleAllocator<int> >::propagate_on_container_move_assignment::value == false )); BOOST_STATIC_ASSERT(( boost::container::allocator_traits < SimpleAllocator<int> >::propagate_on_container_swap::value == false )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( boost::container::allocator_traits + < SimpleAllocator<int> >::is_always_equal::value == true )); + BOOST_STATIC_ASSERT(( boost::container::allocator_traits + < SimpleAllocator<int> >::is_partially_propagable::value == false )); + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::rebind_traits<double>::allocator_type , SimpleAllocator<double> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < SimpleAllocator<int> >::rebind_alloc<double>::value_type , double >::value )); //ComplexAllocator - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::value_type, int>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::pointer, SimpleSmartPtr<int> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::const_pointer, SimpleSmartPtr<const int> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::void_pointer, SimpleSmartPtr<void> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::const_void_pointer, SimpleSmartPtr<const void> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::difference_type, signed short>::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::size_type, unsigned short>::value )); BOOST_STATIC_ASSERT(( boost::container::allocator_traits < ComplexAllocator<int> >::propagate_on_container_copy_assignment::value == true )); @@ -263,10 +303,14 @@ int main() < ComplexAllocator<int> >::propagate_on_container_move_assignment::value == true )); BOOST_STATIC_ASSERT(( boost::container::allocator_traits < ComplexAllocator<int> >::propagate_on_container_swap::value == true )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( boost::container::allocator_traits + < ComplexAllocator<int> >::is_always_equal::value == false )); + BOOST_STATIC_ASSERT(( boost::container::allocator_traits + < ComplexAllocator<int> >::is_partially_propagable::value == true )); + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::rebind_traits<double>::allocator_type , ComplexAllocator<double> >::value )); - BOOST_STATIC_ASSERT(( boost::is_same<boost::container::allocator_traits + BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits < ComplexAllocator<int> >::rebind_alloc<double>::value_type , double >::value )); @@ -279,51 +323,43 @@ int main() //allocate CAllocTraits::allocate(c_alloc, 1); - if(!c_alloc.allocate_called()){ - return 1; - } + BOOST_TEST(c_alloc.allocate_called()); + SAllocTraits::allocate(s_alloc, 1); - if(!s_alloc.allocate_called()){ - return 1; - } + BOOST_TEST(s_alloc.allocate_called()); //deallocate CAllocTraits::deallocate(c_alloc, CAllocTraits::pointer(), 1); - if(!c_alloc.deallocate_called()){ - return 1; - } + BOOST_TEST(c_alloc.deallocate_called()); + SAllocTraits::deallocate(s_alloc, SAllocTraits::pointer(), 1); - if(!s_alloc.deallocate_called()){ - return 1; - } + BOOST_TEST(s_alloc.deallocate_called()); //allocate with hint CAllocTraits::allocate(c_alloc, 1, CAllocTraits::const_void_pointer()); - if(!c_alloc.allocate_hint_called()){ - return 1; - } + BOOST_TEST(c_alloc.allocate_hint_called()); + + s_alloc.allocate_called_ = false; SAllocTraits::allocate(s_alloc, 1, SAllocTraits::const_void_pointer()); + BOOST_TEST(s_alloc.allocate_called()); //destroy float dummy; CAllocTraits::destroy(c_alloc, &dummy); - if(!c_alloc.destroy_called()){ - return 1; - } + BOOST_TEST(c_alloc.destroy_called()); + SAllocTraits::destroy(s_alloc, &dummy); //max_size CAllocTraits::max_size(c_alloc); - if(!c_alloc.max_size_called()){ - return 1; - } - SAllocTraits::max_size(s_alloc); + BOOST_TEST(c_alloc.max_size_called()); + + BOOST_TEST(SAllocTraits::size_type(-1)/sizeof(SAllocTraits::value_type) == SAllocTraits::max_size(s_alloc)); //select_on_container_copy_construction CAllocTraits::select_on_container_copy_construction(c_alloc); - if(!c_alloc.select_on_container_copy_construction_called()){ - return 1; - } + BOOST_TEST(c_alloc.select_on_container_copy_construction_called()); + SAllocTraits::select_on_container_copy_construction(s_alloc); //construct @@ -332,81 +368,80 @@ int main() c.copymoveconstructed_ = true; c.copymoveconstructed_ = true; CAllocTraits::construct(c_alloc, &c); - if(!c_alloc.construct_called() || c.copymoveconstructed() || c.moved()){ - return 1; - } + BOOST_TEST(c_alloc.construct_called() && !c.copymoveconstructed() && !c.moved()); } { int i = 5; CAllocTraits::construct(c_alloc, &i, boost::container::default_init); - if(!c_alloc.construct_called() || i != 5){ - return 1; - } + BOOST_TEST(c_alloc.construct_called() && i == 5); } { copymovable c; copymovable c2; CAllocTraits::construct(c_alloc, &c, c2); - if(!c_alloc.construct_called() || !c.copymoveconstructed() || c.moved()){ - return 1; - } + BOOST_TEST(c_alloc.construct_called() && c.copymoveconstructed() && !c.moved()); } { copymovable c; copymovable c2; CAllocTraits::construct(c_alloc, &c, ::boost::move(c2)); - if(!c_alloc.construct_called() || !c.copymoveconstructed() || !c.moved()){ - return 1; - } + BOOST_TEST(c_alloc.construct_called() && c.copymoveconstructed() && c.moved()); } { copymovable c; c.copymoveconstructed_ = true; c.copymoveconstructed_ = true; SAllocTraits::construct(s_alloc, &c); - if(c.copymoveconstructed() || c.moved()){ - return 1; - } + BOOST_TEST(!c.copymoveconstructed() && !c.moved()); } { int i = 4; SAllocTraits::construct(s_alloc, &i, boost::container::default_init); - if(i != 4){ - return 1; - } + BOOST_TEST(i == 4); } { copymovable c; copymovable c2; SAllocTraits::construct(s_alloc, &c, c2); - if(!c.copymoveconstructed() || c.moved()){ - return 1; - } + BOOST_TEST(c.copymoveconstructed() && !c.moved()); } { copymovable c; copymovable c2; SAllocTraits::construct(s_alloc, &c, ::boost::move(c2)); - if(!c.copymoveconstructed() || !c.moved()){ - return 1; - } + BOOST_TEST(c.copymoveconstructed() && c.moved()); } { copymovable c; CAllocTraits::construct(c_alloc, &c, 0, 1, 2); - if(!c_alloc.construct_called() || c.copymoveconstructed() || c.moved()){ - return 1; - } + BOOST_TEST(c_alloc.construct_called() && !c.copymoveconstructed() && !c.moved()); } { copymovable c; copymovable c2; SAllocTraits::construct(s_alloc, &c, 0, 1, 2); - if(c.copymoveconstructed() || c.moved()){ - return 1; + BOOST_TEST(!c.copymoveconstructed() && !c.moved()); + } + //storage_is_unpropagable + { + SAlloc s_alloc2; + BOOST_TEST(!SAllocTraits::storage_is_unpropagable(s_alloc, SAllocTraits::pointer())); + } + { + { + CAlloc c_alloc2; + CAlloc::value_type v; + BOOST_TEST(!CAllocTraits::storage_is_unpropagable(c_alloc, CAllocTraits::pointer(&v))); + BOOST_TEST(c_alloc.storage_is_unpropagable_called()); + } + { + CAlloc c_alloc2; + BOOST_TEST( CAllocTraits::storage_is_unpropagable(c_alloc2, CAllocTraits::pointer())); + BOOST_TEST(c_alloc2.storage_is_unpropagable_called()); } + } - return 0; + return ::boost::report_errors(); } #include <boost/container/detail/config_end.hpp> |