21
21
#include " qgsmessagelog.h"
22
22
23
23
24
- QgsMemoryFeatureIterator::QgsMemoryFeatureIterator ( QgsMemoryProvider* p, const QgsFeatureRequest& request )
25
- : QgsAbstractFeatureIterator( request )
26
- , P( p )
24
+
25
+ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator ( QgsMemoryFeatureSource* source, bool ownSource, const QgsFeatureRequest& request )
26
+ : QgsAbstractFeatureIteratorFromSource( source, ownSource, request )
27
27
, mSelectRectGeom( 0 )
28
28
{
29
- P->mActiveIterators << this ;
30
29
31
30
if ( mRequest .filterType () == QgsFeatureRequest::FilterRect && mRequest .flags () & QgsFeatureRequest::ExactIntersect )
32
31
{
@@ -35,17 +34,17 @@ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryProvider* p, const
35
34
36
35
// if there's spatial index, use it!
37
36
// (but don't use it when selection rect is not specified)
38
- if ( mRequest .filterType () == QgsFeatureRequest::FilterRect && P ->mSpatialIndex )
37
+ if ( mRequest .filterType () == QgsFeatureRequest::FilterRect && mSource ->mSpatialIndex )
39
38
{
40
39
mUsingFeatureIdList = true ;
41
- mFeatureIdList = P ->mSpatialIndex ->intersects ( mRequest .filterRect () );
40
+ mFeatureIdList = mSource ->mSpatialIndex ->intersects ( mRequest .filterRect () );
42
41
QgsDebugMsg ( " Features returned by spatial index: " + QString::number ( mFeatureIdList .count () ) );
43
42
}
44
43
else if ( mRequest .filterType () == QgsFeatureRequest::FilterFid )
45
44
{
46
45
mUsingFeatureIdList = true ;
47
- QgsFeatureMap::iterator it = P ->mFeatures .find ( mRequest .filterFid () );
48
- if ( it != P ->mFeatures .end () )
46
+ QgsFeatureMap::const_iterator it = mSource ->mFeatures .find ( mRequest .filterFid () );
47
+ if ( it != mSource ->mFeatures .end () )
49
48
mFeatureIdList .append ( mRequest .filterFid () );
50
49
}
51
50
else
@@ -81,12 +80,12 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature& feature )
81
80
bool hasFeature = false ;
82
81
83
82
// option 1: we have a list of features to traverse
84
- while ( mFeatureIdListIterator != mFeatureIdList .end () )
83
+ while ( mFeatureIdListIterator != mFeatureIdList .constEnd () )
85
84
{
86
85
if ( mRequest .filterType () == QgsFeatureRequest::FilterRect && mRequest .flags () & QgsFeatureRequest::ExactIntersect )
87
86
{
88
87
// do exact check in case we're doing intersection
89
- if ( P ->mFeatures [*mFeatureIdListIterator ].geometry ()->intersects ( mSelectRectGeom ) )
88
+ if ( mSource ->mFeatures [*mFeatureIdListIterator ].geometry ()->intersects ( mSelectRectGeom ) )
90
89
hasFeature = true ;
91
90
}
92
91
else
@@ -101,14 +100,14 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature& feature )
101
100
// copy feature
102
101
if ( hasFeature )
103
102
{
104
- feature = P ->mFeatures [*mFeatureIdListIterator ];
103
+ feature = mSource ->mFeatures [*mFeatureIdListIterator ];
105
104
mFeatureIdListIterator ++;
106
105
}
107
106
else
108
107
close ();
109
108
110
109
if ( hasFeature )
111
- feature.setFields ( &P ->mFields ); // allow name-based attribute lookups
110
+ feature.setFields ( &mSource ->mFields ); // allow name-based attribute lookups
112
111
113
112
return hasFeature;
114
113
}
@@ -119,7 +118,7 @@ bool QgsMemoryFeatureIterator::nextFeatureTraverseAll( QgsFeature& feature )
119
118
bool hasFeature = false ;
120
119
121
120
// option 2: traversing the whole layer
122
- while ( mSelectIterator != P ->mFeatures .end () )
121
+ while ( mSelectIterator != mSource ->mFeatures .constEnd () )
123
122
{
124
123
if ( mRequest .filterType () != QgsFeatureRequest::FilterRect )
125
124
{
@@ -154,7 +153,7 @@ bool QgsMemoryFeatureIterator::nextFeatureTraverseAll( QgsFeature& feature )
154
153
feature = mSelectIterator .value ();
155
154
mSelectIterator ++;
156
155
feature.setValid ( true );
157
- feature.setFields ( &P ->mFields ); // allow name-based attribute lookups
156
+ feature.setFields ( &mSource ->mFields ); // allow name-based attribute lookups
158
157
}
159
158
else
160
159
close ();
@@ -168,9 +167,9 @@ bool QgsMemoryFeatureIterator::rewind()
168
167
return false ;
169
168
170
169
if ( mUsingFeatureIdList )
171
- mFeatureIdListIterator = mFeatureIdList .begin ();
170
+ mFeatureIdListIterator = mFeatureIdList .constBegin ();
172
171
else
173
- mSelectIterator = P ->mFeatures .begin ();
172
+ mSelectIterator = mSource ->mFeatures .constBegin ();
174
173
175
174
return true ;
176
175
}
@@ -180,11 +179,30 @@ bool QgsMemoryFeatureIterator::close()
180
179
if ( mClosed )
181
180
return false ;
182
181
183
- P-> mActiveIterators . remove ( this );
182
+ iteratorClosed ( );
184
183
185
184
delete mSelectRectGeom ;
186
185
mSelectRectGeom = NULL ;
187
186
188
187
mClosed = true ;
189
188
return true ;
190
189
}
190
+
191
+ // -------------------------
192
+
193
+ QgsMemoryFeatureSource::QgsMemoryFeatureSource ( const QgsMemoryProvider* p )
194
+ : mFields( p->mFields )
195
+ , mFeatures( p->mFeatures )
196
+ , mSpatialIndex( p->mSpatialIndex ? new QgsSpatialIndex( *p->mSpatialIndex ) : 0 ) // just shallow copy
197
+ {
198
+ }
199
+
200
+ QgsMemoryFeatureSource::~QgsMemoryFeatureSource ()
201
+ {
202
+ delete mSpatialIndex ;
203
+ }
204
+
205
+ QgsFeatureIterator QgsMemoryFeatureSource::getFeatures ( const QgsFeatureRequest& request )
206
+ {
207
+ return QgsFeatureIterator ( new QgsMemoryFeatureIterator ( this , false , request ) );
208
+ }
0 commit comments