/* * Copyright (c) 2012-2014 Glen Joseph Fernandes * glenfe at live dot com * * Distributed under the Boost Software License, * Version 1.0. (See accompanying file LICENSE_1_0.txt * or copy at http://boost.org/LICENSE_1_0.txt) */ #ifndef BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP #define BOOST_SMART_PTR_DETAIL_ARRAY_DELETER_HPP #include #include #include namespace boost { namespace detail { template struct ms_deleter_base; template struct ms_deleter_base { ms_deleter_base(std::size_t size_) : size(size_) { } std::size_t size; }; template struct ms_deleter_base { enum { size = N }; }; template class as_deleter : ms_deleter_base { using ms_deleter_base::size; public: typedef typename array_inner::type type; #if !defined(BOOST_NO_CXX11_ALLOCATOR) typedef typename std::allocator_traits:: template rebind_alloc allocator; #else typedef typename A:: template rebind::other allocator; #endif as_deleter(const A& allocator_) : pair(allocator_, 0) { } as_deleter(const A& allocator_, std::size_t size_) : ms_deleter_base(size_), pair(allocator_, 0) { } void set(type* memory) { pair.data = memory; } void operator()(const void*) { if (pair.data) { as_destroy(pair, pair.data, size); } } private: as_pair pair; }; template class ms_deleter : ms_deleter_base { using ms_deleter_base::size; public: typedef typename array_inner::type type; ms_deleter() : object(0) { } ms_deleter(std::size_t size_) : ms_deleter_base(size_), object(0) { } void set(type* memory) { object = memory; } void operator()(const void*) { if (object) { ms_destroy(object, size); } } private: type* object; }; } } #endif