InsertIteratorFilter.hpp
1 #ifndef DM_INSERT_ITERATOR_FILTER_HPP_INCLUDED
2 #define DM_INSERT_ITERATOR_FILTER_HPP_INCLUDED
3 
4 #ifdef _MSC_VER
5  #pragma once
6 #endif
7 
8 #include "DM/Iterator.hpp"
9 #include "DM/IFilter.hpp"
10 #include "DM/IPoint.hpp"
11 #include "DM/IPolyline.hpp"
12 #include "DM/IPolygon.hpp"
13 
14 DM_NAMESPACE_BEGIN
15 
16 //forward declaration
17 template<class T>
18 class DM_API InsertIteratorFilter;
19 
20 class DM_API FilterHelper {
21 protected:
22  static void add_filtered(const IPoint &pt, FilterHandle filter, InsertIterator<IPoint> &insIt);
23  static void add_filtered(const PointHandle &pt, FilterHandle filter, InsertIterator<IPoint> &insIt);
24  //static void add_filtered(FilterHandle filter, InsertIterator<IPoint> &insIt); //final call
25 
26  static void add_filtered(const IPolyline &line, FilterHandle filter, InsertIterator<IPolyline>&insIt);
27  static void add_filtered(const PolylineHandle &line, FilterHandle filter, InsertIterator<IPolyline>&insIt);
28  static void add_filtered(FilterHandle filter, InsertIterator<IPolyline> &insIt); //final call
29 
30  static void add_filtered(const IPolygon &polygon, FilterHandle filter, InsertIterator<IPolygon> &insIt);
31  static void add_filtered(const PolygonHandle &polygon, FilterHandle filter, InsertIterator<IPolygon> &insIt);
32  static void add_filtered(FilterHandle filter, InsertIterator<IPolygon> &insIt); //final call
33 
34  static void add_filtered(const IGeometry &geometry, FilterHandle filter, InsertIterator<IGeometry> &insIt);
35  static void add_filtered(const GeometryHandle &geometry, FilterHandle filter, InsertIterator<IGeometry> &insIt);
36  static void add_filtered(FilterHandle filter, InsertIterator<IGeometry> &insIt); //final call
37 
38  template<class T>
39  friend class InsertIteratorFilter;
40 };
41 
42 // Derive your custom filtered insert iterator from this interface
43 // to speed-up the iteration over the point index'es tiles:
44 // Tiles for which filter() says that no data at all will pass through (according to tile extents and attributes),
45 // will not be loaded at all!
47 {
48 public:
49  virtual ~IInsertIteratorFilter();
50  virtual const FilterHandle filter() const = 0;
51 };
52 
53 template<class T>
54 class DM_API InsertIteratorFilter : public InsertIterator<T>,
56 {
57  typedef InsertIterator<T> base;
58  typedef InsertIteratorFilter self;
59 
60 public:
61  /// creates a insert iterator filter for which the user has to take care of the correct live time of the provided insert iterator object
62  InsertIteratorFilter(InsertIterator<T> &rInsIt, FilterHandle filter) : InsIt(rInsIt), Filter(filter), h_InsIt() {}
63  /// creates a insert iterator filter and overtake ownership of the provided insert iterator object
64  InsertIteratorFilter(InsertIterator<T> *pInsIt, FilterHandle filter) : InsIt(*pInsIt), Filter(filter), h_InsIt(pInsIt) {}
65  virtual ~InsertIteratorFilter() {}
66 
67  virtual base& operator=(typename base::const_reference value) { FilterHelper::add_filtered(value, Filter, InsIt); return *this; }
68  virtual base& operator=(typename base::const_handle_reference handle) { FilterHelper::add_filtered(handle, Filter, InsIt); return *this; }
69 
70  virtual base& operator*() { return *this; }
71  virtual base& operator++() { return *this; };
72 
73  virtual void finished() { /*FilterHelper::add_filtered(Filter, InsIt);*/ }
74 
75  virtual const FilterHandle filter() const { return Filter; }
76 protected:
77  InsertIterator<T> &InsIt;
78  FilterHandle Filter;
79  Handle< InsertIterator<T> > h_InsIt; //helper object to take the ownership of the actual insert iterator object if needed
80 };
81 
82 
83 /// creates a insert iterator filter for which the user has to take care of the correct live time of the provided insert iterator object
84 template<class T>
86 {
87  return InsertIteratorFilter<T>(insIt, filter);
88 }
89 
90 
91 /// creates a insert iterator filter and overtake ownership of the provided insert iterator object (need to have the Delete function being overloaded)
92 template<class T>
94 {
95  return InsertIteratorFilter<T>(pInsIt, filter);
96 }
97 
98 DM_NAMESPACE_END
99 
100 #endif //DM_INSERT_ITERATOR_FILTER_HPP_INCLUDED