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