1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
4// Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands.
5// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
6
7// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
8// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
9
10// Use, modification and distribution is subject to the Boost Software License,
11// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12// http://www.boost.org/LICENSE_1_0.txt)
13
14#ifndef BOOST_GEOMETRY_CORE_COORDINATE_SYSTEM_HPP
15#define BOOST_GEOMETRY_CORE_COORDINATE_SYSTEM_HPP
16
17
18#include <boost/mpl/assert.hpp>
19
20#include <boost/geometry/core/point_type.hpp>
21#include <boost/geometry/util/bare_type.hpp>
22
23
24namespace boost { namespace geometry
25{
26
27
28namespace traits
29{
30
31/*!
32\brief Traits class defining the coordinate system of a point, important for strategy selection
33\ingroup traits
34\par Geometries:
35 - point
36\par Specializations should provide:
37 - typedef CS type; (cs::cartesian, cs::spherical, etc)
38*/
39template <typename Point, typename Enable = void>
40struct coordinate_system
41{
42 BOOST_MPL_ASSERT_MSG
43 (
44 false, NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE, (types<Point>)
45 );
46};
47
48} // namespace traits
49
50
51
52#ifndef DOXYGEN_NO_DISPATCH
53namespace core_dispatch
54{
55 template <typename GeometryTag, typename G>
56 struct coordinate_system
57 {
58 typedef typename point_type<GeometryTag, G>::type P;
59
60 // Call its own specialization on point-tag
61 typedef typename coordinate_system<point_tag, P>::type type;
62 };
63
64
65 template <typename Point>
66 struct coordinate_system<point_tag, Point>
67 {
68 typedef typename traits::coordinate_system
69 <
70 typename geometry::util::bare_type<Point>::type
71 >::type type;
72 };
73
74
75} // namespace core_dispatch
76#endif
77
78
79/*!
80\brief \brief_meta{type, coordinate system (cartesian\, spherical\, etc), \meta_point_type}
81\tparam Geometry \tparam_geometry
82\ingroup core
83
84\qbk{[include reference/core/coordinate_system.qbk]}
85*/
86template <typename Geometry>
87struct coordinate_system
88{
89 typedef typename core_dispatch::coordinate_system
90 <
91 typename tag<Geometry>::type,
92 typename geometry::util::bare_type<Geometry>::type
93 >::type type;
94};
95
96
97}} // namespace boost::geometry
98
99
100#endif // BOOST_GEOMETRY_CORE_COORDINATE_SYSTEM_HPP
101

source code of boost/boost/geometry/core/coordinate_system.hpp