1 /***************************************************************************
2     qgsmemoryfeatureiterator.h
3     ---------------------
4     begin                : Juli 2012
5     copyright            : (C) 2012 by Martin Dobias
6     email                : wonder dot sk at gmail dot com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 #ifndef QGSMEMORYFEATUREITERATOR_H
16 #define QGSMEMORYFEATUREITERATOR_H
17 
18 #define SIP_NO_FILE
19 
20 #include "qgsfeatureiterator.h"
21 #include "qgsexpressioncontext.h"
22 #include "qgsfields.h"
23 #include "qgsgeometry.h"
24 
25 ///@cond PRIVATE
26 
27 class QgsMemoryProvider;
28 
29 typedef QMap<QgsFeatureId, QgsFeature> QgsFeatureMap;
30 
31 class QgsSpatialIndex;
32 
33 
34 class QgsMemoryFeatureSource final: public QgsAbstractFeatureSource
35 {
36   public:
37     explicit QgsMemoryFeatureSource( const QgsMemoryProvider *p );
38 
39     QgsFeatureIterator getFeatures( const QgsFeatureRequest &request ) override;
40 
41     QgsExpressionContext *expressionContext();
42 
43   private:
44     QgsFields mFields;
45     QgsFeatureMap mFeatures;
46     std::unique_ptr< QgsSpatialIndex > mSpatialIndex;
47     QString mSubsetString;
48     std::unique_ptr< QgsExpressionContext > mExpressionContext;
49     QgsCoordinateReferenceSystem mCrs;
50 
51     friend class QgsMemoryFeatureIterator;
52 };
53 
54 
55 class QgsMemoryFeatureIterator final: public QgsAbstractFeatureIteratorFromSource<QgsMemoryFeatureSource>
56 {
57   public:
58     QgsMemoryFeatureIterator( QgsMemoryFeatureSource *source, bool ownSource, const QgsFeatureRequest &request );
59 
60     ~QgsMemoryFeatureIterator() override;
61 
62     bool rewind() override;
63     bool close() override;
64 
65   protected:
66 
67     bool fetchFeature( QgsFeature &feature ) override;
68 
69   private:
70     bool nextFeatureUsingList( QgsFeature &feature );
71     bool nextFeatureTraverseAll( QgsFeature &feature );
72 
73     QgsGeometry mSelectRectGeom;
74     std::unique_ptr< QgsGeometryEngine > mSelectRectEngine;
75     QgsRectangle mFilterRect;
76     QgsFeatureMap::const_iterator mSelectIterator;
77     bool mUsingFeatureIdList = false;
78     QList<QgsFeatureId> mFeatureIdList;
79     QList<QgsFeatureId>::const_iterator mFeatureIdListIterator;
80     std::unique_ptr< QgsExpression > mSubsetExpression;
81     QgsCoordinateTransform mTransform;
82 
83 };
84 
85 ///@endcond PRIVATE
86 
87 #endif // QGSMEMORYFEATUREITERATOR_H
88