GEOS  3.12.0
CoordinateFilter.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2005-2006 Refractions Research Inc.
7  *
8  * This is free software; you can redistribute and/or modify it under
9  * the terms of the GNU Lesser General Public Licence as published
10  * by the Free Software Foundation.
11  * See the COPYING file for more information.
12  *
13  **********************************************************************/
14 
15 #pragma once
16 
17 #include <geos/export.h>
18 #include <geos/geom/Coordinate.h>
19 
20 #include <cassert>
21 
22 namespace geos {
23 namespace geom { // geos::geom
24 
43 class GEOS_DLL CoordinateFilter {
44 public:
45  virtual
46  ~CoordinateFilter() {}
47 
53  virtual void
54  filter_rw(CoordinateXY* /*coord*/) const
55  {
56  assert(0);
57  }
58 
64  virtual void
65  filter_ro(const CoordinateXY* /*coord*/)
66  {
67  assert(0);
68  }
69 
70  virtual void
71  filter_rw(Coordinate* c) const
72  {
73  filter_rw(static_cast<CoordinateXY*>(c));
74  }
75 
76  virtual void
77  filter_ro(const Coordinate* c)
78  {
79  filter_ro(static_cast<const CoordinateXY*>(c));
80  }
81 
82  virtual void
83  filter_rw(CoordinateXYM* c) const
84  {
85  filter_rw(static_cast<CoordinateXY*>(c));
86  }
87 
88  virtual void
89  filter_ro(const CoordinateXYM* c)
90  {
91  filter_ro(static_cast<const CoordinateXY*>(c));
92  }
93 
94  virtual void
95  filter_rw(CoordinateXYZM* c) const
96  {
97  filter_rw(static_cast<Coordinate*>(c));
98  }
99 
100  virtual void
101  filter_ro(const CoordinateXYZM* c)
102  {
103  filter_ro(static_cast<const Coordinate*>(c));
104  }
105 };
106 
107 template<class Derived>
108 class CoordinateInspector : public CoordinateFilter
109 {
110 public:
111  virtual void filter_ro(const CoordinateXY* c) override { static_cast<Derived*>(this)->filter(c); }
112  virtual void filter_ro(const Coordinate* c) override { static_cast<Derived*>(this)->filter(c); }
113  virtual void filter_ro(const CoordinateXYM* c) override { static_cast<Derived*>(this)->filter(c); }
114  virtual void filter_ro(const CoordinateXYZM* c) override { static_cast<Derived*>(this)->filter(c); }
115 };
116 
117 template<class Derived>
118 class CoordinateMutator : public CoordinateFilter
119 {
120 public:
121  virtual void filter_rw(CoordinateXY* c) const override { static_cast<const Derived*>(this)->filter(c); }
122  virtual void filter_rw(Coordinate* c) const override { static_cast<const Derived*>(this)->filter(c); }
123  virtual void filter_rw(CoordinateXYM* c) const override { static_cast<const Derived*>(this)->filter(c); }
124  virtual void filter_rw(CoordinateXYZM* c) const override { static_cast<const Derived*>(this)->filter(c); }
125 };
126 
127 } // namespace geos::geom
128 } // namespace geos
129 
Coordinate is the lightweight class used to store coordinates.
Definition: Coordinate.h:216
Geometry classes support the concept of applying a coordinate filter to every coordinate in the Geome...
Definition: CoordinateFilter.h:43
virtual void filter_rw(CoordinateXY *) const
Performs an operation on coord.
Definition: CoordinateFilter.h:54
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25
virtual void filter_ro(const CoordinateXY *)
Performs an operation with coord.
Definition: CoordinateFilter.h:65