1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. 4 // Copyright (c) 2008-2015 Bruno Lalande, Paris, France. 5 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. 6 // Copyright (c) 2014-2015 Samuel Debionne, Grenoble, France. 7 8 // This file was modified by Oracle on 2015. 9 // Modifications copyright (c) 2015, Oracle and/or its affiliates. 10 11 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 12 13 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library 14 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. 15 16 // Distributed under the Boost Software License, Version 1.0. 17 // (See accompanying file LICENSE_1_0.txt or copy at 18 // http://www.boost.org/LICENSE_1_0.txt) 19 20 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_INDEXED_HPP 21 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_INDEXED_HPP 22 23 #include <cstddef> 24 25 #include <boost/geometry/core/access.hpp> 26 #include <boost/geometry/core/tags.hpp> 27 28 #include <boost/geometry/util/select_coordinate_type.hpp> 29 30 #include <boost/geometry/strategies/compare.hpp> 31 #include <boost/geometry/policies/compare.hpp> 32 33 #include <boost/geometry/algorithms/dispatch/expand.hpp> 34 35 36 namespace boost { namespace geometry 37 { 38 39 #ifndef DOXYGEN_NO_DETAIL 40 namespace detail { namespace expand 41 { 42 43 44 template 45 < 46 typename StrategyLess, typename StrategyGreater, 47 std::size_t Index, 48 std::size_t Dimension, std::size_t DimensionCount 49 > 50 struct indexed_loop 51 { 52 template <typename Box, typename Geometry> applyboost::geometry::detail::expand::indexed_loop53 static inline void apply(Box& box, Geometry const& source) 54 { 55 typedef typename strategy::compare::detail::select_strategy 56 < 57 StrategyLess, 1, Box, Dimension 58 >::type less_type; 59 60 typedef typename strategy::compare::detail::select_strategy 61 < 62 StrategyGreater, -1, Box, Dimension 63 >::type greater_type; 64 65 typedef typename select_coordinate_type 66 < 67 Box, 68 Geometry 69 >::type coordinate_type; 70 71 less_type less; 72 greater_type greater; 73 74 coordinate_type const coord = get<Index, Dimension>(source); 75 76 if (less(coord, get<min_corner, Dimension>(box))) 77 { 78 set<min_corner, Dimension>(box, coord); 79 } 80 81 if (greater(coord, get<max_corner, Dimension>(box))) 82 { 83 set<max_corner, Dimension>(box, coord); 84 } 85 86 indexed_loop 87 < 88 StrategyLess, StrategyGreater, 89 Index, Dimension + 1, DimensionCount 90 >::apply(box, source); 91 } 92 }; 93 94 95 template 96 < 97 typename StrategyLess, typename StrategyGreater, 98 std::size_t Index, std::size_t DimensionCount 99 > 100 struct indexed_loop 101 < 102 StrategyLess, StrategyGreater, 103 Index, DimensionCount, DimensionCount 104 > 105 { 106 template <typename Box, typename Geometry> applyboost::geometry::detail::expand::indexed_loop107 static inline void apply(Box&, Geometry const&) {} 108 }; 109 110 111 112 // Changes a box such that the other box is also contained by the box 113 template 114 < 115 std::size_t Dimension, std::size_t DimensionCount, 116 typename StrategyLess, typename StrategyGreater 117 > 118 struct expand_indexed 119 { 120 template <typename Box, typename Geometry> applyboost::geometry::detail::expand::expand_indexed121 static inline void apply(Box& box, Geometry const& geometry) 122 { 123 indexed_loop 124 < 125 StrategyLess, StrategyGreater, 126 0, Dimension, DimensionCount 127 >::apply(box, geometry); 128 129 indexed_loop 130 < 131 StrategyLess, StrategyGreater, 132 1, Dimension, DimensionCount 133 >::apply(box, geometry); 134 } 135 }; 136 137 138 }} // namespace detail::expand 139 #endif // DOXYGEN_NO_DETAIL 140 141 142 }} // namespace boost::geometry 143 144 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_INDEXED_HPP 145