1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | |
3 | // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. |
4 | // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. |
5 | // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. |
6 | |
7 | // This file was modified by Oracle on 2014. |
8 | // Modifications copyright (c) 2014 Oracle and/or its affiliates. |
9 | |
10 | // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle |
11 | |
12 | // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library |
13 | // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. |
14 | |
15 | // Use, modification and distribution is subject to the Boost Software License, |
16 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
17 | // http://www.boost.org/LICENSE_1_0.txt) |
18 | |
19 | #ifndef BOOST_GEOMETRY_CORE_TAGS_HPP |
20 | #define BOOST_GEOMETRY_CORE_TAGS_HPP |
21 | |
22 | |
23 | namespace boost { namespace geometry |
24 | { |
25 | |
26 | // Tags defining strategies linked to coordinate systems |
27 | |
28 | /// Tag used for casting spherical/geographic coordinate systems |
29 | struct spherical_tag {}; |
30 | |
31 | |
32 | /// Tag indicating Cartesian coordinate system family (cartesian,epsg) |
33 | struct cartesian_tag {}; |
34 | |
35 | /// Tag indicating Spherical polar coordinate system family |
36 | struct spherical_polar_tag : spherical_tag {}; |
37 | |
38 | /// Tag indicating Spherical equatorial coordinate system family |
39 | struct spherical_equatorial_tag : spherical_tag {}; |
40 | |
41 | /// Tag indicating Geographic coordinate system family (geographic) |
42 | struct geographic_tag : spherical_tag {}; |
43 | |
44 | |
45 | // Tags defining coordinate systems reference models |
46 | |
47 | /// For reference spheroid defining parameters of geographical coordinate system |
48 | struct srs_spheroid_tag {}; |
49 | |
50 | /// For reference sphere defining parameters of spherical coordinate system |
51 | struct srs_sphere_tag : srs_spheroid_tag {}; |
52 | |
53 | |
54 | // Tags defining tag hierarchy |
55 | |
56 | /// For single-geometries (point, linestring, polygon, box, ring, segment) |
57 | struct single_tag {}; |
58 | |
59 | |
60 | /// For multiple-geometries (multi_point, multi_linestring, multi_polygon) |
61 | struct multi_tag {}; |
62 | |
63 | /// For point-like types (point, multi_point) |
64 | struct pointlike_tag {}; |
65 | |
66 | /// For linear types (linestring, multi-linestring, segment) |
67 | struct linear_tag {}; |
68 | |
69 | /// For areal types (polygon, multi_polygon, box, ring) |
70 | struct areal_tag {}; |
71 | |
72 | // Subset of areal types (polygon, multi_polygon, ring) |
73 | struct polygonal_tag : areal_tag {}; |
74 | |
75 | /// For volume types (also box (?), polyhedron) |
76 | struct volumetric_tag {}; |
77 | |
78 | |
79 | // Tags defining geometry types |
80 | |
81 | |
82 | /// "default" tag |
83 | struct geometry_not_recognized_tag {}; |
84 | |
85 | /// OGC Point identifying tag |
86 | struct point_tag : single_tag, pointlike_tag {}; |
87 | |
88 | /// OGC Linestring identifying tag |
89 | struct linestring_tag : single_tag, linear_tag {}; |
90 | |
91 | /// OGC Polygon identifying tag |
92 | struct polygon_tag : single_tag, polygonal_tag {}; |
93 | |
94 | /// Convenience (linear) ring identifying tag |
95 | struct ring_tag : single_tag, polygonal_tag {}; |
96 | |
97 | /// Convenience 2D or 3D box (mbr / aabb) identifying tag |
98 | struct box_tag : single_tag, areal_tag {}; |
99 | |
100 | /// Convenience segment (2-points) identifying tag |
101 | struct segment_tag : single_tag, linear_tag {}; |
102 | |
103 | |
104 | /// OGC Multi point identifying tag |
105 | struct multi_point_tag : multi_tag, pointlike_tag {}; |
106 | |
107 | /// OGC Multi linestring identifying tag |
108 | struct multi_linestring_tag : multi_tag, linear_tag {}; |
109 | |
110 | /// OGC Multi polygon identifying tag |
111 | struct multi_polygon_tag : multi_tag, polygonal_tag {}; |
112 | |
113 | /// OGC Geometry Collection identifying tag |
114 | struct geometry_collection_tag : multi_tag {}; |
115 | |
116 | |
117 | /*! |
118 | \brief Meta-function to get for a tag of a multi-geometry |
119 | the tag of the corresponding single-geometry |
120 | */ |
121 | template <typename Tag> |
122 | struct single_tag_of |
123 | {}; |
124 | |
125 | #ifndef DOXYGEN_NO_DETAIL |
126 | |
127 | template <> |
128 | struct single_tag_of<multi_point_tag> |
129 | { |
130 | typedef point_tag type; |
131 | }; |
132 | |
133 | template <> |
134 | struct single_tag_of<multi_linestring_tag> |
135 | { |
136 | typedef linestring_tag type; |
137 | }; |
138 | |
139 | template <> |
140 | struct single_tag_of<multi_polygon_tag> |
141 | { |
142 | typedef polygon_tag type; |
143 | }; |
144 | |
145 | #endif |
146 | |
147 | |
148 | }} // namespace boost::geometry |
149 | |
150 | #endif // BOOST_GEOMETRY_CORE_TAGS_HPP |
151 | |