annotate DEPENDENCIES/generic/include/boost/geometry/policies/relate/tupled.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@16 2
Chris@16 3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
Chris@16 4
Chris@16 5 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 #ifndef BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP
Chris@16 10 #define BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP
Chris@16 11
Chris@16 12
Chris@16 13 #include <string>
Chris@16 14
Chris@16 15 #include <boost/tuple/tuple.hpp>
Chris@16 16 #include <boost/geometry/strategies/side_info.hpp>
Chris@16 17 #include <boost/geometry/util/select_calculation_type.hpp>
Chris@16 18 #include <boost/geometry/util/select_most_precise.hpp>
Chris@16 19
Chris@16 20 namespace boost { namespace geometry
Chris@16 21 {
Chris@16 22
Chris@16 23 namespace policies { namespace relate
Chris@16 24 {
Chris@16 25
Chris@16 26
Chris@16 27 // "tupled" to return intersection results together.
Chris@16 28 // Now with two, with some meta-programming and derivations it can also be three (or more)
Chris@16 29 template <typename Policy1, typename Policy2, typename CalculationType = void>
Chris@16 30 struct segments_tupled
Chris@16 31 {
Chris@16 32 typedef boost::tuple
Chris@16 33 <
Chris@16 34 typename Policy1::return_type,
Chris@16 35 typename Policy2::return_type
Chris@16 36 > return_type;
Chris@16 37
Chris@16 38 // Take segments of first policy, they should be equal
Chris@16 39 typedef typename Policy1::segment_type1 segment_type1;
Chris@16 40 typedef typename Policy1::segment_type2 segment_type2;
Chris@16 41
Chris@16 42 typedef typename select_calculation_type
Chris@16 43 <
Chris@16 44 segment_type1,
Chris@16 45 segment_type2,
Chris@16 46 CalculationType
Chris@16 47 >::type coordinate_type;
Chris@16 48
Chris@16 49 // Get the same type, but at least a double
Chris@16 50 typedef typename select_most_precise<coordinate_type, double>::type rtype;
Chris@16 51
Chris@16 52 template <typename R>
Chris@16 53 static inline return_type segments_intersect(side_info const& sides,
Chris@16 54 R const& r,
Chris@16 55 coordinate_type const& dx1, coordinate_type const& dy1,
Chris@16 56 coordinate_type const& dx2, coordinate_type const& dy2,
Chris@16 57 segment_type1 const& s1, segment_type2 const& s2)
Chris@16 58 {
Chris@16 59 return boost::make_tuple
Chris@16 60 (
Chris@16 61 Policy1::segments_intersect(sides, r,
Chris@16 62 dx1, dy1, dx2, dy2, s1, s2),
Chris@16 63 Policy2::segments_intersect(sides, r,
Chris@16 64 dx1, dy1, dx2, dy2, s1, s2)
Chris@16 65 );
Chris@16 66 }
Chris@16 67
Chris@16 68 static inline return_type collinear_touch(coordinate_type const& x,
Chris@16 69 coordinate_type const& y, int arrival_a, int arrival_b)
Chris@16 70 {
Chris@16 71 return boost::make_tuple
Chris@16 72 (
Chris@16 73 Policy1::collinear_touch(x, y, arrival_a, arrival_b),
Chris@16 74 Policy2::collinear_touch(x, y, arrival_a, arrival_b)
Chris@16 75 );
Chris@16 76 }
Chris@16 77
Chris@16 78 template <typename S>
Chris@16 79 static inline return_type collinear_interior_boundary_intersect(S const& segment,
Chris@16 80 bool a_within_b,
Chris@16 81 int arrival_a, int arrival_b, bool opposite)
Chris@16 82 {
Chris@16 83 return boost::make_tuple
Chris@16 84 (
Chris@16 85 Policy1::collinear_interior_boundary_intersect(segment, a_within_b, arrival_a, arrival_b, opposite),
Chris@16 86 Policy2::collinear_interior_boundary_intersect(segment, a_within_b, arrival_a, arrival_b, opposite)
Chris@16 87 );
Chris@16 88 }
Chris@16 89
Chris@16 90 static inline return_type collinear_a_in_b(segment_type1 const& segment,
Chris@16 91 bool opposite)
Chris@16 92 {
Chris@16 93 return boost::make_tuple
Chris@16 94 (
Chris@16 95 Policy1::collinear_a_in_b(segment, opposite),
Chris@16 96 Policy2::collinear_a_in_b(segment, opposite)
Chris@16 97 );
Chris@16 98 }
Chris@16 99 static inline return_type collinear_b_in_a(segment_type2 const& segment,
Chris@16 100 bool opposite)
Chris@16 101 {
Chris@16 102 return boost::make_tuple
Chris@16 103 (
Chris@16 104 Policy1::collinear_b_in_a(segment, opposite),
Chris@16 105 Policy2::collinear_b_in_a(segment, opposite)
Chris@16 106 );
Chris@16 107 }
Chris@16 108
Chris@16 109
Chris@16 110 static inline return_type collinear_overlaps(
Chris@16 111 coordinate_type const& x1, coordinate_type const& y1,
Chris@16 112 coordinate_type const& x2, coordinate_type const& y2,
Chris@16 113 int arrival_a, int arrival_b, bool opposite)
Chris@16 114 {
Chris@16 115 return boost::make_tuple
Chris@16 116 (
Chris@16 117 Policy1::collinear_overlaps(x1, y1, x2, y2, arrival_a, arrival_b, opposite),
Chris@16 118 Policy2::collinear_overlaps(x1, y1, x2, y2, arrival_a, arrival_b, opposite)
Chris@16 119 );
Chris@16 120 }
Chris@16 121
Chris@16 122 static inline return_type segment_equal(segment_type1 const& s,
Chris@16 123 bool opposite)
Chris@16 124 {
Chris@16 125 return boost::make_tuple
Chris@16 126 (
Chris@16 127 Policy1::segment_equal(s, opposite),
Chris@16 128 Policy2::segment_equal(s, opposite)
Chris@16 129 );
Chris@16 130 }
Chris@16 131
Chris@16 132 static inline return_type degenerate(segment_type1 const& segment,
Chris@16 133 bool a_degenerate)
Chris@16 134 {
Chris@16 135 return boost::make_tuple
Chris@16 136 (
Chris@16 137 Policy1::degenerate(segment, a_degenerate),
Chris@16 138 Policy2::degenerate(segment, a_degenerate)
Chris@16 139 );
Chris@16 140 }
Chris@16 141
Chris@16 142 static inline return_type disjoint()
Chris@16 143 {
Chris@16 144 return boost::make_tuple
Chris@16 145 (
Chris@16 146 Policy1::disjoint(),
Chris@16 147 Policy2::disjoint()
Chris@16 148 );
Chris@16 149 }
Chris@16 150
Chris@16 151 static inline return_type error(std::string const& msg)
Chris@16 152 {
Chris@16 153 return boost::make_tuple
Chris@16 154 (
Chris@16 155 Policy1::error(msg),
Chris@16 156 Policy2::error(msg)
Chris@16 157 );
Chris@16 158 }
Chris@16 159
Chris@16 160 static inline return_type collinear_disjoint()
Chris@16 161 {
Chris@16 162 return boost::make_tuple
Chris@16 163 (
Chris@16 164 Policy1::collinear_disjoint(),
Chris@16 165 Policy2::collinear_disjoint()
Chris@16 166 );
Chris@16 167 }
Chris@16 168
Chris@16 169 };
Chris@16 170
Chris@16 171 }} // namespace policies::relate
Chris@16 172
Chris@16 173 }} // namespace boost::geometry
Chris@16 174
Chris@16 175 #endif // BOOST_GEOMETRY_GEOMETRY_POLICIES_RELATE_TUPLED_HPP