]>
Commit | Line | Data |
---|---|---|
1 | // | |
2 | // Boost.Pointer Container | |
3 | // | |
4 | // Copyright Thorsten Ottosen 2003-2005. Use, modification and | |
5 | // distribution is subject to the Boost Software License, Version | |
6 | // 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
7 | // http://www.boost.org/LICENSE_1_0.txt) | |
8 | // | |
9 | // For more information, see http://www.boost.org/libs/ptr_container/ | |
10 | // | |
11 | ||
12 | #ifndef BOOST_PTR_CONTAINER_SCOPED_DELETER_HPP | |
13 | #define BOOST_PTR_CONTAINER_SCOPED_DELETER_HPP | |
14 | ||
15 | #if defined(_MSC_VER) && (_MSC_VER >= 1200) | |
16 | # pragma once | |
17 | #endif | |
18 | ||
19 | #include <iterator> | |
20 | #include <cstddef> | |
21 | #include <boost/scoped_array.hpp> | |
22 | ||
23 | namespace boost | |
24 | { | |
25 | ||
26 | namespace ptr_container_detail | |
27 | { | |
28 | template< class T, class CloneAllocator > | |
29 | class scoped_deleter | |
30 | { | |
31 | typedef std::size_t size_type; | |
32 | scoped_array<T*> ptrs_; | |
33 | size_type stored_; | |
34 | bool released_; | |
35 | ||
36 | public: | |
37 | scoped_deleter( T** a, size_type size ) | |
38 | : ptrs_( a ), stored_( size ), released_( false ) | |
39 | { | |
40 | BOOST_ASSERT( a ); | |
41 | } | |
42 | ||
43 | scoped_deleter( size_type size ) | |
44 | : ptrs_( new T*[size] ), stored_( 0 ), | |
45 | released_( false ) | |
46 | { | |
47 | BOOST_ASSERT( size > 0 ); | |
48 | } | |
49 | ||
50 | ||
51 | ||
52 | scoped_deleter( size_type n, const T& x ) // strong | |
53 | : ptrs_( new T*[n] ), stored_(0), | |
54 | released_( false ) | |
55 | { | |
56 | for( size_type i = 0; i != n; i++ ) | |
57 | add( CloneAllocator::allocate_clone( &x ) ); | |
58 | BOOST_ASSERT( stored_ > 0 ); | |
59 | } | |
60 | ||
61 | ||
62 | ||
63 | template< class InputIterator > | |
64 | scoped_deleter ( InputIterator first, InputIterator last ) // strong | |
65 | : ptrs_( new T*[ std::distance(first,last) ] ), | |
66 | stored_(0), | |
67 | released_( false ) | |
68 | { | |
69 | for( ; first != last; ++first ) | |
70 | add( CloneAllocator::allocate_clone_from_iterator( first ) ); | |
71 | BOOST_ASSERT( stored_ > 0 ); | |
72 | } | |
73 | ||
74 | ||
75 | ||
76 | ~scoped_deleter() | |
77 | { | |
78 | if ( !released_ ) | |
79 | { | |
80 | for( size_type i = 0u; i != stored_; ++i ) | |
81 | CloneAllocator::deallocate_clone( ptrs_[i] ); | |
82 | } | |
83 | } | |
84 | ||
85 | ||
86 | ||
87 | void add( T* t ) | |
88 | { | |
89 | BOOST_ASSERT( ptrs_.get() != 0 ); | |
90 | ptrs_[stored_] = t; | |
91 | ++stored_; | |
92 | } | |
93 | ||
94 | ||
95 | ||
96 | void release() | |
97 | { | |
98 | released_ = true; | |
99 | } | |
100 | ||
101 | ||
102 | ||
103 | T** begin() | |
104 | { | |
105 | BOOST_ASSERT( ptrs_.get() != 0 ); | |
106 | return &ptrs_[0]; | |
107 | } | |
108 | ||
109 | ||
110 | ||
111 | T** end() | |
112 | { | |
113 | BOOST_ASSERT( ptrs_.get() != 0 ); | |
114 | return &ptrs_[stored_]; | |
115 | } | |
116 | ||
117 | }; // class 'scoped_deleter' | |
118 | } | |
119 | } | |
120 | ||
121 | #endif |