1 // Boost.Geometry (aka GGL, Generic Geometry Library)
3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
5 // This file was modified by Oracle on 2013, 2014, 2015.
6 // Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
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)
14 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATION_INTERFACE_HPP
15 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATION_INTERFACE_HPP
18 #include <boost/geometry/algorithms/detail/relate/interface.hpp>
21 namespace boost { namespace geometry
24 #ifndef DOXYGEN_NO_DETAIL
25 namespace detail { namespace relate
28 template <typename Geometry1, typename Geometry2>
29 struct result_handler_type<Geometry1, Geometry2, geometry::de9im::matrix, false>
31 typedef matrix_handler<geometry::de9im::matrix> type;
35 }} // namespace detail::relate
36 #endif // DOXYGEN_NO_DETAIL
39 namespace resolve_variant
42 template <typename Geometry1, typename Geometry2>
45 template <typename Matrix>
46 static inline Matrix apply(Geometry1 const& geometry1,
47 Geometry2 const& geometry2)
49 concepts::check<Geometry1 const>();
50 concepts::check<Geometry2 const>();
51 assert_dimension_equal<Geometry1, Geometry2>();
53 typename detail::relate::result_handler_type
64 >::apply(geometry1, geometry2, handler);
66 return handler.result();
70 template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
71 struct relation<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
73 template <typename Matrix>
74 struct visitor : boost::static_visitor<Matrix>
76 Geometry2 const& m_geometry2;
78 visitor(Geometry2 const& geometry2)
79 : m_geometry2(geometry2) {}
81 template <typename Geometry1>
82 Matrix operator()(Geometry1 const& geometry1) const
84 return relation<Geometry1, Geometry2>
85 ::template apply<Matrix>(geometry1, m_geometry2);
89 template <typename Matrix>
91 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
92 Geometry2 const& geometry2)
94 return boost::apply_visitor(visitor<Matrix>(geometry2), geometry1);
98 template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
99 struct relation<Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
101 template <typename Matrix>
102 struct visitor : boost::static_visitor<Matrix>
104 Geometry1 const& m_geometry1;
106 visitor(Geometry1 const& geometry1)
107 : m_geometry1(geometry1) {}
109 template <typename Geometry2>
110 Matrix operator()(Geometry2 const& geometry2) const
112 return relation<Geometry1, Geometry2>
113 ::template apply<Matrix>(m_geometry1, geometry2);
117 template <typename Matrix>
119 apply(Geometry1 const& geometry1,
120 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2)
122 return boost::apply_visitor(visitor<Matrix>(geometry1), geometry2);
128 BOOST_VARIANT_ENUM_PARAMS(typename T1),
129 BOOST_VARIANT_ENUM_PARAMS(typename T2)
133 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
134 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
137 template <typename Matrix>
138 struct visitor : boost::static_visitor<Matrix>
140 template <typename Geometry1, typename Geometry2>
141 Matrix operator()(Geometry1 const& geometry1,
142 Geometry2 const& geometry2) const
144 return relation<Geometry1, Geometry2>
145 ::template apply<Matrix>(geometry1, geometry2);
149 template <typename Matrix>
151 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
152 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2)
154 return boost::apply_visitor(visitor<Matrix>(), geometry1, geometry2);
158 } // namespace resolve_variant
162 \brief Calculates the relation between a pair of geometries as defined in DE-9IM.
164 \tparam Geometry1 \tparam_geometry
165 \tparam Geometry2 \tparam_geometry
166 \param geometry1 \param_geometry
167 \param geometry2 \param_geometry
168 \return The DE-9IM matrix expressing the relation between geometries.
170 \qbk{[include reference/algorithms/relation.qbk]}
172 template <typename Geometry1, typename Geometry2>
173 inline de9im::matrix relation(Geometry1 const& geometry1,
174 Geometry2 const& geometry2)
176 return resolve_variant::relation
180 >::template apply<de9im::matrix>(geometry1, geometry2);
184 }} // namespace boost::geometry
186 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_RELATE_INTERFACE_HPP