annotate DEPENDENCIES/generic/include/boost/ptr_container/ptr_inserter.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 //
Chris@16 2 // Boost.Pointer Container
Chris@16 3 //
Chris@16 4 // Copyright Thorsten Ottosen 2008. Use, modification and
Chris@16 5 // distribution is subject to the Boost Software License, Version
Chris@16 6 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 //
Chris@16 9 // For more information, see http://www.boost.org/libs/ptr_container/
Chris@16 10 //
Chris@16 11
Chris@16 12 #ifndef BOOST_PTR_CONTAINER_PTR_INSERTER_HPP
Chris@16 13 #define BOOST_PTR_CONTAINER_PTR_INSERTER_HPP
Chris@16 14
Chris@16 15 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 16 #pragma once
Chris@16 17 #endif
Chris@16 18
Chris@16 19 #include <boost/config.hpp>
Chris@16 20 #include <iterator>
Chris@16 21 #include <memory>
Chris@16 22
Chris@16 23 namespace boost
Chris@16 24 {
Chris@16 25 namespace ptr_container
Chris@16 26 {
Chris@16 27 template< class PtrContainer >
Chris@16 28 class ptr_back_insert_iterator;
Chris@16 29
Chris@16 30 template< class PtrContainer >
Chris@16 31 class ptr_front_insert_iterator;
Chris@16 32
Chris@16 33 template< class PtrContainer >
Chris@16 34 class ptr_insert_iterator;
Chris@16 35
Chris@16 36 template< class PtrContainer >
Chris@16 37 ptr_back_insert_iterator<PtrContainer>
Chris@16 38 ptr_back_inserter( PtrContainer& cont );
Chris@16 39
Chris@16 40 template< class PtrContainer >
Chris@16 41 ptr_front_insert_iterator<PtrContainer>
Chris@16 42 ptr_front_inserter( PtrContainer& cont );
Chris@16 43
Chris@16 44 template< class PtrContainer >
Chris@16 45 ptr_insert_iterator<PtrContainer>
Chris@16 46 ptr_inserter( PtrContainer& cont, typename PtrContainer::iterator before );
Chris@16 47
Chris@16 48 //////////////////////////////////////////////////////////////////////////
Chris@16 49 // Implementation
Chris@16 50 //////////////////////////////////////////////////////////////////////////
Chris@16 51
Chris@16 52
Chris@16 53 template< class PtrContainer >
Chris@16 54 class ptr_back_insert_iterator :
Chris@16 55 public std::iterator<std::output_iterator_tag,void,void,void,void>
Chris@16 56 {
Chris@16 57 public:
Chris@16 58 typedef PtrContainer container_type;
Chris@16 59
Chris@16 60 public:
Chris@16 61 explicit ptr_back_insert_iterator( PtrContainer& cont )
Chris@16 62 : container(&cont)
Chris@16 63 { }
Chris@16 64
Chris@16 65 ptr_back_insert_iterator&
Chris@16 66 operator=( typename PtrContainer::value_type r )
Chris@16 67 {
Chris@16 68 typename PtrContainer::value_type obj = 0;
Chris@16 69 if( r != 0 )
Chris@16 70 obj = container_type::clone_allocator_type::allocate_clone(*r);
Chris@16 71
Chris@16 72 container->push_back( obj );
Chris@16 73 return *this;
Chris@16 74 }
Chris@16 75
Chris@16 76 template< class T >
Chris@16 77 ptr_back_insert_iterator&
Chris@16 78 operator=( std::auto_ptr<T> r )
Chris@16 79 {
Chris@16 80 container->push_back( r );
Chris@16 81 return *this;
Chris@16 82 }
Chris@16 83
Chris@16 84 ptr_back_insert_iterator&
Chris@16 85 operator=( typename PtrContainer::const_reference r )
Chris@16 86 {
Chris@16 87 container->push_back( container_type::clone_allocator_type::
Chris@16 88 allocate_clone(r) );
Chris@16 89 return *this;
Chris@16 90 }
Chris@16 91
Chris@16 92 ptr_back_insert_iterator& operator*()
Chris@16 93 {
Chris@16 94 return *this;
Chris@16 95 }
Chris@16 96
Chris@16 97 ptr_back_insert_iterator& operator++()
Chris@16 98 {
Chris@16 99 return *this;
Chris@16 100 }
Chris@16 101
Chris@16 102 ptr_back_insert_iterator operator++(int)
Chris@16 103 {
Chris@16 104 return *this;
Chris@16 105 }
Chris@16 106
Chris@16 107 protected:
Chris@16 108 PtrContainer* container;
Chris@16 109 };
Chris@16 110
Chris@16 111
Chris@16 112
Chris@16 113 template< class PtrContainer >
Chris@16 114 class ptr_front_insert_iterator :
Chris@16 115 public std::iterator<std::output_iterator_tag,void,void,void,void>
Chris@16 116 {
Chris@16 117 public:
Chris@16 118 typedef PtrContainer container_type;
Chris@16 119
Chris@16 120 public:
Chris@16 121 explicit ptr_front_insert_iterator( PtrContainer& cont )
Chris@16 122 : container(&cont)
Chris@16 123 { }
Chris@16 124
Chris@16 125 ptr_front_insert_iterator&
Chris@16 126 operator=( typename PtrContainer::value_type r )
Chris@16 127 {
Chris@16 128 typename PtrContainer::value_type obj = 0;
Chris@16 129 if( r != 0 )
Chris@16 130 obj = container_type::clone_allocator_type::allocate_clone(*r);
Chris@16 131
Chris@16 132 container->push_front( obj );
Chris@16 133 return *this;
Chris@16 134 }
Chris@16 135
Chris@16 136 template< class T >
Chris@16 137 ptr_front_insert_iterator&
Chris@16 138 operator=( std::auto_ptr<T> r )
Chris@16 139 {
Chris@16 140 container->push_front( r );
Chris@16 141 return *this;
Chris@16 142 }
Chris@16 143
Chris@16 144 ptr_front_insert_iterator&
Chris@16 145 operator=( typename PtrContainer::const_reference r )
Chris@16 146 {
Chris@16 147 container->push_front( container_type::clone_allocator_type::
Chris@16 148 allocate_clone(r) );
Chris@16 149 return *this;
Chris@16 150 }
Chris@16 151
Chris@16 152 ptr_front_insert_iterator& operator*()
Chris@16 153 {
Chris@16 154 return *this;
Chris@16 155 }
Chris@16 156
Chris@16 157 ptr_front_insert_iterator& operator++()
Chris@16 158 {
Chris@16 159 return *this;
Chris@16 160 }
Chris@16 161
Chris@16 162 ptr_front_insert_iterator operator++(int)
Chris@16 163 {
Chris@16 164 return *this;
Chris@16 165 }
Chris@16 166
Chris@16 167 protected:
Chris@16 168 PtrContainer* container;
Chris@16 169 };
Chris@16 170
Chris@16 171
Chris@16 172
Chris@16 173 template< class PtrContainer >
Chris@16 174 class ptr_insert_iterator :
Chris@16 175 public std::iterator<std::output_iterator_tag,void,void,void,void>
Chris@16 176 {
Chris@16 177 public:
Chris@16 178 typedef PtrContainer container_type;
Chris@16 179
Chris@16 180 public:
Chris@16 181 ptr_insert_iterator( PtrContainer& cont,
Chris@16 182 typename PtrContainer::iterator before )
Chris@16 183 : container(&cont), iter(before)
Chris@16 184 { }
Chris@16 185
Chris@16 186 ptr_insert_iterator&
Chris@16 187 operator=( typename PtrContainer::value_type r )
Chris@16 188 {
Chris@16 189 typename PtrContainer::value_type obj = 0;
Chris@16 190 if( r != 0 )
Chris@16 191 obj = container_type::clone_allocator_type::allocate_clone(*r);
Chris@16 192
Chris@16 193 iter = container->insert( iter, obj );
Chris@16 194 return *this;
Chris@16 195 }
Chris@16 196
Chris@16 197 template< class T >
Chris@16 198 ptr_insert_iterator&
Chris@16 199 operator=( std::auto_ptr<T> r )
Chris@16 200 {
Chris@16 201 iter = container->insert( iter, r );
Chris@16 202 return *this;
Chris@16 203 }
Chris@16 204
Chris@16 205 ptr_insert_iterator&
Chris@16 206 operator=( typename PtrContainer::const_reference r )
Chris@16 207 {
Chris@16 208 iter = container->insert( iter, container_type::clone_allocator_type::
Chris@16 209 allocate_clone(r) );
Chris@16 210 return *this;
Chris@16 211 }
Chris@16 212
Chris@16 213 ptr_insert_iterator& operator*()
Chris@16 214 {
Chris@16 215 return *this;
Chris@16 216 }
Chris@16 217
Chris@16 218 ptr_insert_iterator& operator++()
Chris@16 219 {
Chris@16 220 return *this;
Chris@16 221 }
Chris@16 222
Chris@16 223 ptr_insert_iterator operator++(int)
Chris@16 224 {
Chris@16 225 return *this;
Chris@16 226 }
Chris@16 227
Chris@16 228 protected:
Chris@16 229 PtrContainer* container;
Chris@16 230 typename PtrContainer::iterator iter;
Chris@16 231 };
Chris@16 232
Chris@16 233 template< class PtrContainer >
Chris@16 234 inline ptr_back_insert_iterator<PtrContainer>
Chris@16 235 ptr_back_inserter( PtrContainer& cont )
Chris@16 236 {
Chris@16 237 return ptr_back_insert_iterator<PtrContainer>( cont );
Chris@16 238 }
Chris@16 239
Chris@16 240 template< class PtrContainer >
Chris@16 241 inline ptr_front_insert_iterator<PtrContainer>
Chris@16 242 ptr_front_inserter( PtrContainer& cont )
Chris@16 243 {
Chris@16 244 return ptr_front_insert_iterator<PtrContainer>( cont );
Chris@16 245 }
Chris@16 246
Chris@16 247 template< class PtrContainer >
Chris@16 248 inline ptr_insert_iterator<PtrContainer>
Chris@16 249 ptr_inserter( PtrContainer& cont,
Chris@16 250 typename PtrContainer::iterator before )
Chris@16 251 {
Chris@16 252 return ptr_insert_iterator<PtrContainer>( cont, before );
Chris@16 253 }
Chris@16 254
Chris@16 255 } // namespace 'ptr_container'
Chris@16 256 } // namespace 'boost'
Chris@16 257
Chris@16 258 #endif