Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / ptr_container / detail / scoped_deleter.hpp
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