68 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  * Copyright (c) 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_COUNT_IMPL_HPP | ||
|  | #define BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP | ||
|  | 
 | ||
|  | #include <boost/smart_ptr/detail/array_allocator.hpp> | ||
|  | #include <boost/smart_ptr/detail/sp_counted_impl.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  |     namespace detail { | ||
|  |         template<class P, class A> | ||
|  |         class sp_counted_impl_pda<P, ms_in_allocator_tag, A> | ||
|  |             : public sp_counted_base { | ||
|  |             typedef ms_in_allocator_tag D; | ||
|  |             typedef sp_counted_impl_pda<P, D, A> Y; | ||
|  |         public: | ||
|  |             sp_counted_impl_pda(P, D, const A& allocator_) | ||
|  |                 : allocator(allocator_) { | ||
|  |             } | ||
|  | 
 | ||
|  |             virtual void dispose() { | ||
|  |                 allocator(); | ||
|  |             } | ||
|  | 
 | ||
|  |             virtual void destroy() { | ||
|  | #if !defined(BOOST_NO_CXX11_ALLOCATOR) | ||
|  |                 typedef typename std::allocator_traits<A>:: | ||
|  |                     template rebind_alloc<Y> YA; | ||
|  |                 typedef typename std::allocator_traits<A>:: | ||
|  |                     template rebind_traits<Y> YT; | ||
|  | #else | ||
|  |                 typedef typename A::template rebind<Y>::other YA; | ||
|  | #endif | ||
|  |                 YA a1(allocator); | ||
|  | #if !defined(BOOST_NO_CXX11_ALLOCATOR) | ||
|  |                 YT::destroy(a1, this); | ||
|  |                 YT::deallocate(a1, this, 1); | ||
|  | #else | ||
|  |                 this->~Y(); | ||
|  |                 a1.deallocate(this, 1); | ||
|  | #endif                 | ||
|  |             } | ||
|  | 
 | ||
|  |             virtual void* get_deleter(const sp_typeinfo&) { | ||
|  |                 return &reinterpret_cast<char&>(allocator); | ||
|  |             } | ||
|  | 
 | ||
|  |             virtual void* get_untyped_deleter() { | ||
|  |                 return &reinterpret_cast<char&>(allocator); | ||
|  |             } | ||
|  | 
 | ||
|  |         private: | ||
|  |             sp_counted_impl_pda(const sp_counted_impl_pda&); | ||
|  |             sp_counted_impl_pda& operator=(const sp_counted_impl_pda&); | ||
|  | 
 | ||
|  |             A allocator; | ||
|  |         }; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | #endif |