// Copyright 2018 Glen Joseph Fernandes // (glenjofe@gmail.com) // // Distributed under 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) #ifndef BOOST_MULTI_ARRAY_ALLOCATORS_HPP #define BOOST_MULTI_ARRAY_ALLOCATORS_HPP #include #if !defined(BOOST_NO_CXX11_ALLOCATOR) #include #else #include #endif namespace boost { namespace detail { namespace multi_array { template inline void destroy(A& allocator, T* ptr, T* end) { for (; ptr != end; ++ptr) { #if !defined(BOOST_NO_CXX11_ALLOCATOR) std::allocator_traits::destroy(allocator,ptr); #else ptr->~T(); #endif } } template inline void construct(A& allocator, T* ptr) { #if !defined(BOOST_NO_CXX11_ALLOCATOR) std::allocator_traits::construct(allocator,ptr); #else ::new(static_cast(ptr)) T(); #endif } #if !defined(BOOST_NO_EXCEPTIONS) template inline void construct(A& allocator, T* ptr, T* end) { T* start = ptr; try { for (; ptr != end; ++ptr) { boost::detail::multi_array::construct(allocator,ptr); } } catch (...) { boost::detail::multi_array::destroy(allocator,start,ptr); throw; } } #else template inline void construct(A& allocator, T* ptr, T* end) { for (; ptr != end; ++ptr) { boost::detail::multi_array::construct(allocator,ptr); } } #endif } // multi_array } // detail } // boost #endif