Coverage Report

Created: 2026-02-14 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ogre/OgreMain/include/OgreIteratorWrapper.h
Line
Count
Source
1
/*
2
-----------------------------------------------------------------------------
3
This source file is part of OGRE
4
(Object-oriented Graphics Rendering Engine)
5
For the latest info, see http://www.ogre3d.org/
6
7
Copyright (c) 2000-2014 Torus Knot Software Ltd
8
9
Permission is hereby granted, free of charge, to any person obtaining a copy
10
of this software and associated documentation files (the "Software"), to deal
11
in the Software without restriction, including without limitation the rights
12
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
copies of the Software, and to permit persons to whom the Software is
14
furnished to do so, subject to the following conditions:
15
16
The above copyright notice and this permission notice shall be included in
17
all copies or substantial portions of the Software.
18
19
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
THE SOFTWARE.
26
-----------------------------------------------------------------------------
27
*/
28
#ifndef __Ogre_Iterator_Wrapper_H__
29
#define __Ogre_Iterator_Wrapper_H__
30
31
#include "OgreHeaderPrefix.h"
32
33
namespace Ogre{
34
35
/** 
36
 * 
37
 * @brief Basefunctionality for IteratorWrappers
38
 *
39
 * 
40
 * @tparam T a Container like vector list map ...
41
 * @tparam IteratorType  T::iterator or T::const_iterator
42
 * @tparam ValType  T::mapped_type in case of a map, T::value_type for vector, list,...
43
 * 
44
 * Have a look at VectorIteratorWrapper and MapIteratorWrapper for a concrete usage
45
*/
46
template <typename T, typename IteratorType, typename ValType>
47
class IteratorWrapper
48
{
49
50
    private:
51
        /// Private constructor since only the parameterised constructor should be used
52
        IteratorWrapper();
53
54
    protected:
55
        IteratorType mBegin;
56
        IteratorType mCurrent;
57
        IteratorType mEnd;
58
    
59
60
    public:
61
    
62
        /// Type you expect to get by funktions like peekNext(Value)
63
        typedef ValType ValueType;
64
        /// Type you expect to get by funktions like peekNext(Value)Ptr
65
        typedef ValType* PointerType;
66
67
        /**
68
        @brief Typedef to fulfill container interface
69
        
70
        Useful if you want to use BOOST_FOREACH
71
        @note there is no distinction between const_iterator and iterator.
72
        \n keep this in mind if you want to derivate from this class. 
73
        */
74
        typedef IteratorType iterator;
75
        
76
        /**
77
        @brief Typedef to fulfill container interface
78
        
79
        Useful if you want to use BOOST_FOREACH
80
        @note there is no distinction between const_iterator and iterator.
81
        \n keep this in mind if you want to derivate from this class. 
82
        */
83
        typedef IteratorType const_iterator;
84
85
        
86
        /** Constructor.
87
88
        Provide a start and end iterator to initialise.
89
        */
90
        IteratorWrapper ( IteratorType start, IteratorType last )
91
0
        : mBegin( start ), mCurrent ( start ), mEnd ( last )
92
0
        {
93
0
        }
Unexecuted instantiation: Ogre::IteratorWrapper<std::__1::map<unsigned int, Ogre::TerrainGroup::TerrainSlot*, std::__1::less<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, Ogre::TerrainGroup::TerrainSlot*> > >, std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, Ogre::TerrainGroup::TerrainSlot*>::IteratorWrapper(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >)
Unexecuted instantiation: Ogre::IteratorWrapper<std::__1::map<unsigned int, Ogre::TerrainGroup::TerrainSlot*, std::__1::less<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, Ogre::TerrainGroup::TerrainSlot*> > >, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, Ogre::TerrainGroup::TerrainSlot*>::IteratorWrapper(std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >)
94
95
96
        /** Returns true if there are more items in the collection. */
97
        bool hasMoreElements ( ) const
98
        {
99
            return mCurrent != mEnd;
100
        }
101
102
103
        /** Moves the iterator on one element. */
104
        void moveNext (  )
105
        {
106
            ++mCurrent;
107
        }
108
109
        /** Bookmark to the begin of the underlying collection */
110
        const IteratorType& begin() {return mBegin;}
111
        
112
        
113
        /** Full access to the current  iterator */
114
        IteratorType& current(){return mCurrent;}
115
        
116
        /** Bookmark to the end (one behind the last element) of the underlying collection */
117
        const IteratorType& end() {return mEnd;}
118
        
119
120
};
121
122
123
124
/** 
125
 * 
126
 * @brief Prepared IteratorWrapper for container like std::vector 
127
 *
128
 * 
129
 * @tparam T = Container eg vector
130
 * @tparam IteratorType  T::iterator or T::const_iterator
131
 * 
132
 * Have a look at VectorIterator and ConstVectorIterator for a more concrete usage
133
*/
134
template <typename T, typename IteratorType>
135
class VectorIteratorWrapper : public IteratorWrapper<T, IteratorType, typename  T::value_type>
136
{
137
138
    public:
139
        typedef typename IteratorWrapper<T, IteratorType, typename  T::value_type>::ValueType ValueType ; 
140
        typedef typename IteratorWrapper<T, IteratorType, typename  T::value_type>::PointerType PointerType ;
141
    
142
143
        /**
144
         * @brief c'tor
145
         * 
146
         * Constructor that provide a start and end iterator to initialise.
147
         * 
148
         * @param start Start iterator 
149
         * @param last End iterator 
150
         */
151
        VectorIteratorWrapper ( IteratorType start, IteratorType last )
152
        : IteratorWrapper<T, IteratorType, typename T::value_type>( start, last ) 
153
        {
154
        }
155
156
157
        /** Returns the next(=current) element in the collection, without advancing to the next. */
158
        ValueType peekNext (  ) const
159
        {
160
            return *(this->mCurrent);
161
        }
162
163
        /** Returns a pointer to the next(=current) element in the collection, without advancing to the next afterwards. */
164
        PointerType peekNextPtr (  )  const
165
        {
166
            return &(*(this->mCurrent) );
167
        }
168
169
        /** Returns the next(=current) value element in the collection, and advances to the next. */
170
        ValueType getNext (  ) 
171
        {
172
            return *(this->mCurrent++);
173
        }   
174
175
};
176
177
178
/** 
179
 * 
180
 * @brief Concrete IteratorWrapper for nonconst access to the underlying container
181
 * 
182
 * @tparam T  Container
183
 * 
184
*/
185
template <typename T>
186
class VectorIterator : public VectorIteratorWrapper<T,  typename T::iterator>{
187
    public:
188
        /** Constructor.
189
190
            Provide a start and end iterator to initialise.
191
        */  
192
        VectorIterator( typename T::iterator start, typename T::iterator last )
193
        : VectorIteratorWrapper<T,  typename T::iterator>(start , last )
194
        {
195
        }
196
197
        /** Constructor.
198
199
            Provide a container to initialise.
200
        */
201
        explicit VectorIterator( T& c )
202
        : VectorIteratorWrapper<T,  typename T::iterator> ( c.begin(), c.end() )
203
        {
204
        }
205
        
206
};
207
208
/** 
209
 * 
210
 * @brief Concrete IteratorWrapper for const access to the underlying container
211
 *
212
 * 
213
 * @tparam T = Container
214
 * 
215
*/
216
template <typename T>
217
class ConstVectorIterator : public VectorIteratorWrapper<T,  typename T::const_iterator>{
218
    public:
219
        /** Constructor.
220
221
            Provide a start and end iterator to initialise.
222
        */  
223
        ConstVectorIterator( typename T::const_iterator start, typename T::const_iterator last )
224
        : VectorIteratorWrapper<T,  typename T::const_iterator> (start , last )
225
        {
226
        }
227
228
        /** Constructor.
229
230
            Provide a container to initialise.
231
        */
232
        explicit ConstVectorIterator ( const T& c )
233
         : VectorIteratorWrapper<T,  typename T::const_iterator> (c.begin() , c.end() )
234
        {
235
        }
236
};
237
238
239
240
241
242
/** 
243
 * 
244
 * @brief Prepared IteratorWrapper for key-value container
245
 *
246
 * 
247
 * @tparam T  Container  (map - or also set )
248
 * @tparam  IteratorType T::iterator or T::const_iterator
249
 * 
250
 * Have a look at MapIterator and ConstMapIterator for a concrete usage
251
*/
252
template <typename T, typename IteratorType>
253
class MapIteratorWrapper  : public IteratorWrapper<T, IteratorType, typename T::mapped_type>
254
{
255
256
    public:
257
        /// Redefined ValueType for a map/set
258
        typedef typename IteratorWrapper<T, IteratorType, typename  T::mapped_type>::ValueType ValueType ; 
259
        /// Redefined PointerType for a map/set
260
        typedef typename IteratorWrapper<T, IteratorType, typename  T::mapped_type>::PointerType PointerType ;  
261
        
262
        /// Unused, just to make it clear that map/set\::value_type is not a ValueType
263
        typedef typename T::value_type PairType ; 
264
        /// Type you expect to get by funktions like peekNextKey
265
        typedef typename T::key_type KeyType;
266
        
267
        /** Constructor.
268
269
            Provide a start and end iterator to initialise.
270
        */
271
        MapIteratorWrapper ( IteratorType start, IteratorType last )
272
0
        : IteratorWrapper<T, IteratorType, typename T::mapped_type>( start, last ) 
273
0
        {
274
0
        }
Unexecuted instantiation: Ogre::MapIteratorWrapper<std::__1::map<unsigned int, Ogre::TerrainGroup::TerrainSlot*, std::__1::less<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, Ogre::TerrainGroup::TerrainSlot*> > >, std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> > >::MapIteratorWrapper(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >)
Unexecuted instantiation: Ogre::MapIteratorWrapper<std::__1::map<unsigned int, Ogre::TerrainGroup::TerrainSlot*, std::__1::less<unsigned int>, std::__1::allocator<std::__1::pair<unsigned int const, Ogre::TerrainGroup::TerrainSlot*> > >, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> > >::MapIteratorWrapper(std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, std::__1::__tree_node<std::__1::__value_type<unsigned int, Ogre::TerrainGroup::TerrainSlot*>, void*>*, long> >)
275
276
        /** Returns the next(=current) key element in the collection, without advancing to the next. */
277
        KeyType peekNextKey(void) const
278
        {
279
            return this->mCurrent->first;
280
        }
281
282
283
        /** Returns the next(=current) value element in the collection, without advancing to the next. */
284
        ValueType peekNextValue (  ) const
285
        {
286
            return this->mCurrent->second;
287
        }
288
289
290
        /** Returns a pointer to the next/current value element in the collection, without 
291
        advancing to the next afterwards. */
292
        const PointerType peekNextValuePtr (  )  const
293
        {
294
            return &(this->mCurrent->second);
295
        }
296
297
298
        /** Returns the next(=current) value element in the collection, and advances to the next. */
299
        ValueType getNext()
300
        {
301
            return ((this->mCurrent++)->second) ;
302
        }   
303
    
304
305
};
306
307
308
309
310
/** 
311
 * 
312
 * @brief Concrete IteratorWrapper for nonconst access to the underlying key-value container
313
 *
314
 * 
315
 * @remarks Template key-value container
316
 * 
317
*/
318
template <typename T>
319
class MapIterator : public MapIteratorWrapper<T,  typename T::iterator>{
320
    public:
321
    
322
        /** Constructor.
323
324
            Provide a start and end iterator to initialise.
325
        */  
326
        MapIterator( typename T::iterator start, typename T::iterator last )
327
0
        : MapIteratorWrapper<T,  typename T::iterator>(start , last )
328
0
        {
329
0
        }
330
        
331
        /** Constructor.
332
333
            Provide a container to initialise.
334
        */
335
        explicit MapIterator( T& c )
336
        : MapIteratorWrapper<T,  typename T::iterator> ( c.begin(), c.end() )
337
        {
338
        }
339
        
340
};
341
342
343
/** 
344
 * 
345
 * @brief Concrete IteratorWrapper for const access to the underlying key-value container
346
 *
347
 * 
348
 * @tparam T key-value container
349
 * 
350
*/
351
template <typename T>
352
class ConstMapIterator : public MapIteratorWrapper<T,  typename T::const_iterator>{
353
    public:
354
    
355
        /** Constructor.
356
357
            Provide a start and end iterator to initialise.
358
        */  
359
        ConstMapIterator( typename T::const_iterator start, typename T::const_iterator last )
360
0
        : MapIteratorWrapper<T,  typename T::const_iterator> (start , last )
361
0
        {
362
0
        }
363
364
        /** Constructor.
365
366
            Provide a container to initialise.
367
        */
368
        explicit ConstMapIterator ( const T& c )
369
         : MapIteratorWrapper<T,  typename T::const_iterator> (c.begin() , c.end() )
370
        {
371
        }
372
};
373
374
375
376
377
}
378
379
#include "OgreHeaderSuffix.h"
380
381
#endif