/src/geos/include/geos/geom/CoordinateSequences.h
Line | Count | Source (jump to first uncovered line) |
1 | | /********************************************************************** |
2 | | * |
3 | | * GEOS - Geometry Engine Open Source |
4 | | * http://geos.osgeo.org |
5 | | * |
6 | | * Copyright (C) 2023 ISciences, LLC |
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/geom/Coordinate.h> |
18 | | #include <geos/geom/CoordinateSequence.h> |
19 | | |
20 | | namespace geos { |
21 | | namespace geom { |
22 | | |
23 | | /// |
24 | | /// \brief The CoordinateSequences class provides utility methods to operate |
25 | | /// on CoordinateSequences. Methods that do not benefit from access to the |
26 | | /// CoordinateSequence internals can be placed here. |
27 | | /// |
28 | | class CoordinateSequences { |
29 | | |
30 | | private: |
31 | | template<typename CoordinateType> |
32 | | static constexpr int |
33 | 82.2M | type_pair(const CoordinateType& typ1, const CoordinateType& typ2) { |
34 | 82.2M | return (static_cast<int>(typ1) << 4) | static_cast<int>(typ2); |
35 | 82.2M | } |
36 | | |
37 | | public: |
38 | | /// |
39 | | /// \brief binaryDispatch calls a functor template, explicitly providing the backing types of two CoordinateSequences. The |
40 | | /// CoordinateSequences are not provided to the functor as arguments but can be provided along with any other arguments |
41 | | /// through the `args` argument. |
42 | | template<typename F, class... Args> |
43 | | static void binaryDispatch(const CoordinateSequence& seq1, const CoordinateSequence& seq2, F& fun, Args... args) |
44 | 82.2M | { |
45 | 82.2M | using CoordinateXYZ = Coordinate; |
46 | | |
47 | 82.2M | auto typ1 = seq1.getCoordinateType(); |
48 | 82.2M | auto typ2 = seq2.getCoordinateType(); |
49 | | |
50 | 82.2M | switch(type_pair(typ1, typ2)) { |
51 | 0 | case type_pair(CoordinateType::XY, CoordinateType::XY): fun.template operator()<CoordinateXY, CoordinateXY>(args...); break; |
52 | 0 | case type_pair(CoordinateType::XY, CoordinateType::XYZ): fun.template operator()<CoordinateXY, CoordinateXYZ>(args...); break; |
53 | 0 | case type_pair(CoordinateType::XY, CoordinateType::XYM): fun.template operator()<CoordinateXY, CoordinateXYM>(args...); break; |
54 | 0 | case type_pair(CoordinateType::XY, CoordinateType::XYZM): fun.template operator()<CoordinateXY, CoordinateXYZM>(args...); break; |
55 | | |
56 | 0 | case type_pair(CoordinateType::XYZ, CoordinateType::XY): fun.template operator()<CoordinateXYZ, CoordinateXY>(args...); break; |
57 | 71.8M | case type_pair(CoordinateType::XYZ, CoordinateType::XYZ): fun.template operator()<CoordinateXYZ, CoordinateXYZ>(args...); break; |
58 | 0 | case type_pair(CoordinateType::XYZ, CoordinateType::XYM): fun.template operator()<CoordinateXYZ, CoordinateXYM>(args...); break; |
59 | 1.73M | case type_pair(CoordinateType::XYZ, CoordinateType::XYZM): fun.template operator()<CoordinateXYZ, CoordinateXYZM>(args...); break; |
60 | | |
61 | 0 | case type_pair(CoordinateType::XYM, CoordinateType::XY): fun.template operator()<CoordinateXYM, CoordinateXY>(args...); break; |
62 | 0 | case type_pair(CoordinateType::XYM, CoordinateType::XYZ): fun.template operator()<CoordinateXYM, CoordinateXYZ>(args...); break; |
63 | 0 | case type_pair(CoordinateType::XYM, CoordinateType::XYM): fun.template operator()<CoordinateXYM, CoordinateXYM>(args...); break; |
64 | 0 | case type_pair(CoordinateType::XYM, CoordinateType::XYZM): fun.template operator()<CoordinateXYM, CoordinateXYZM>(args...); break; |
65 | | |
66 | 0 | case type_pair(CoordinateType::XYZM, CoordinateType::XY): fun.template operator()<CoordinateXYZM, CoordinateXY>(args...); break; |
67 | 738k | case type_pair(CoordinateType::XYZM, CoordinateType::XYZ): fun.template operator()<CoordinateXYZM, CoordinateXYZ>(args...); break; |
68 | 0 | case type_pair(CoordinateType::XYZM, CoordinateType::XYM): fun.template operator()<CoordinateXYZM, CoordinateXYM>(args...); break; |
69 | 7.95M | case type_pair(CoordinateType::XYZM, CoordinateType::XYZM): fun.template operator()<CoordinateXYZM, CoordinateXYZM>(args...); break; |
70 | 82.2M | } |
71 | 82.2M | } |
72 | | |
73 | | }; |
74 | | |
75 | | } |
76 | | } |