diff --git a/include/boost/core/allocator_access.hpp b/include/boost/core/allocator_access.hpp index 8398589..973127b 100644 --- a/include/boost/core/allocator_access.hpp +++ b/include/boost/core/allocator_access.hpp @@ -10,6 +10,9 @@ Distributed under the Boost Software License, Version 1.0. #include #include +#if defined(BOOST_DINKUMWARE_STDLIB) +#include +#endif #include #if !defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) #include @@ -243,6 +246,18 @@ struct alloc_if { typedef R type; }; +template +struct alloc_enable { + BOOST_STATIC_CONSTEXPR bool value = true; +}; + +#if defined(BOOST_DINKUMWARE_STDLIB) +template +struct alloc_enable > { + BOOST_STATIC_CONSTEXPR bool value = false; +}; +#endif + #if defined(BOOST_CORE_ALLOCATOR_DETECTION) template T alloc_declval() BOOST_NOEXCEPT; @@ -266,8 +281,9 @@ struct alloc_has_allocate -inline typename detail::alloc_if::value, - typename allocator_pointer::type>::type +inline typename detail::alloc_if::value && + detail::alloc_has_allocate::value, + typename allocator_pointer::type>::type allocator_allocate(A& a, typename allocator_size_type::type n, typename allocator_const_void_pointer::type h) { @@ -275,8 +291,9 @@ allocator_allocate(A& a, typename allocator_size_type::type n, } template -inline typename detail::alloc_if::value, - typename allocator_pointer::type>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_allocate::value, + typename allocator_pointer::type>::type allocator_allocate(A& a, typename allocator_size_type::type n, typename allocator_const_void_pointer::type) { @@ -309,16 +326,16 @@ struct alloc_has_construct -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_construct::value>::type allocator_construct(A& a, T* p) { a.construct(p); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_construct::value>::type allocator_construct(A&, T* p) { ::new((void*)p) T(); @@ -345,16 +362,16 @@ struct alloc_has_construct_args -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_construct_args::value>::type allocator_construct(A& a, T* p, V&& v, Args&&... args) { a.construct(p, std::forward(v), std::forward(args)...); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_construct_args::value>::type allocator_construct(A&, T* p, V&& v, Args&&... args) { ::new((void*)p) T(std::forward(v), std::forward(args)...); @@ -380,48 +397,48 @@ struct alloc_has_construct_arg -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_construct_arg::value>::type allocator_construct(A& a, T* p, V&& v) { a.construct(p, std::forward(v)); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_construct_arg::value>::type allocator_construct(A&, T* p, V&& v) { ::new((void*)p) T(std::forward(v)); } #else template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_construct_arg::value>::type allocator_construct(A& a, T* p, const V& v) { a.construct(p, v); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_construct_arg::value>::type allocator_construct(A&, T* p, const V& v) { ::new((void*)p) T(v); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_construct_arg::value>::type allocator_construct(A& a, T* p, V& v) { a.construct(p, v); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_construct_arg::value>::type allocator_construct(A&, T* p, V& v) { ::new((void*)p) T(v); @@ -447,14 +464,16 @@ struct alloc_has_destroy -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value && + detail::alloc_has_destroy::value>::type allocator_destroy(A& a, T* p) { a.destroy(p); } template -inline typename detail::alloc_if::value>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_destroy::value>::type allocator_destroy(A&, T* p) { p->~T(); @@ -479,16 +498,18 @@ struct alloc_has_max_size -inline typename detail::alloc_if::value, - typename allocator_size_type::type>::type +inline typename detail::alloc_if::value && + detail::alloc_has_max_size::value, + typename allocator_size_type::type>::type allocator_max_size(const A& a) { return a.max_size(); } template -inline typename detail::alloc_if::value, - typename allocator_size_type::type>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_max_size::value, + typename allocator_size_type::type>::type allocator_max_size(const A&) { return (std::numeric_limits -inline typename detail::alloc_if::value, A>::type +inline typename detail::alloc_if::value && + detail::alloc_has_soccc::value, A>::type allocator_select_on_container_copy_construction(const A& a) { return a.select_on_container_copy_construction(); } template -inline typename detail::alloc_if::value, A>::type +inline typename detail::alloc_if::value || + !detail::alloc_has_soccc::value, A>::type allocator_select_on_container_copy_construction(const A& a) { return a;