• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 
5 // Use, modification and distribution is subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
8 
9 #ifndef BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP
10 #define BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP
11 
12 
13 #include <string>
14 
15 #include <boost/tuple/tuple.hpp>
16 #include <boost/geometry/strategies/side_info.hpp>
17 
18 namespace boost { namespace geometry
19 {
20 
21 namespace policies { namespace relate
22 {
23 
24 
25 // "tupled" to return intersection results together.
26 // Now with two, with some meta-programming and derivations it can also be three (or more)
27 template <typename Policy1, typename Policy2>
28 struct segments_tupled
29 {
30     typedef boost::tuple
31         <
32             typename Policy1::return_type,
33             typename Policy2::return_type
34         > return_type;
35 
36     template <typename Segment1, typename Segment2, typename SegmentIntersectionInfo>
segments_crossesboost::geometry::policies::relate::segments_tupled37     static inline return_type segments_crosses(side_info const& sides,
38                     SegmentIntersectionInfo const& sinfo,
39                     Segment1 const& s1, Segment2 const& s2)
40     {
41         return boost::make_tuple
42             (
43                 Policy1::segments_crosses(sides, sinfo, s1, s2),
44                 Policy2::segments_crosses(sides, sinfo, s1, s2)
45             );
46     }
47 
48     template <typename Segment1, typename Segment2, typename Ratio>
segments_collinearboost::geometry::policies::relate::segments_tupled49     static inline return_type segments_collinear(
50                     Segment1 const& segment1, Segment2 const& segment2,
51                     bool opposite,
52                     int pa1, int pa2, int pb1, int pb2,
53                     Ratio const& ra1, Ratio const& ra2,
54                     Ratio const& rb1, Ratio const& rb2)
55     {
56         return boost::make_tuple
57             (
58                 Policy1::segments_collinear(segment1, segment2,
59                                             opposite,
60                                             pa1, pa2, pb1, pb2,
61                                             ra1, ra2, rb1, rb2),
62                 Policy2::segments_collinear(segment1, segment2,
63                                             opposite,
64                                             pa1, pa2, pb1, pb2,
65                                             ra1, ra2, rb1, rb2)
66             );
67     }
68 
69     template <typename Segment>
degenerateboost::geometry::policies::relate::segments_tupled70     static inline return_type degenerate(Segment const& segment,
71                 bool a_degenerate)
72     {
73         return boost::make_tuple
74             (
75                 Policy1::degenerate(segment, a_degenerate),
76                 Policy2::degenerate(segment, a_degenerate)
77             );
78     }
79 
80     template <typename Segment, typename Ratio>
one_degenerateboost::geometry::policies::relate::segments_tupled81     static inline return_type one_degenerate(Segment const& segment,
82             Ratio const& ratio,
83             bool a_degenerate)
84     {
85         return boost::make_tuple
86             (
87                 Policy1::one_degenerate(segment, ratio, a_degenerate),
88                 Policy2::one_degenerate(segment, ratio, a_degenerate)
89             );
90     }
91 
disjointboost::geometry::policies::relate::segments_tupled92     static inline return_type disjoint()
93     {
94         return boost::make_tuple
95             (
96                 Policy1::disjoint(),
97                 Policy2::disjoint()
98             );
99     }
100 
errorboost::geometry::policies::relate::segments_tupled101     static inline return_type error(std::string const& msg)
102     {
103         return boost::make_tuple
104             (
105                 Policy1::error(msg),
106                 Policy2::error(msg)
107             );
108     }
109 
110 };
111 
112 }} // namespace policies::relate
113 
114 }} // namespace boost::geometry
115 
116 #endif // BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP
117