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