1 
2 #ifndef WK_FILTER_H
3 #define WK_FILTER_H
4 
5 #include "wk/geometry-handler.hpp"
6 
7 class WKFilter: public WKGeometryHandler {
8 public:
WKFilter(WKGeometryHandler & handler)9   WKFilter(WKGeometryHandler& handler): handler(handler) {}
10 
nextFeatureStart(size_t featureId)11   virtual void nextFeatureStart(size_t featureId) {
12     this->handler.nextFeatureStart(featureId);
13   }
14 
nextFeatureEnd(size_t featureId)15   virtual void nextFeatureEnd(size_t featureId) {
16     this->handler.nextFeatureEnd(featureId);
17   }
18 
nextNull(size_t featureId)19   virtual void nextNull(size_t featureId) {
20     this->handler.nextNull(featureId);
21   }
22 
nextGeometryStart(const WKGeometryMeta & meta,uint32_t partId)23   virtual void nextGeometryStart(const WKGeometryMeta& meta, uint32_t partId) {
24     this->handler.nextGeometryStart(meta, partId);
25   }
26 
nextGeometryEnd(const WKGeometryMeta & meta,uint32_t partId)27   virtual void nextGeometryEnd(const WKGeometryMeta& meta, uint32_t partId) {
28     this->handler.nextGeometryEnd(meta, partId);
29   }
30 
nextLinearRingStart(const WKGeometryMeta & meta,uint32_t size,uint32_t ringId)31   virtual void nextLinearRingStart(const WKGeometryMeta& meta, uint32_t size, uint32_t ringId) {
32     this->handler.nextLinearRingStart(meta, size, ringId);
33   }
34 
nextLinearRingEnd(const WKGeometryMeta & meta,uint32_t size,uint32_t ringId)35   virtual void nextLinearRingEnd(const WKGeometryMeta& meta, uint32_t size, uint32_t ringId) {
36     this->handler.nextLinearRingEnd(meta, size, ringId);
37   }
38 
nextCoordinate(const WKGeometryMeta & meta,const WKCoord & coord,uint32_t coordId)39   virtual void nextCoordinate(const WKGeometryMeta& meta, const WKCoord& coord, uint32_t coordId) {
40     this->handler.nextCoordinate(meta, coord, coordId);
41   }
42 
nextError(WKParseException & error,size_t featureId)43   virtual bool nextError(WKParseException& error, size_t featureId) {
44     return this->handler.nextError(error, featureId);
45   }
46 
47 protected:
48   WKGeometryHandler& handler;
49 };
50 
51 class  WKMetaFilter: public WKFilter {
52 public:
WKMetaFilter(WKGeometryHandler & handler)53   WKMetaFilter(WKGeometryHandler& handler): WKFilter(handler) {}
54 
55   virtual WKGeometryMeta newGeometryMeta(const WKGeometryMeta& meta, uint32_t partId) = 0;
56 
nextFeatureStart(size_t featureId)57   virtual void nextFeatureStart(size_t featureId) {
58     this->metaReplacement.clear();
59     this->handler.nextFeatureStart(featureId);
60   }
61 
nextGeometryStart(const WKGeometryMeta & meta,uint32_t partId)62   virtual void nextGeometryStart(const WKGeometryMeta& meta, uint32_t partId) {
63     this->metaReplacement[meta.id()] = this->newGeometryMeta(meta, partId);
64     this->handler.nextGeometryStart(this->metaReplacement[meta.id()], partId);
65   }
66 
nextGeometryEnd(const WKGeometryMeta & meta,uint32_t partId)67   virtual void nextGeometryEnd(const WKGeometryMeta& meta, uint32_t partId) {
68     this->handler.nextGeometryEnd(this->metaReplacement[meta.id()], partId);
69   }
70 
nextLinearRingStart(const WKGeometryMeta & meta,uint32_t size,uint32_t ringId)71   virtual void nextLinearRingStart(const WKGeometryMeta& meta, uint32_t size, uint32_t ringId) {
72     this->handler.nextLinearRingStart(this->metaReplacement[meta.id()], size, ringId);
73   }
74 
nextLinearRingEnd(const WKGeometryMeta & meta,uint32_t size,uint32_t ringId)75   virtual void nextLinearRingEnd(const WKGeometryMeta& meta, uint32_t size, uint32_t ringId) {
76     this->handler.nextLinearRingEnd(this->metaReplacement[meta.id()], size, ringId);
77   }
78 
nextCoordinate(const WKGeometryMeta & meta,const WKCoord & coord,uint32_t coordId)79   virtual void nextCoordinate(const WKGeometryMeta& meta, const WKCoord& coord, uint32_t coordId) {
80     this->handler.nextCoordinate(this->metaReplacement[meta.id()], coord, coordId);
81   }
82 
83 protected:
84   // using a hash map to keep track of meta, because it's important to make sure that
85   // identical meta objects are used for identical geometry
86   // objects (used in s2 and elsewhere to handle nested collections)
87   std::unordered_map<uintptr_t, WKGeometryMeta> metaReplacement;
88 };
89 
90 #endif
91