QGIS API Documentation  2.0.1-Dufour
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgsvectorlayercache.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayercache.h
3  Cache features of a vector layer
4  -------------------
5  begin : January 2013
6  copyright : (C) Matthias Kuhn
7  email : matthias dot kuhn at gmx dot ch
8 
9  ***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 
19 #ifndef QgsVectorLayerCache_H
20 #define QgsVectorLayerCache_H
21 
22 #include <QCache>
23 
24 #include "qgsvectorlayer.h"
25 
28 
38 class CORE_EXPORT QgsVectorLayerCache : public QObject
39 {
40  Q_OBJECT
41 
42  private:
49  {
50  public:
58  : mCache( vlCache )
59  {
60  mFeature = new QgsFeature( feat );
61  }
62 
64  {
65  // That's the reason we need this wrapper:
66  // Inform the cache that this feature has been removed
67  mCache->featureRemoved( mFeature->id() );
68  delete mFeature;
69  }
70 
71  inline const QgsFeature* feature() { return mFeature; }
72 
73  private:
76 
77  friend class QgsVectorLayerCache;
78  };
79 
80  public:
81  QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent = NULL );
82 
89  void setCacheSize( int cacheSize );
90 
98  int cacheSize();
99 
105  void setCacheGeometry( bool cacheGeometry );
106 
107 
113  void setCacheSubsetOfAttributes( const QgsAttributeList& attributes );
114 
121  void setCacheAddedAttributes( bool cacheAddedAttributes );
122 
133  void setFullCache( bool fullCache );
134 
142  void addCacheIndex( QgsAbstractCacheIndex *cacheIndex );
143 
153  QgsFeatureIterator getFeatures( const QgsFeatureRequest& featureRequest );
154 
160  bool isFidCached( const QgsFeatureId fid );
161 
169  bool featureAtId( QgsFeatureId featureId, QgsFeature &feature, bool skipCache = false );
170 
176  bool removeCachedFeature( QgsFeatureId fid );
177 
182 
183  protected:
192  void requestCompleted( QgsFeatureRequest featureRequest, QgsFeatureIds fids );
193 
201  void featureRemoved( QgsFeatureId fid );
202 
213  bool checkInformationCovered( const QgsFeatureRequest& featureRequest );
214 
215 
216  signals:
217 
225  void progress( int i, bool& cancel );
226 
230  void finished();
231 
237  void cachedLayerDeleted();
238 
243  void attributeValueChanged( const QgsFeatureId& fid, const int& field, const QVariant &value );
244 
245  private slots:
246  void onAttributeValueChanged( QgsFeatureId fid, int field, const QVariant& value );
247  void featureDeleted( QgsFeatureId fid );
248  void featureAdded( QgsFeatureId fid );
249  void attributeAdded( int field );
250  void attributeDeleted( int field );
251  void geometryChanged( QgsFeatureId fid, QgsGeometry& geom );
252  void layerDeleted();
253  void updatedFields();
254 
255  private:
256 
257  inline void cacheFeature( QgsFeature& feat )
258  {
259  QgsCachedFeature* cachedFeature = new QgsCachedFeature( feat, this );
260  mCache.insert( feat.id(), cachedFeature );
261  }
262 
264  QCache< QgsFeatureId, QgsCachedFeature > mCache;
265 
268  QList<QgsAbstractCacheIndex*> mCacheIndices;
269 
271 
274  friend class QgsCachedFeature;
275 };
276 #endif // QgsVectorLayerCache_H