]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * Copyright (c) 2014 Glen Joseph Fernandes | |
3 | * glenfe at live dot com | |
4 | * | |
5 | * Distributed under the Boost Software License, | |
6 | * Version 1.0. (See accompanying file LICENSE_1_0.txt | |
7 | * or copy at http://boost.org/LICENSE_1_0.txt) | |
8 | */ | |
9 | #ifndef BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP | |
10 | #define BOOST_SMART_PTR_DETAIL_ARRAY_COUNT_IMPL_HPP | |
11 | ||
12 | #include <boost/smart_ptr/detail/array_allocator.hpp> | |
13 | #include <boost/smart_ptr/detail/sp_counted_impl.hpp> | |
14 | ||
15 | namespace boost { | |
16 | namespace detail { | |
17 | template<class P, class A> | |
18 | class sp_counted_impl_pda<P, ms_in_allocator_tag, A> | |
19 | : public sp_counted_base { | |
20 | typedef ms_in_allocator_tag D; | |
21 | typedef sp_counted_impl_pda<P, D, A> Y; | |
22 | public: | |
23 | sp_counted_impl_pda(P, D, const A& allocator_) | |
24 | : allocator(allocator_) { | |
25 | } | |
26 | ||
27 | virtual void dispose() { | |
28 | allocator(); | |
29 | } | |
30 | ||
31 | virtual void destroy() { | |
32 | #if !defined(BOOST_NO_CXX11_ALLOCATOR) | |
33 | typedef typename std::allocator_traits<A>:: | |
34 | template rebind_alloc<Y> YA; | |
35 | typedef typename std::allocator_traits<A>:: | |
36 | template rebind_traits<Y> YT; | |
37 | #else | |
38 | typedef typename A::template rebind<Y>::other YA; | |
39 | #endif | |
40 | YA a1(allocator); | |
41 | #if !defined(BOOST_NO_CXX11_ALLOCATOR) | |
42 | YT::destroy(a1, this); | |
43 | YT::deallocate(a1, this, 1); | |
44 | #else | |
45 | this->~Y(); | |
46 | a1.deallocate(this, 1); | |
47 | #endif | |
48 | } | |
49 | ||
50 | virtual void* get_deleter(const sp_typeinfo&) { | |
51 | return &reinterpret_cast<char&>(allocator); | |
52 | } | |
53 | ||
54 | virtual void* get_untyped_deleter() { | |
55 | return &reinterpret_cast<char&>(allocator); | |
56 | } | |
57 | ||
58 | private: | |
59 | sp_counted_impl_pda(const sp_counted_impl_pda&); | |
60 | sp_counted_impl_pda& operator=(const sp_counted_impl_pda&); | |
61 | ||
62 | A allocator; | |
63 | }; | |
64 | } | |
65 | } | |
66 | ||
67 | #endif |