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
22namespace geos {
23namespace geom { // geos::geom
24
43class GEOS_DLL CoordinateFilter {
44public:
45 virtual
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
107template<class Derived>
108class CoordinateInspector : public CoordinateFilter
109{
110public:
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
117template<class Derived>
118class CoordinateMutator : public CoordinateFilter
119{
120public:
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
Geometry classes support the concept of applying a coordinate filter to every coordinate in the Geome...
Definition CoordinateFilter.h:43
virtual void filter_ro(const CoordinateXY *)
Performs an operation with coord.
Definition CoordinateFilter.h:65
virtual void filter_rw(CoordinateXY *) const
Performs an operation on coord.
Definition CoordinateFilter.h:54
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:216
Basic namespace for all GEOS functionalities.
Definition geos.h:39