summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/envelope/range.hpp
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:22:41 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2019-12-05 15:22:41 +0900
commit3c1df2168531ad5580076ae08d529054689aeedd (patch)
tree941aff6f86393eecacddfec252a8508c7e8351c9 /boost/geometry/algorithms/detail/envelope/range.hpp
parentd6a306e745acfee00e81ccaf3324a2a03516db41 (diff)
downloadboost-3c1df2168531ad5580076ae08d529054689aeedd.tar.gz
boost-3c1df2168531ad5580076ae08d529054689aeedd.tar.bz2
boost-3c1df2168531ad5580076ae08d529054689aeedd.zip
Imported Upstream version 1.70.0upstream/1.70.0
Diffstat (limited to 'boost/geometry/algorithms/detail/envelope/range.hpp')
-rw-r--r--boost/geometry/algorithms/detail/envelope/range.hpp112
1 files changed, 26 insertions, 86 deletions
diff --git a/boost/geometry/algorithms/detail/envelope/range.hpp b/boost/geometry/algorithms/detail/envelope/range.hpp
index b5591f61ab..2d33600d0f 100644
--- a/boost/geometry/algorithms/detail/envelope/range.hpp
+++ b/boost/geometry/algorithms/detail/envelope/range.hpp
@@ -4,11 +4,12 @@
// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
-// This file was modified by Oracle on 2015, 2016.
-// Modifications copyright (c) 2015-2016, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2015, 2016, 2018.
+// Modifications copyright (c) 2015-2018, Oracle and/or its affiliates.
// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
@@ -23,23 +24,17 @@
#include <iterator>
#include <vector>
-#include <boost/range.hpp>
-
-#include <boost/geometry/core/coordinate_dimension.hpp>
-
-#include <boost/geometry/util/range.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
#include <boost/geometry/algorithms/is_empty.hpp>
#include <boost/geometry/algorithms/detail/envelope/initialize.hpp>
-#include <boost/geometry/algorithms/detail/envelope/range_of_boxes.hpp>
-
#include <boost/geometry/algorithms/detail/expand/box.hpp>
#include <boost/geometry/algorithms/detail/expand/point.hpp>
#include <boost/geometry/algorithms/detail/expand/segment.hpp>
-#include <boost/geometry/algorithms/dispatch/envelope.hpp>
-
+#include <boost/geometry/core/coordinate_dimension.hpp>
namespace boost { namespace geometry
{
@@ -53,7 +48,7 @@ namespace detail { namespace envelope
struct envelope_range
{
template <typename Iterator, typename Box, typename Strategy>
- static inline void apply(Iterator first,
+ static inline void apply(Iterator it,
Iterator last,
Box& mbr,
Strategy const& strategy)
@@ -63,16 +58,21 @@ struct envelope_range
// initialize MBR
initialize<Box, 0, dimension<Box>::value>::apply(mbr);
- Iterator it = first;
if (it != last)
{
// initialize box with first element in range
- dispatch::envelope<value_type>::apply(*it, mbr, strategy);
+ dispatch::envelope
+ <
+ value_type
+ >::apply(*it, mbr, strategy.get_element_envelope_strategy());
// consider now the remaining elements in the range (if any)
for (++it; it != last; ++it)
{
- dispatch::expand<Box, value_type>::apply(mbr, *it, strategy);
+ dispatch::expand
+ <
+ Box, value_type
+ >::apply(mbr, *it, strategy.get_element_expand_strategy());
}
}
}
@@ -80,7 +80,7 @@ struct envelope_range
template <typename Range, typename Box, typename Strategy>
static inline void apply(Range const& range, Box& mbr, Strategy const& strategy)
{
- return apply(boost::begin(range), boost::end(range), mbr, strategy);
+ return apply(Strategy::begin(range), Strategy::end(range), mbr, strategy);
}
};
@@ -94,86 +94,26 @@ struct envelope_multi_range
Box& mbr,
Strategy const& strategy)
{
- typedef typename boost::range_iterator
- <
- MultiRange const
- >::type iterator_type;
-
- bool initialized = false;
- for (iterator_type it = boost::begin(multirange);
- it != boost::end(multirange);
- ++it)
- {
- if (! geometry::is_empty(*it))
- {
- if (initialized)
- {
- Box helper_mbr;
- EnvelopePolicy::apply(*it, helper_mbr, strategy);
-
- dispatch::expand<Box, Box>::apply(mbr, helper_mbr, strategy);
- }
- else
- {
- // compute the initial envelope
- EnvelopePolicy::apply(*it, mbr, strategy);
- initialized = true;
- }
- }
- }
-
- if (! initialized)
- {
- // if not already initialized, initialize MBR
- initialize<Box, 0, dimension<Box>::value>::apply(mbr);
- }
+ apply(boost::begin(multirange), boost::end(multirange), mbr, strategy);
}
-};
-
-// implementation for multi-range on a spheroid (longitude is periodic)
-template <typename EnvelopePolicy>
-struct envelope_multi_range_on_spheroid
-{
- template <typename MultiRange, typename Box, typename Strategy>
- static inline void apply(MultiRange const& multirange,
+ template <typename Iter, typename Box, typename Strategy>
+ static inline void apply(Iter it,
+ Iter last,
Box& mbr,
Strategy const& strategy)
{
- typedef typename boost::range_iterator
- <
- MultiRange const
- >::type iterator_type;
-
- // due to the periodicity of longitudes we need to compute the boxes
- // of all the single geometries and keep them in a container
- std::vector<Box> boxes;
- for (iterator_type it = boost::begin(multirange);
- it != boost::end(multirange);
- ++it)
+ typename Strategy::template multi_state<Box> state;
+ for (; it != last; ++it)
{
if (! geometry::is_empty(*it))
{
- Box helper_box;
- EnvelopePolicy::apply(*it, helper_box, strategy);
- boxes.push_back(helper_box);
+ Box helper_mbr;
+ EnvelopePolicy::apply(*it, helper_mbr, strategy);
+ state.apply(helper_mbr);
}
}
-
- // now we need to compute the envelope of the range of boxes
- // (cannot be done in an incremental fashion as in the
- // Cartesian coordinate system)
- // if all single geometries are empty no boxes have been found
- // and the MBR is simply initialized
- if (! boxes.empty())
- {
- envelope_range_of_boxes::apply(boxes, mbr, strategy);
- }
- else
- {
- initialize<Box, 0, dimension<Box>::value>::apply(mbr);
- }
-
+ state.result(mbr);
}
};