xref: /aoo4110/main/cosv/inc/cosv/tpl/vvector.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef CSV_VVECTOR_HXX
25*b1cdbd2cSJim Jagielski #define CSV_VVECTOR_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <cstddef>      // for ptrdiff_t
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski // USED SERVICES
30*b1cdbd2cSJim Jagielski #include <vector>
31*b1cdbd2cSJim Jagielski #include <cosv/tpl/tpltools.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski namespace csv
37*b1cdbd2cSJim Jagielski {
38*b1cdbd2cSJim Jagielski namespace vvector
39*b1cdbd2cSJim Jagielski {
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski template <class TYPE>
43*b1cdbd2cSJim Jagielski struct delete_ptrs
44*b1cdbd2cSJim Jagielski {
Destructcsv::vvector::delete_ptrs45*b1cdbd2cSJim Jagielski     static void         Destruct(
46*b1cdbd2cSJim Jagielski                             std::vector< TYPE* > &
47*b1cdbd2cSJim Jagielski                                                 v)
48*b1cdbd2cSJim Jagielski                         { csv::erase_container_of_heap_ptrs(v); }
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski     /// @precond ->it is a valid iterator within v
Erasecsv::vvector::delete_ptrs51*b1cdbd2cSJim Jagielski     static void         Erase(
52*b1cdbd2cSJim Jagielski                             std::vector< TYPE* > &
53*b1cdbd2cSJim Jagielski                                                 v,
54*b1cdbd2cSJim Jagielski                             typename std::vector< TYPE* >::iterator
55*b1cdbd2cSJim Jagielski                                                 it2erase )
56*b1cdbd2cSJim Jagielski                         { delete *it2erase; v.erase(it2erase); }
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski     /// @precond ->v.size() > 0
PopBackcsv::vvector::delete_ptrs59*b1cdbd2cSJim Jagielski     static void         PopBack(
60*b1cdbd2cSJim Jagielski                             std::vector< TYPE* > &
61*b1cdbd2cSJim Jagielski                                                 v )
62*b1cdbd2cSJim Jagielski                         { delete v.back(); v.pop_back(); }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     /// @precond ->it is a valid iterator
ReplacePtrcsv::vvector::delete_ptrs65*b1cdbd2cSJim Jagielski     static void         ReplacePtr(
66*b1cdbd2cSJim Jagielski                             typename std::vector< TYPE* >::iterator
67*b1cdbd2cSJim Jagielski                                                 it,
68*b1cdbd2cSJim Jagielski                             DYN TYPE *          pass_new )
69*b1cdbd2cSJim Jagielski                         { delete *it; *it = pass_new; }
70*b1cdbd2cSJim Jagielski };
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski /** One helper class for the ->csv::VirtualVector.
74*b1cdbd2cSJim Jagielski     Implements a
75*b1cdbd2cSJim Jagielski */
76*b1cdbd2cSJim Jagielski template <class TYPE>
77*b1cdbd2cSJim Jagielski struct keep_ptrs
78*b1cdbd2cSJim Jagielski {
Destructcsv::vvector::keep_ptrs79*b1cdbd2cSJim Jagielski     static void         Destruct(std::vector< TYPE* > & v)
80*b1cdbd2cSJim Jagielski                         {}
81*b1cdbd2cSJim Jagielski 
Erasecsv::vvector::keep_ptrs82*b1cdbd2cSJim Jagielski     static void         Erase(
83*b1cdbd2cSJim Jagielski                             std::vector< TYPE* > &
84*b1cdbd2cSJim Jagielski                                                 v,
85*b1cdbd2cSJim Jagielski                             typename std::vector< TYPE* >::iterator
86*b1cdbd2cSJim Jagielski                                                 it2erase )
87*b1cdbd2cSJim Jagielski                         { v.erase(it2erase); }
88*b1cdbd2cSJim Jagielski 
PopBackcsv::vvector::keep_ptrs89*b1cdbd2cSJim Jagielski     static void         PopBack(
90*b1cdbd2cSJim Jagielski                             std::vector< TYPE* > &
91*b1cdbd2cSJim Jagielski                                                 v )
92*b1cdbd2cSJim Jagielski                         { v.pop_back(); }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski     /// @precond ->it is a valid iterator
ReplacePtrcsv::vvector::keep_ptrs95*b1cdbd2cSJim Jagielski     static void         ReplacePtr(
96*b1cdbd2cSJim Jagielski                             typename std::vector< TYPE* >::iterator
97*b1cdbd2cSJim Jagielski                                                 it,
98*b1cdbd2cSJim Jagielski                             TYPE *              io_new )
99*b1cdbd2cSJim Jagielski                         { *it = io_new; }
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski }   // namespace vvector
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski /** Implements a vector of different implementations of a base
109*b1cdbd2cSJim Jagielski     class.
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski     Implementation has to be by pointers to get the polymorphic
112*b1cdbd2cSJim Jagielski     behaviour, however access is by references to the base class.
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     @tpl XX
115*b1cdbd2cSJim Jagielski     The common base class of vector elements.
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski     @tpl PTRDEL
118*b1cdbd2cSJim Jagielski     Has two possible values:
119*b1cdbd2cSJim Jagielski         vvector::delete_ptrs<XX>    Elements have to be on the heap and
120*b1cdbd2cSJim Jagielski                                     are deleted when removed (default).
121*b1cdbd2cSJim Jagielski         vvector::keep_ptrs<XX>      Elements are only referenced and not
122*b1cdbd2cSJim Jagielski                                     deleted when removed.
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski */
125*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL = vvector::delete_ptrs<XX> >
126*b1cdbd2cSJim Jagielski class VirtualVector
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski   public:
129*b1cdbd2cSJim Jagielski 	typedef VirtualVector<XX,PTRDEL>            self;
130*b1cdbd2cSJim Jagielski 	typedef std::vector< DYN XX* >              impl_type;
131*b1cdbd2cSJim Jagielski 	typedef typename impl_type::size_type       size_type;
132*b1cdbd2cSJim Jagielski     typedef ptrdiff_t                           difference_type;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski     class const_iterator;
135*b1cdbd2cSJim Jagielski     class iterator;
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski     // LIFECYCLE
138*b1cdbd2cSJim Jagielski 						VirtualVector();
139*b1cdbd2cSJim Jagielski     explicit    		VirtualVector(
140*b1cdbd2cSJim Jagielski 						    int                 i_size );
141*b1cdbd2cSJim Jagielski 						~VirtualVector();
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski     // OPERATORS
144*b1cdbd2cSJim Jagielski     const XX &          operator[](
145*b1cdbd2cSJim Jagielski                             size_type           i_pos ) const;
146*b1cdbd2cSJim Jagielski     XX &                operator[](
147*b1cdbd2cSJim Jagielski                             size_type           i_pos );
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski     // OPERATIONS
150*b1cdbd2cSJim Jagielski     void                push_back(
151*b1cdbd2cSJim Jagielski                             DYN XX &            i_drElement );
152*b1cdbd2cSJim Jagielski     void                pop_back();
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     iterator            insert(
155*b1cdbd2cSJim Jagielski                             iterator            i_pos,
156*b1cdbd2cSJim Jagielski                             DYN XX &            i_drElement );
157*b1cdbd2cSJim Jagielski     void                erase(
158*b1cdbd2cSJim Jagielski                             iterator            i_pos );
159*b1cdbd2cSJim Jagielski     void                replace(
160*b1cdbd2cSJim Jagielski                             iterator            i_pos,
161*b1cdbd2cSJim Jagielski                             DYN XX &            i_drElement );
162*b1cdbd2cSJim Jagielski     void                reserve(
163*b1cdbd2cSJim Jagielski                             size_type           i_size );
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     // INQUIRY
166*b1cdbd2cSJim Jagielski     bool                empty() const;
167*b1cdbd2cSJim Jagielski     size_t              size() const;
168*b1cdbd2cSJim Jagielski 	const_iterator      begin() const;
169*b1cdbd2cSJim Jagielski 	const_iterator      end() const;
170*b1cdbd2cSJim Jagielski     const XX &          front() const;
171*b1cdbd2cSJim Jagielski     const XX &          back() const;
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     // ACCESS
174*b1cdbd2cSJim Jagielski 	iterator            begin();
175*b1cdbd2cSJim Jagielski 	iterator            end();
176*b1cdbd2cSJim Jagielski     XX &                front();
177*b1cdbd2cSJim Jagielski     XX &                back();
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski   private:
180*b1cdbd2cSJim Jagielski     // Forbidden:
181*b1cdbd2cSJim Jagielski                         VirtualVector(const VirtualVector&);
182*b1cdbd2cSJim Jagielski     VirtualVector &     operator=(const VirtualVector&);
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski     // DATA
185*b1cdbd2cSJim Jagielski     std::vector< DYN XX* >
186*b1cdbd2cSJim Jagielski                         aData;
187*b1cdbd2cSJim Jagielski };
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski /** Should be usable for all STL algorithms.
193*b1cdbd2cSJim Jagielski     Implements the Random Access Iterator concept.
194*b1cdbd2cSJim Jagielski */
195*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
196*b1cdbd2cSJim Jagielski class VirtualVector<XX,PTRDEL>::
197*b1cdbd2cSJim Jagielski       const_iterator
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski             // This derivation provides type information for the STL
200*b1cdbd2cSJim Jagielski             // It introduces the types "value_type" and "difference_type".
201*b1cdbd2cSJim Jagielski             : public std::iterator<std::random_access_iterator_tag,
202*b1cdbd2cSJim Jagielski                         const XX>
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski   public:
205*b1cdbd2cSJim Jagielski     typedef VirtualVector<XX,PTRDEL>                            my_container;
206*b1cdbd2cSJim Jagielski     typedef typename my_container::impl_type::const_iterator    impl_iterator;
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     // LIFECYCLE
const_iterator(impl_iterator i_implIter)209*b1cdbd2cSJim Jagielski                         const_iterator(
210*b1cdbd2cSJim Jagielski                             impl_iterator       i_implIter )
211*b1cdbd2cSJim Jagielski                             : itImpl(i_implIter) {}
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski     ///////////      STL ITERATOR CONCEPT IMPLEMENTATION        //////////////
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski     // Default Constructible functions:
const_iterator()217*b1cdbd2cSJim Jagielski                         const_iterator()
218*b1cdbd2cSJim Jagielski                             : itImpl() {}
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski     // Assignable functions:
221*b1cdbd2cSJim Jagielski         // Assignment and copy constructor use the compiler generated versions.
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski     // Equality Comparable functions:
operator ==(const_iterator i_other) const224*b1cdbd2cSJim Jagielski     bool                operator==(
225*b1cdbd2cSJim Jagielski                             const_iterator      i_other ) const
226*b1cdbd2cSJim Jagielski                             { return itImpl == i_other.itImpl; }
operator !=(const_iterator i_other) const227*b1cdbd2cSJim Jagielski     bool                operator!=(
228*b1cdbd2cSJim Jagielski                             const_iterator      i_other ) const
229*b1cdbd2cSJim Jagielski                             { return itImpl != i_other.itImpl; }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     // Trivial Iterator functions:
operator *() const232*b1cdbd2cSJim Jagielski     const XX &          operator*() const
233*b1cdbd2cSJim Jagielski                             { return *(*itImpl); }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski     // Input Iterator functions:
operator ++()236*b1cdbd2cSJim Jagielski     const_iterator &    operator++()
237*b1cdbd2cSJim Jagielski                             { ++itImpl; return *this; }
operator ++(int)238*b1cdbd2cSJim Jagielski     const_iterator      operator++(int)
239*b1cdbd2cSJim Jagielski                             { return const_iterator(itImpl++); }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski     // Bidirectional Iterator functions:
operator --()242*b1cdbd2cSJim Jagielski     const_iterator &    operator--()
243*b1cdbd2cSJim Jagielski                             { --itImpl; return *this; }
operator --(int)244*b1cdbd2cSJim Jagielski     const_iterator      operator--(int)
245*b1cdbd2cSJim Jagielski                             { return const_iterator(itImpl--); }
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski     // Less Than Comparable functions:
operator <(const_iterator i_other) const248*b1cdbd2cSJim Jagielski     bool                operator<(
249*b1cdbd2cSJim Jagielski                             const_iterator      i_other ) const
250*b1cdbd2cSJim Jagielski                             { return itImpl < i_other.itImpl; }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski     // Random Access Iterator functions:
operator +=(difference_type i_diff)253*b1cdbd2cSJim Jagielski     const_iterator &    operator+=(
254*b1cdbd2cSJim Jagielski                             difference_type     i_diff )
255*b1cdbd2cSJim Jagielski                             { itImpl += i_diff; return *this; }
operator +(difference_type i_diff) const256*b1cdbd2cSJim Jagielski     const_iterator      operator+(
257*b1cdbd2cSJim Jagielski                             difference_type     i_diff ) const
258*b1cdbd2cSJim Jagielski                             { const_iterator ret(itImpl);
259*b1cdbd2cSJim Jagielski                               return ret += i_diff; }
operator -=(difference_type i_diff)260*b1cdbd2cSJim Jagielski     const_iterator &    operator-=(
261*b1cdbd2cSJim Jagielski                             difference_type     i_diff )
262*b1cdbd2cSJim Jagielski                             { itImpl -= i_diff;  return *this; }
operator -(difference_type i_diff) const263*b1cdbd2cSJim Jagielski     const_iterator      operator-(
264*b1cdbd2cSJim Jagielski                             difference_type     i_diff ) const
265*b1cdbd2cSJim Jagielski                             { const_iterator ret(itImpl);
266*b1cdbd2cSJim Jagielski                               return ret -= i_diff; }
operator -(const_iterator i_it) const267*b1cdbd2cSJim Jagielski     difference_type     operator-(
268*b1cdbd2cSJim Jagielski                             const_iterator      i_it ) const
269*b1cdbd2cSJim Jagielski                             { return itImpl - i_it.itImpl; }
operator [](difference_type i_index)270*b1cdbd2cSJim Jagielski     const XX &          operator[](
271*b1cdbd2cSJim Jagielski                             difference_type     i_index )
272*b1cdbd2cSJim Jagielski                             { return *(*itImpl[i_index]); }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski     //////////////////////////////////////////////////////////////////////////
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski   private:
277*b1cdbd2cSJim Jagielski     friend class VirtualVector<XX,PTRDEL>;
ImplValue() const278*b1cdbd2cSJim Jagielski     impl_iterator       ImplValue() const       { return itImpl; }
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski     // DATA
281*b1cdbd2cSJim Jagielski     impl_iterator       itImpl;
282*b1cdbd2cSJim Jagielski };
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski /** Should be usable for all STL algorithms.
288*b1cdbd2cSJim Jagielski     Implements the Random Access Iterator concept.
289*b1cdbd2cSJim Jagielski */
290*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
291*b1cdbd2cSJim Jagielski class VirtualVector<XX,PTRDEL>::
292*b1cdbd2cSJim Jagielski       iterator
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski             // This derivation provides type information for the STL
295*b1cdbd2cSJim Jagielski             // It introduces the types "value_type" and "difference_type".
296*b1cdbd2cSJim Jagielski             : public std::iterator<std::random_access_iterator_tag,
297*b1cdbd2cSJim Jagielski                         XX>
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski   public:
300*b1cdbd2cSJim Jagielski     typedef VirtualVector<XX,PTRDEL>                            my_container;
301*b1cdbd2cSJim Jagielski     typedef typename my_container::impl_type::iterator          impl_iterator;
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski     // LIFECYCLE
iterator(impl_iterator i_implIter)304*b1cdbd2cSJim Jagielski                         iterator(
305*b1cdbd2cSJim Jagielski                             impl_iterator       i_implIter )
306*b1cdbd2cSJim Jagielski                             : itImpl(i_implIter) {}
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski     ///////////      STL ITERATOR CONCEPT IMPLEMENTATION        //////////////
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski     // Default Constructible functions:
iterator()312*b1cdbd2cSJim Jagielski                         iterator()
313*b1cdbd2cSJim Jagielski                             : itImpl() {}
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski     // Assignable functions:
316*b1cdbd2cSJim Jagielski         // Assignment and copy constructor use the compiler generated versions.
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski     // Equality Comparable functions:
operator ==(iterator i_other) const319*b1cdbd2cSJim Jagielski     bool                operator==(
320*b1cdbd2cSJim Jagielski                             iterator            i_other ) const
321*b1cdbd2cSJim Jagielski                             { return itImpl == i_other.itImpl; }
operator !=(iterator i_other) const322*b1cdbd2cSJim Jagielski     bool                operator!=(
323*b1cdbd2cSJim Jagielski                             iterator            i_other ) const
324*b1cdbd2cSJim Jagielski                             { return itImpl != i_other.itImpl; }
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski     // Trivial Iterator functions:
operator *() const327*b1cdbd2cSJim Jagielski     XX &                operator*() const
328*b1cdbd2cSJim Jagielski                             { return *(*itImpl); }
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski     // Input Iterator functions:
operator ++()331*b1cdbd2cSJim Jagielski     iterator &          operator++()
332*b1cdbd2cSJim Jagielski                             { ++itImpl; return *this; }
operator ++(int)333*b1cdbd2cSJim Jagielski     iterator            operator++(int)
334*b1cdbd2cSJim Jagielski                             { return iterator(itImpl++); }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski     // Bidirectional Iterator functions:
operator --()337*b1cdbd2cSJim Jagielski     iterator &          operator--()
338*b1cdbd2cSJim Jagielski                             { --itImpl; return *this; }
operator --(int)339*b1cdbd2cSJim Jagielski     iterator            operator--(int)
340*b1cdbd2cSJim Jagielski                             { return iterator(itImpl--); }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski     // Less Than Comparable functions:
operator <(iterator i_other) const343*b1cdbd2cSJim Jagielski     bool                operator<(
344*b1cdbd2cSJim Jagielski                             iterator            i_other ) const
345*b1cdbd2cSJim Jagielski                             { return itImpl < i_other.itImpl; }
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski     // Random Access Iterator functions:
operator +=(difference_type i_diff)348*b1cdbd2cSJim Jagielski     iterator &          operator+=(
349*b1cdbd2cSJim Jagielski                             difference_type     i_diff )
350*b1cdbd2cSJim Jagielski                             { itImpl += i_diff; return *this;  }
operator +(difference_type i_diff) const351*b1cdbd2cSJim Jagielski     iterator            operator+(
352*b1cdbd2cSJim Jagielski                             difference_type     i_diff ) const
353*b1cdbd2cSJim Jagielski                             { iterator ret(itImpl);
354*b1cdbd2cSJim Jagielski                               return ret += i_diff; }
operator -=(difference_type i_diff)355*b1cdbd2cSJim Jagielski     iterator &          operator-=(
356*b1cdbd2cSJim Jagielski                             difference_type     i_diff )
357*b1cdbd2cSJim Jagielski                             { itImpl -= i_diff; return *this;  }
operator -(difference_type i_diff) const358*b1cdbd2cSJim Jagielski     iterator            operator-(
359*b1cdbd2cSJim Jagielski                             difference_type     i_diff ) const
360*b1cdbd2cSJim Jagielski                             { iterator ret(itImpl);
361*b1cdbd2cSJim Jagielski                               return ret -= i_diff; }
operator -(iterator i_it) const362*b1cdbd2cSJim Jagielski     difference_type     operator-(
363*b1cdbd2cSJim Jagielski                             iterator            i_it ) const
364*b1cdbd2cSJim Jagielski                             { return itImpl - i_it.itImpl; }
operator [](difference_type i_index)365*b1cdbd2cSJim Jagielski     XX &                operator[](
366*b1cdbd2cSJim Jagielski                             difference_type     i_index )
367*b1cdbd2cSJim Jagielski                             { return *(*itImpl[i_index]); }
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     //////////////////////////////////////////////////////////////////////////
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski   private:
372*b1cdbd2cSJim Jagielski     friend class VirtualVector<XX,PTRDEL>;
ImplValue() const373*b1cdbd2cSJim Jagielski     impl_iterator       ImplValue() const       { return itImpl; }
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski     // DATA
376*b1cdbd2cSJim Jagielski     impl_iterator       itImpl;
377*b1cdbd2cSJim Jagielski };
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski // IMPLEMENTATION
383*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
384*b1cdbd2cSJim Jagielski inline
VirtualVector()385*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::VirtualVector()
386*b1cdbd2cSJim Jagielski     :   aData()
387*b1cdbd2cSJim Jagielski {
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
391*b1cdbd2cSJim Jagielski inline
VirtualVector(int i_size)392*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::VirtualVector(int i_size)
393*b1cdbd2cSJim Jagielski     :   aData(i_size, 0)
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
398*b1cdbd2cSJim Jagielski inline
~VirtualVector()399*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::~VirtualVector()
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski     PTRDEL::Destruct(aData);
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
405*b1cdbd2cSJim Jagielski inline const XX &
operator [](size_type i_pos) const406*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::operator[]( size_type i_pos ) const
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     return *aData[i_pos];
409*b1cdbd2cSJim Jagielski }
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
412*b1cdbd2cSJim Jagielski inline XX &
operator [](size_type i_pos)413*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::operator[]( size_type i_pos )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski     return *aData[i_pos];
416*b1cdbd2cSJim Jagielski }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
419*b1cdbd2cSJim Jagielski inline void
push_back(DYN XX & i_drElement)420*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::push_back( DYN XX & i_drElement )
421*b1cdbd2cSJim Jagielski {
422*b1cdbd2cSJim Jagielski     aData.push_back(&i_drElement);
423*b1cdbd2cSJim Jagielski }
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
426*b1cdbd2cSJim Jagielski inline void
pop_back()427*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::pop_back()
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski     if (NOT aData.empty())
430*b1cdbd2cSJim Jagielski         PTRDEL::PopBack(aData);
431*b1cdbd2cSJim Jagielski }
432*b1cdbd2cSJim Jagielski 
433*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
434*b1cdbd2cSJim Jagielski inline typename VirtualVector<XX,PTRDEL>::iterator
insert(iterator i_pos,DYN XX & i_drElement)435*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::insert( iterator            i_pos,
436*b1cdbd2cSJim Jagielski                                   DYN XX &            i_drElement )
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski     return iterator(aData.insert(i_pos.ImplValue(), &i_drElement));
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
442*b1cdbd2cSJim Jagielski inline void
erase(iterator i_pos)443*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::erase( iterator i_pos )
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski     PTRDEL::Erase(aData, i_pos.ImplValue());
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
448*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
449*b1cdbd2cSJim Jagielski inline void
replace(iterator i_pos,DYN XX & i_drElement)450*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::replace( iterator     i_pos,
451*b1cdbd2cSJim Jagielski                                    DYN XX &     i_drElement )
452*b1cdbd2cSJim Jagielski {
453*b1cdbd2cSJim Jagielski     PTRDEL::ReplacePtr(*i_pos, &i_drElement);
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
456*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
457*b1cdbd2cSJim Jagielski inline void
reserve(size_type i_size)458*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::reserve( size_type i_size )
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     aData.reserve(i_size);
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
464*b1cdbd2cSJim Jagielski inline bool
empty() const465*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::empty() const
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski     return aData.empty();
468*b1cdbd2cSJim Jagielski }
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
471*b1cdbd2cSJim Jagielski inline size_t
size() const472*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::size() const
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski     return aData.size();
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
478*b1cdbd2cSJim Jagielski inline typename VirtualVector<XX,PTRDEL>::const_iterator
begin() const479*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::begin() const
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski     return const_iterator(aData.begin());
482*b1cdbd2cSJim Jagielski }
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
485*b1cdbd2cSJim Jagielski inline typename VirtualVector<XX,PTRDEL>::const_iterator
end() const486*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::end() const
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski     return const_iterator(aData.end());
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
492*b1cdbd2cSJim Jagielski inline const XX &
front() const493*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::front() const
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski     return *aData.front();
496*b1cdbd2cSJim Jagielski }
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
499*b1cdbd2cSJim Jagielski inline const XX &
back() const500*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::back() const
501*b1cdbd2cSJim Jagielski {
502*b1cdbd2cSJim Jagielski     return *aData.back();
503*b1cdbd2cSJim Jagielski }
504*b1cdbd2cSJim Jagielski 
505*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
506*b1cdbd2cSJim Jagielski inline typename VirtualVector<XX,PTRDEL>::iterator
begin()507*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::begin()
508*b1cdbd2cSJim Jagielski {
509*b1cdbd2cSJim Jagielski     return iterator(aData.begin());
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
512*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
513*b1cdbd2cSJim Jagielski inline typename VirtualVector<XX,PTRDEL>::iterator
end()514*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::end()
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski     return iterator(aData.end());
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
520*b1cdbd2cSJim Jagielski inline XX &
front()521*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::front()
522*b1cdbd2cSJim Jagielski {
523*b1cdbd2cSJim Jagielski     return *aData.front();
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski template <class XX, class PTRDEL>
527*b1cdbd2cSJim Jagielski inline XX &
back()528*b1cdbd2cSJim Jagielski VirtualVector<XX,PTRDEL>::back()
529*b1cdbd2cSJim Jagielski {
530*b1cdbd2cSJim Jagielski     return *aData.back();
531*b1cdbd2cSJim Jagielski }
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 
536*b1cdbd2cSJim Jagielski }   // namespace csv
537*b1cdbd2cSJim Jagielski #endif
538