stabilize build system: depends, installer, boost/bdb fixes, cross targets groundwork

This commit is contained in:
2026-02-24 18:38:47 +00:00
parent da8c28aaeb
commit 65cb2619a7
13106 changed files with 2484322 additions and 1804 deletions
@@ -0,0 +1,70 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_GEOMETRY_ITERATORS_BASE_HPP
#define BOOST_GEOMETRY_ITERATORS_BASE_HPP
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/mpl/if.hpp>
#ifndef DOXYGEN_NO_DETAIL
namespace boost { namespace geometry { namespace detail { namespace iterators
{
template
<
typename DerivedClass,
typename Iterator,
typename TraversalFlag = boost::bidirectional_traversal_tag
>
struct iterator_base
: public boost::iterator_adaptor
<
DerivedClass,
Iterator,
boost::use_default,
typename boost::mpl::if_
<
boost::is_convertible
<
typename boost::iterator_traversal<Iterator>::type,
boost::random_access_traversal_tag
>,
TraversalFlag,
boost::use_default
>::type
>
{
// Define operator cast to Iterator to be able to write things like Iterator it = myit++
inline operator Iterator() const
{
return this->base();
}
/*inline bool operator==(Iterator const& other) const
{
return this->base() == other;
}
inline bool operator!=(Iterator const& other) const
{
return ! operator==(other);
}*/
};
}}}} // namespace boost::geometry::detail::iterators
#endif
#endif // BOOST_GEOMETRY_ITERATORS_BASE_HPP
@@ -0,0 +1,148 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_GEOMETRY_ITERATORS_CLOSING_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_CLOSING_ITERATOR_HPP
#include <boost/range.hpp>
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_categories.hpp>
namespace boost { namespace geometry
{
/*!
\brief Iterator which iterates through a range, but adds first element at end of the range
\tparam Range range on which this class is based on
\ingroup iterators
\note It's const iterator treating the Range as one containing non-mutable elements.
For both "closing_iterator<Range> and "closing_iterator<Range const>
const reference is always returned when dereferenced.
\note This class is normally used from "closeable_view" if Close==true
*/
template <typename Range>
struct closing_iterator
: public boost::iterator_facade
<
closing_iterator<Range>,
typename boost::range_value<Range>::type const,
boost::random_access_traversal_tag
>
{
typedef typename boost::range_difference<Range>::type difference_type;
/// Constructor including the range it is based on
explicit inline closing_iterator(Range& range)
: m_range(&range)
, m_iterator(boost::begin(range))
, m_end(boost::end(range))
, m_size(static_cast<difference_type>(boost::size(range)))
, m_index(0)
{}
/// Constructor to indicate the end of a range
explicit inline closing_iterator(Range& range, bool)
: m_range(&range)
, m_iterator(boost::end(range))
, m_end(boost::end(range))
, m_size(static_cast<difference_type>(boost::size(range)))
, m_index((m_size == 0) ? 0 : m_size + 1)
{}
/// Default constructor
explicit inline closing_iterator()
: m_range(NULL)
, m_size(0)
, m_index(0)
{}
private:
friend class boost::iterator_core_access;
inline typename boost::range_value<Range>::type const& dereference() const
{
return *m_iterator;
}
inline difference_type distance_to(closing_iterator<Range> const& other) const
{
return other.m_index - this->m_index;
}
inline bool equal(closing_iterator<Range> const& other) const
{
return this->m_range == other.m_range
&& this->m_index == other.m_index;
}
inline void increment()
{
if (++m_index < m_size)
{
++m_iterator;
}
else
{
update_iterator();
}
}
inline void decrement()
{
if (m_index-- < m_size)
{
--m_iterator;
}
else
{
update_iterator();
}
}
inline void advance(difference_type n)
{
if (m_index < m_size && m_index + n < m_size)
{
m_index += n;
m_iterator += n;
}
else
{
m_index += n;
update_iterator();
}
}
inline void update_iterator()
{
this->m_iterator = m_index <= m_size
? boost::begin(*m_range) + (m_index % m_size)
: boost::end(*m_range)
;
}
Range* m_range;
typename boost::range_iterator<Range>::type m_iterator;
typename boost::range_iterator<Range>::type m_end;
difference_type m_size;
difference_type m_index;
};
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_CLOSING_ITERATOR_HPP
@@ -0,0 +1,153 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_categories.hpp>
namespace boost { namespace geometry
{
template
<
typename Iterator1,
typename Iterator2,
typename Value,
typename Reference = Value&
>
class concatenate_iterator
: public boost::iterator_facade
<
concatenate_iterator<Iterator1, Iterator2, Value, Reference>,
Value,
boost::bidirectional_traversal_tag,
Reference
>
{
private:
Iterator1 m_it1, m_end1;
Iterator2 m_begin2, m_it2;
public:
typedef Iterator1 first_iterator_type;
typedef Iterator2 second_iterator_type;
// default constructor
concatenate_iterator() {}
// for begin
concatenate_iterator(Iterator1 it1, Iterator1 end1,
Iterator2 begin2, Iterator2 it2)
: m_it1(it1), m_end1(end1), m_begin2(begin2), m_it2(it2)
{}
// for end
concatenate_iterator(Iterator1 end1, Iterator2 begin2, Iterator2 end2)
: m_it1(end1), m_end1(end1), m_begin2(begin2), m_it2(end2)
{}
template
<
typename OtherIt1,
typename OtherIt2,
typename OtherValue,
typename OtherReference
>
concatenate_iterator(concatenate_iterator
<
OtherIt1,
OtherIt2,
OtherValue,
OtherReference
> const& other)
: m_it1(other.m_it1)
, m_end1(other.m_end1)
, m_begin2(other.m_begin2)
, m_it2(other.m_it2)
{
static const bool are_conv
= boost::is_convertible<OtherIt1, Iterator1>::value
&& boost::is_convertible<OtherIt2, Iterator2>::value;
BOOST_MPL_ASSERT_MSG((are_conv),
NOT_CONVERTIBLE,
(types<OtherIt1, OtherIt2>));
}
private:
friend class boost::iterator_core_access;
template <typename It1, typename It2, typename V, typename R>
friend class concatenate_iterator;
inline Reference dereference() const
{
if ( m_it1 == m_end1 )
{
return *m_it2;
}
return *m_it1;
}
template
<
typename OtherIt1,
typename OtherIt2,
typename OtherValue,
typename OtherReference
>
inline bool equal(concatenate_iterator
<
OtherIt1,
OtherIt2,
OtherValue,
OtherReference
> const& other) const
{
return m_it1 == other.m_it1 && m_it2 == other.m_it2;
}
inline void increment()
{
if ( m_it1 == m_end1 )
{
++m_it2;
}
else
{
++m_it1;
}
}
inline void decrement()
{
if ( m_it2 == m_begin2 )
{
--m_it1;
}
else
{
--m_it2;
}
}
};
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_CONCATENATE_ITERATOR_HPP
@@ -0,0 +1,66 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
#include <boost/range.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/if.hpp>
#include <boost/geometry/core/ring_type.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace point_iterator
{
template
<
typename Geometry,
typename Tag = typename tag<Geometry>::type
>
struct inner_range_type
{
typedef typename boost::mpl::if_c
<
!boost::is_const<Geometry>::type::value,
typename boost::range_value<Geometry>::type,
typename boost::range_value<Geometry>::type const
>::type type;
};
template <typename Polygon>
struct inner_range_type<Polygon, polygon_tag>
{
typedef typename boost::mpl::if_c
<
!boost::is_const<Polygon>::type::value,
typename geometry::ring_type<Polygon>::type,
typename geometry::ring_type<Polygon>::type const
>::type type;
};
}} // namespace detail::point_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP
@@ -0,0 +1,136 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
#include <boost/range.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/algorithms/not_implemented.hpp>
#include <boost/geometry/iterators/flatten_iterator.hpp>
#include <boost/geometry/iterators/concatenate_iterator.hpp>
#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
#include <boost/geometry/iterators/detail/point_iterator/value_type.hpp>
#include <boost/geometry/iterators/dispatch/point_iterator.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace point_iterator
{
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct iterator_type
: not_implemented<Geometry>
{};
template <typename Linestring>
struct iterator_type<Linestring, linestring_tag>
{
typedef typename boost::range_iterator<Linestring>::type type;
};
template <typename Ring>
struct iterator_type<Ring, ring_tag>
{
typedef typename boost::range_iterator<Ring>::type type;
};
template <typename Polygon>
class iterator_type<Polygon, polygon_tag>
{
private:
typedef typename inner_range_type<Polygon>::type inner_range;
public:
typedef concatenate_iterator
<
typename boost::range_iterator<inner_range>::type,
flatten_iterator
<
typename boost::range_iterator
<
typename geometry::interior_type<Polygon>::type
>::type,
typename iterator_type<inner_range>::type,
typename value_type<Polygon>::type,
dispatch::points_begin<inner_range>,
dispatch::points_end<inner_range>
>,
typename value_type<Polygon>::type
> type;
};
template <typename MultiPoint>
struct iterator_type<MultiPoint, multi_point_tag>
{
typedef typename boost::range_iterator<MultiPoint>::type type;
};
template <typename MultiLinestring>
class iterator_type<MultiLinestring, multi_linestring_tag>
{
private:
typedef typename inner_range_type<MultiLinestring>::type inner_range;
public:
typedef flatten_iterator
<
typename boost::range_iterator<MultiLinestring>::type,
typename iterator_type<inner_range>::type,
typename value_type<MultiLinestring>::type,
dispatch::points_begin<inner_range>,
dispatch::points_end<inner_range>
> type;
};
template <typename MultiPolygon>
class iterator_type<MultiPolygon, multi_polygon_tag>
{
private:
typedef typename inner_range_type<MultiPolygon>::type inner_range;
public:
typedef flatten_iterator
<
typename boost::range_iterator<MultiPolygon>::type,
typename iterator_type<inner_range>::type,
typename value_type<MultiPolygon>::type,
dispatch::points_begin<inner_range>,
dispatch::points_end<inner_range>
> type;
};
}} // namespace detail::point_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP
@@ -0,0 +1,47 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/if.hpp>
#include <boost/geometry/core/point_type.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace point_iterator
{
template <typename Geometry>
struct value_type
{
typedef typename boost::mpl::if_c
<
!boost::is_const<Geometry>::type::value,
typename geometry::point_type<Geometry>::type,
typename geometry::point_type<Geometry>::type const
>::type type;
};
}} // namespace detail::point_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP
@@ -0,0 +1,153 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
#include <boost/range.hpp>
#include <boost/geometry/core/interior_type.hpp>
#include <boost/geometry/core/point_type.hpp>
#include <boost/geometry/core/ring_type.hpp>
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/algorithms/not_implemented.hpp>
#include <boost/geometry/iterators/concatenate_iterator.hpp>
#include <boost/geometry/iterators/flatten_iterator.hpp>
#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
#include <boost/geometry/iterators/detail/segment_iterator/range_segment_iterator.hpp>
#include <boost/geometry/iterators/detail/segment_iterator/value_type.hpp>
#include <boost/geometry/iterators/dispatch/segment_iterator.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace segment_iterator
{
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct iterator_type
: not_implemented<Geometry>
{};
template <typename Linestring>
struct iterator_type<Linestring, linestring_tag>
{
typedef range_segment_iterator
<
Linestring, typename value_type<Linestring>::type
> type;
};
template <typename Ring>
struct iterator_type<Ring, ring_tag>
{
typedef range_segment_iterator
<
Ring, typename value_type<Ring>::type
> type;
};
template <typename Polygon>
class iterator_type<Polygon, polygon_tag>
{
private:
typedef typename detail::point_iterator::inner_range_type
<
Polygon
>::type inner_range;
public:
typedef concatenate_iterator
<
range_segment_iterator
<
inner_range,
typename value_type<Polygon>::type
>,
flatten_iterator
<
typename boost::range_iterator
<
typename geometry::interior_type<Polygon>::type
>::type,
typename iterator_type<inner_range>::type,
typename value_type<Polygon>::type,
dispatch::segments_begin<inner_range>,
dispatch::segments_end<inner_range>,
typename value_type<Polygon>::type
>,
typename value_type<Polygon>::type,
typename value_type<Polygon>::type
> type;
};
template <typename MultiLinestring>
class iterator_type<MultiLinestring, multi_linestring_tag>
{
private:
typedef typename detail::point_iterator::inner_range_type
<
MultiLinestring
>::type inner_range;
public:
typedef flatten_iterator
<
typename boost::range_iterator<MultiLinestring>::type,
typename iterator_type<inner_range>::type,
typename value_type<MultiLinestring>::type,
dispatch::segments_begin<inner_range>,
dispatch::segments_end<inner_range>,
typename value_type<MultiLinestring>::type
> type;
};
template <typename MultiPolygon>
class iterator_type<MultiPolygon, multi_polygon_tag>
{
private:
typedef typename detail::point_iterator::inner_range_type
<
MultiPolygon
>::type inner_range;
public:
typedef flatten_iterator
<
typename boost::range_iterator<MultiPolygon>::type,
typename iterator_type<inner_range>::type,
typename value_type<MultiPolygon>::type,
dispatch::segments_begin<inner_range>,
dispatch::segments_end<inner_range>,
typename value_type<MultiPolygon>::type
> type;
};
}} // namespace detail::segment_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_ITERATOR_TYPE_HPP
@@ -0,0 +1,215 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/range.hpp>
#include <boost/geometry/core/closure.hpp>
#include <boost/geometry/iterators/closing_iterator.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace segment_iterator
{
template <typename Range, closure_selector Closure = closure<Range>::value>
struct range_iterator_type
{
typedef typename boost::range_iterator<Range>::type type;
};
template <typename Range>
struct range_iterator_type<Range, open>
{
typedef closing_iterator<Range> type;
};
template <typename Range, closure_selector Closure = closure<Range>::value>
struct range_iterator_begin
{
static inline typename range_iterator_type<Range, Closure>::type
apply(Range& range)
{
return boost::begin(range);
}
};
template <typename Range>
struct range_iterator_begin<Range, open>
{
static inline typename range_iterator_type<Range, open>::type
apply(Range& range)
{
return closing_iterator<Range>(range);
}
};
template <typename Range, closure_selector Closure = closure<Range>::value>
struct range_iterator_end
{
static inline typename range_iterator_type<Range, Closure>::type
apply(Range& range)
{
return boost::end(range);
}
};
template <typename Range>
struct range_iterator_end<Range, open>
{
static inline typename range_iterator_type<Range, open>::type
apply(Range& range)
{
return closing_iterator<Range>(range, true);
}
};
template <typename Range, typename Value, typename Reference = Value>
class range_segment_iterator
: public boost::iterator_facade
<
range_segment_iterator<Range, Value, Reference>,
Value,
boost::bidirectional_traversal_tag,
Reference
>
{
static inline bool has_less_than_two_elements(Range const& r)
{
return boost::size(r) < ((closure<Range>::value == open) ? 1u : 2u);
}
public:
typedef typename range_iterator_type<Range>::type iterator_type;
// default constructor
range_segment_iterator()
: m_it(), m_has_less_than_two_elements(false)
{}
// for begin
range_segment_iterator(Range& r)
: m_it(range_iterator_begin<Range>::apply(r))
, m_has_less_than_two_elements(has_less_than_two_elements(r))
{}
// for end
range_segment_iterator(Range& r, bool)
: m_it(range_iterator_end<Range>::apply(r))
, m_has_less_than_two_elements(has_less_than_two_elements(r))
{
if (! m_has_less_than_two_elements)
{
// the range consists of at least two items
--m_it;
}
}
template
<
typename OtherRange,
typename OtherValue,
typename OtherReference
>
range_segment_iterator(range_segment_iterator
<
OtherRange,
OtherValue,
OtherReference
> const& other)
: m_it(other.m_it)
{
typedef typename range_segment_iterator
<
OtherRange, OtherValue, OtherReference
>::iterator_type other_iterator_type;
static const bool are_conv
= boost::is_convertible<other_iterator_type, iterator_type>::value;
BOOST_MPL_ASSERT_MSG((are_conv), NOT_CONVERTIBLE, (types<OtherRange>));
}
private:
friend class boost::iterator_core_access;
template <typename Rng, typename V, typename R>
friend class range_segment_iterator;
inline Reference dereference() const
{
if (m_has_less_than_two_elements)
{
return Reference(*m_it, *m_it);
}
iterator_type next(m_it);
++next;
return Reference(*m_it, *next);
}
template
<
typename OtherRange,
typename OtherValue,
typename OtherReference
>
inline bool equal(range_segment_iterator
<
OtherRange,
OtherValue,
OtherReference
> const& other) const
{
return m_it == other.m_it;
}
inline void increment()
{
++m_it;
}
inline void decrement()
{
--m_it;
}
private:
iterator_type m_it;
bool m_has_less_than_two_elements;
};
}} // namespace detail::segment_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_RANGE_SEGMENT_ITERATOR_HPP
@@ -0,0 +1,71 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014-2015, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
#define BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
#include <iterator>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/geometry/iterators/point_iterator.hpp>
#include <boost/geometry/util/bare_type.hpp>
#include <boost/geometry/geometries/segment.hpp>
#include <boost/geometry/geometries/pointing_segment.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace segment_iterator
{
template <typename Geometry>
struct value_type
{
typedef typename std::iterator_traits
<
geometry::point_iterator<Geometry>
>::reference point_iterator_reference_type;
typedef typename detail::point_iterator::value_type
<
Geometry
>::type point_iterator_value_type;
// If the reference type of the point iterator is not really a
// reference, then dereferencing a point iterator would create
// a temporary object.
// In this case using a pointing_segment to represent the
// dereferenced value of the segment iterator cannot be used, as
// it would store pointers to temporary objects. Instead we use a
// segment, which does a full copy of the temporary objects
// returned by the point iterator.
typedef typename boost::mpl::if_
<
boost::is_reference<point_iterator_reference_type>,
geometry::model::pointing_segment<point_iterator_value_type>,
geometry::model::segment
<
typename geometry::util::bare_type
<
point_iterator_value_type
>::type
>
>::type type;
};
}} // namespace detail::segment_iterator
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_SEGMENT_ITERATOR_VALUE_TYPE_HPP
@@ -0,0 +1,47 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/algorithms/not_implemented.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// dispatch for points_begin
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct points_begin
: not_implemented<Geometry>
{};
// dispatch for points_end
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct points_end
: not_implemented<Geometry>
{};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_HPP
@@ -0,0 +1,47 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
#include <boost/geometry/core/tag.hpp>
#include <boost/geometry/algorithms/not_implemented.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// dispatch for segments_begin
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct segments_begin
: not_implemented<Geometry>
{};
// dispatch for segments_end
template <typename Geometry, typename Tag = typename tag<Geometry>::type>
struct segments_end
: not_implemented<Geometry>
{};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_DISPATCH_SEGMENT_ITERATOR_HPP
@@ -0,0 +1,203 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_GEOMETRY_ITERATORS_EVER_CIRCLING_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_EVER_CIRCLING_ITERATOR_HPP
#include <boost/range.hpp>
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/geometry/iterators/base.hpp>
namespace boost { namespace geometry
{
/*!
\brief Iterator which ever circles through a range
\tparam Iterator iterator on which this class is based on
\ingroup iterators
\details If the iterator arrives at range.end() it restarts from the
beginning. So it has to be stopped in another way.
Don't call for(....; it++) because it will turn in an endless loop
\note Name inspired on David Bowie's
"Chant Of The Ever Circling Skeletal Family"
*/
template <typename Iterator>
struct ever_circling_iterator :
public detail::iterators::iterator_base
<
ever_circling_iterator<Iterator>,
Iterator
>
{
friend class boost::iterator_core_access;
explicit inline ever_circling_iterator(Iterator begin, Iterator end,
bool skip_first = false)
: m_begin(begin)
, m_end(end)
, m_skip_first(skip_first)
{
this->base_reference() = begin;
}
explicit inline ever_circling_iterator(Iterator begin, Iterator end, Iterator start,
bool skip_first = false)
: m_begin(begin)
, m_end(end)
, m_skip_first(skip_first)
{
this->base_reference() = start;
}
/// Navigate to a certain position, should be in [start .. end], if at end
/// it will circle again.
inline void moveto(Iterator it)
{
this->base_reference() = it;
check_end();
}
private:
inline void increment(bool possibly_skip = true)
{
(this->base_reference())++;
check_end(possibly_skip);
}
inline void check_end(bool possibly_skip = true)
{
if (this->base() == this->m_end)
{
this->base_reference() = this->m_begin;
if (m_skip_first && possibly_skip)
{
increment(false);
}
}
}
Iterator m_begin;
Iterator m_end;
bool m_skip_first;
};
template <typename Range>
struct ever_circling_range_iterator
: public boost::iterator_facade
<
ever_circling_range_iterator<Range>,
typename boost::range_value<Range>::type const,
boost::random_access_traversal_tag
>
{
/// Constructor including the range it is based on
explicit inline ever_circling_range_iterator(Range& range)
: m_range(&range)
, m_iterator(boost::begin(range))
, m_size(boost::size(range))
, m_index(0)
{}
/// Default constructor
explicit inline ever_circling_range_iterator()
: m_range(NULL)
, m_size(0)
, m_index(0)
{}
typedef std::ptrdiff_t difference_type;
private:
friend class boost::iterator_core_access;
inline typename boost::range_value<Range>::type const& dereference() const
{
return *m_iterator;
}
inline difference_type distance_to(ever_circling_range_iterator<Range> const& other) const
{
return other.m_index - this->m_index;
}
inline bool equal(ever_circling_range_iterator<Range> const& other) const
{
return this->m_range == other.m_range
&& this->m_index == other.m_index;
}
inline void increment()
{
++m_index;
if (m_index >= 0 && m_index < m_size)
{
++m_iterator;
}
else
{
update_iterator();
}
}
inline void decrement()
{
--m_index;
if (m_index >= 0 && m_index < m_size)
{
--m_iterator;
}
else
{
update_iterator();
}
}
inline void advance(difference_type n)
{
if (m_index >= 0 && m_index < m_size
&& m_index + n >= 0 && m_index + n < m_size)
{
m_index += n;
m_iterator += n;
}
else
{
m_index += n;
update_iterator();
}
}
inline void update_iterator()
{
while (m_index < 0)
{
m_index += m_size;
}
m_index = m_index % m_size;
this->m_iterator = boost::begin(*m_range) + m_index;
}
Range* m_range;
typename boost::range_iterator<Range>::type m_iterator;
difference_type m_size;
difference_type m_index;
};
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_EVER_CIRCLING_ITERATOR_HPP
@@ -0,0 +1,229 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/iterator.hpp>
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/geometry/core/assert.hpp>
namespace boost { namespace geometry
{
template
<
typename OuterIterator,
typename InnerIterator,
typename Value,
typename AccessInnerBegin,
typename AccessInnerEnd,
typename Reference = Value&
>
class flatten_iterator
: public boost::iterator_facade
<
flatten_iterator
<
OuterIterator,
InnerIterator,
Value,
AccessInnerBegin,
AccessInnerEnd,
Reference
>,
Value,
boost::bidirectional_traversal_tag,
Reference
>
{
private:
OuterIterator m_outer_it, m_outer_end;
InnerIterator m_inner_it;
public:
typedef OuterIterator outer_iterator_type;
typedef InnerIterator inner_iterator_type;
// default constructor
flatten_iterator() {}
// for begin
flatten_iterator(OuterIterator outer_it, OuterIterator outer_end)
: m_outer_it(outer_it), m_outer_end(outer_end)
{
advance_through_empty();
}
// for end
flatten_iterator(OuterIterator outer_end)
: m_outer_it(outer_end), m_outer_end(outer_end)
{}
template
<
typename OtherOuterIterator, typename OtherInnerIterator,
typename OtherValue,
typename OtherAccessInnerBegin, typename OtherAccessInnerEnd,
typename OtherReference
>
flatten_iterator(flatten_iterator
<
OtherOuterIterator,
OtherInnerIterator,
OtherValue,
OtherAccessInnerBegin,
OtherAccessInnerEnd,
OtherReference
> const& other)
: m_outer_it(other.m_outer_it),
m_outer_end(other.m_outer_end),
m_inner_it(other.m_inner_it)
{
static const bool are_conv
= boost::is_convertible
<
OtherOuterIterator, OuterIterator
>::value
&& boost::is_convertible
<
OtherInnerIterator, InnerIterator
>::value;
BOOST_MPL_ASSERT_MSG((are_conv),
NOT_CONVERTIBLE,
(types<OtherOuterIterator, OtherInnerIterator>));
}
flatten_iterator& operator=(flatten_iterator const& other)
{
m_outer_it = other.m_outer_it;
m_outer_end = other.m_outer_end;
// avoid assigning an iterator having singular value
if ( other.m_outer_it != other.m_outer_end )
{
m_inner_it = other.m_inner_it;
}
return *this;
}
private:
friend class boost::iterator_core_access;
template
<
typename Outer,
typename Inner,
typename V,
typename InnerBegin,
typename InnerEnd,
typename R
>
friend class flatten_iterator;
static inline bool empty(OuterIterator outer_it)
{
return AccessInnerBegin::apply(*outer_it)
== AccessInnerEnd::apply(*outer_it);
}
inline void advance_through_empty()
{
while ( m_outer_it != m_outer_end && empty(m_outer_it) )
{
++m_outer_it;
}
if ( m_outer_it != m_outer_end )
{
m_inner_it = AccessInnerBegin::apply(*m_outer_it);
}
}
inline Reference dereference() const
{
BOOST_GEOMETRY_ASSERT( m_outer_it != m_outer_end );
BOOST_GEOMETRY_ASSERT( m_inner_it != AccessInnerEnd::apply(*m_outer_it) );
return *m_inner_it;
}
template
<
typename OtherOuterIterator,
typename OtherInnerIterator,
typename OtherValue,
typename OtherAccessInnerBegin,
typename OtherAccessInnerEnd,
typename OtherReference
>
inline bool equal(flatten_iterator
<
OtherOuterIterator,
OtherInnerIterator,
OtherValue,
OtherAccessInnerBegin,
OtherAccessInnerEnd,
OtherReference
> const& other) const
{
if ( m_outer_it != other.m_outer_it )
{
return false;
}
if ( m_outer_it == m_outer_end )
{
return true;
}
return m_inner_it == other.m_inner_it;
}
inline void increment()
{
BOOST_GEOMETRY_ASSERT( m_outer_it != m_outer_end );
BOOST_GEOMETRY_ASSERT( m_inner_it != AccessInnerEnd::apply(*m_outer_it) );
++m_inner_it;
if ( m_inner_it == AccessInnerEnd::apply(*m_outer_it) )
{
++m_outer_it;
advance_through_empty();
}
}
inline void decrement()
{
if ( m_outer_it == m_outer_end
|| m_inner_it == AccessInnerBegin::apply(*m_outer_it) )
{
do
{
--m_outer_it;
}
while ( empty(m_outer_it) );
m_inner_it = AccessInnerEnd::apply(*m_outer_it);
}
--m_inner_it;
}
};
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_FLATTEN_ITERATOR_HPP
@@ -0,0 +1,29 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
#define BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
namespace boost { namespace geometry
{
// free function to test if an iterator range has a single element
template <typename Iterator>
inline bool has_one_element(Iterator first, Iterator beyond)
{
return first != beyond && ++first == beyond;
}
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_HAS_ONE_ELEMENT_HPP
@@ -0,0 +1,308 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/range.hpp>
#include <boost/geometry/core/exterior_ring.hpp>
#include <boost/geometry/core/interior_rings.hpp>
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/iterators/dispatch/point_iterator.hpp>
#include <boost/geometry/iterators/detail/point_iterator/iterator_type.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// specializations for points_begin
template <typename Linestring>
struct points_begin<Linestring, linestring_tag>
{
static inline typename detail::point_iterator::iterator_type
<
Linestring
>::type
apply(Linestring& linestring)
{
return boost::begin(linestring);
}
};
template <typename Ring>
struct points_begin<Ring, ring_tag>
{
static inline typename detail::point_iterator::iterator_type<Ring>::type
apply(Ring& ring)
{
return boost::begin(ring);
}
};
template <typename Polygon>
struct points_begin<Polygon, polygon_tag>
{
typedef typename detail::point_iterator::iterator_type
<
Polygon
>::type return_type;
static inline return_type apply(Polygon& polygon)
{
typedef typename return_type::second_iterator_type flatten_iterator;
return return_type
(boost::begin(geometry::exterior_ring(polygon)),
boost::end(geometry::exterior_ring(polygon)),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
)
);
}
};
template <typename MultiPoint>
struct points_begin<MultiPoint, multi_point_tag>
{
static inline typename detail::point_iterator::iterator_type
<
MultiPoint
>::type
apply(MultiPoint& multipoint)
{
return boost::begin(multipoint);
}
};
template <typename MultiLinestring>
struct points_begin<MultiLinestring, multi_linestring_tag>
{
typedef typename detail::point_iterator::iterator_type
<
MultiLinestring
>::type return_type;
static inline return_type apply(MultiLinestring& multilinestring)
{
return return_type(boost::begin(multilinestring),
boost::end(multilinestring));
}
};
template <typename MultiPolygon>
struct points_begin<MultiPolygon, multi_polygon_tag>
{
typedef typename detail::point_iterator::iterator_type
<
MultiPolygon
>::type return_type;
static inline return_type apply(MultiPolygon& multipolygon)
{
return return_type(boost::begin(multipolygon),
boost::end(multipolygon));
}
};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// specializations for points_end
template <typename Linestring>
struct points_end<Linestring, linestring_tag>
{
static inline typename detail::point_iterator::iterator_type
<
Linestring
>::type
apply(Linestring& linestring)
{
return boost::end(linestring);
}
};
template <typename Ring>
struct points_end<Ring, ring_tag>
{
static inline typename detail::point_iterator::iterator_type<Ring>::type
apply(Ring& ring)
{
return boost::end(ring);
}
};
template <typename Polygon>
struct points_end<Polygon, polygon_tag>
{
typedef typename detail::point_iterator::iterator_type
<
Polygon
>::type return_type;
static inline return_type apply(Polygon& polygon)
{
typedef typename return_type::second_iterator_type flatten_iterator;
return return_type
(boost::end(geometry::exterior_ring(polygon)),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
),
flatten_iterator( boost::end(geometry::interior_rings(polygon)) )
);
}
};
template <typename MultiPoint>
struct points_end<MultiPoint, multi_point_tag>
{
static inline typename detail::point_iterator::iterator_type
<
MultiPoint
>::type
apply(MultiPoint& multipoint)
{
return boost::end(multipoint);
}
};
template <typename MultiLinestring>
struct points_end<MultiLinestring, multi_linestring_tag>
{
typedef typename detail::point_iterator::iterator_type
<
MultiLinestring
>::type return_type;
static inline return_type apply(MultiLinestring& multilinestring)
{
return return_type(boost::end(multilinestring));
}
};
template <typename MultiPolygon>
struct points_end<MultiPolygon, multi_polygon_tag>
{
typedef typename detail::point_iterator::iterator_type
<
MultiPolygon
>::type return_type;
static inline return_type apply(MultiPolygon& multipolygon)
{
return return_type(boost::end(multipolygon));
}
};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
// MK:: need to add doc here
template <typename Geometry>
class point_iterator
: public boost::iterator_adaptor
<
point_iterator<Geometry>,
typename detail::point_iterator::iterator_type<Geometry>::type
>
{
private:
template <typename OtherGeometry> friend class point_iterator;
template <typename G> friend inline point_iterator<G> points_begin(G&);
template <typename G> friend inline point_iterator<G> points_end(G&);
inline point_iterator(typename point_iterator::base_type const& base_it)
: point_iterator::iterator_adaptor_(base_it) {}
public:
inline point_iterator() {}
template <typename OtherGeometry>
inline point_iterator(point_iterator<OtherGeometry> const& other)
: point_iterator::iterator_adaptor_(other.base())
{
static const bool is_conv
= boost::is_convertible<
typename detail::point_iterator::iterator_type
<
OtherGeometry
>::type,
typename detail::point_iterator::iterator_type
<
Geometry
>::type
>::value;
BOOST_MPL_ASSERT_MSG((is_conv),
NOT_CONVERTIBLE,
(point_iterator<OtherGeometry>));
}
};
// MK:: need to add doc here
template <typename Geometry>
inline point_iterator<Geometry>
points_begin(Geometry& geometry)
{
return dispatch::points_begin<Geometry>::apply(geometry);
}
// MK:: need to add doc here
template <typename Geometry>
inline point_iterator<Geometry>
points_end(Geometry& geometry)
{
return dispatch::points_end<Geometry>::apply(geometry);
}
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP
@@ -0,0 +1,89 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
#include <iterator>
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/geometry/iterators/point_iterator.hpp>
namespace boost { namespace geometry
{
// MK:: need to add doc here
template <typename Geometry>
class point_reverse_iterator
: public std::reverse_iterator<point_iterator<Geometry> >
{
private:
typedef std::reverse_iterator<point_iterator<Geometry> > base_type;
template <typename OtherGeometry> friend class point_reverse_iterator;
template <typename G>
friend inline point_reverse_iterator<G> points_rbegin(G&);
template <typename G>
friend inline point_reverse_iterator<G> points_rend(G&);
inline point_reverse_iterator(base_type const& base_it)
: base_type(base_it) {}
public:
inline point_reverse_iterator() {}
template <typename OtherGeometry>
inline
point_reverse_iterator(point_reverse_iterator<OtherGeometry> const& other)
: base_type(other.base())
{
static const bool is_conv = boost::is_convertible
<
std::reverse_iterator<point_iterator<Geometry> >,
std::reverse_iterator<point_iterator<OtherGeometry> >
>::value;
BOOST_MPL_ASSERT_MSG((is_conv),
NOT_CONVERTIBLE,
(point_reverse_iterator<OtherGeometry>));
}
};
// MK:: need to add doc here
template <typename Geometry>
inline point_reverse_iterator<Geometry>
points_rbegin(Geometry& geometry)
{
return std::reverse_iterator
<
point_iterator<Geometry>
>(points_end(geometry));
}
// MK:: need to add doc here
template <typename Geometry>
inline point_reverse_iterator<Geometry>
points_rend(Geometry& geometry)
{
return std::reverse_iterator
<
point_iterator<Geometry>
>(points_begin(geometry));
}
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_POINT_REVERSE_ITERATOR_HPP
@@ -0,0 +1,353 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2014, Oracle and/or its affiliates.
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
#ifndef BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP
#define BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP
#include <boost/mpl/assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/range.hpp>
#include <boost/geometry/core/exterior_ring.hpp>
#include <boost/geometry/core/interior_rings.hpp>
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp>
#include <boost/geometry/iterators/detail/segment_iterator/iterator_type.hpp>
#include <boost/geometry/iterators/dispatch/segment_iterator.hpp>
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// specializations for segments_begin
template <typename Linestring>
struct segments_begin<Linestring, linestring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
Linestring
>::type return_type;
static inline return_type apply(Linestring& linestring)
{
return return_type(linestring);
}
};
template <typename Ring>
struct segments_begin<Ring, ring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
Ring
>::type return_type;
static inline return_type apply(Ring& ring)
{
return return_type(ring);
}
};
template <typename Polygon>
struct segments_begin<Polygon, polygon_tag>
{
typedef typename detail::point_iterator::inner_range_type
<
Polygon
>::type inner_range;
typedef typename detail::segment_iterator::iterator_type
<
Polygon
>::type return_type;
static inline return_type apply(Polygon& polygon)
{
typedef typename return_type::second_iterator_type flatten_iterator;
return return_type
(segments_begin
<
inner_range
>::apply(geometry::exterior_ring(polygon)),
segments_end
<
inner_range
>::apply(geometry::exterior_ring(polygon)),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
)
);
}
};
template <typename MultiLinestring>
struct segments_begin<MultiLinestring, multi_linestring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
MultiLinestring
>::type return_type;
static inline return_type apply(MultiLinestring& multilinestring)
{
return return_type(boost::begin(multilinestring),
boost::end(multilinestring));
}
};
template <typename MultiPolygon>
struct segments_begin<MultiPolygon, multi_polygon_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
MultiPolygon
>::type return_type;
static inline return_type apply(MultiPolygon& multipolygon)
{
return return_type(boost::begin(multipolygon),
boost::end(multipolygon));
}
};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
#ifndef DOXYGEN_NO_DISPATCH
namespace dispatch
{
// specializations for segments_end
template <typename Linestring>
struct segments_end<Linestring, linestring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
Linestring
>::type return_type;
static inline return_type apply(Linestring& linestring)
{
return return_type(linestring, true);
}
};
template <typename Ring>
struct segments_end<Ring, ring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
Ring
>::type return_type;
static inline return_type apply(Ring& ring)
{
return return_type(ring, true);
}
};
template <typename Polygon>
struct segments_end<Polygon, polygon_tag>
{
typedef typename detail::point_iterator::inner_range_type
<
Polygon
>::type inner_range;
typedef typename detail::segment_iterator::iterator_type
<
Polygon
>::type return_type;
static inline return_type apply(Polygon& polygon)
{
typedef typename return_type::second_iterator_type flatten_iterator;
return return_type
(segments_end
<
inner_range
>::apply(geometry::exterior_ring(polygon)),
flatten_iterator(boost::begin(geometry::interior_rings(polygon)),
boost::end(geometry::interior_rings(polygon))
),
flatten_iterator( boost::end(geometry::interior_rings(polygon)) )
);
}
};
template <typename MultiLinestring>
struct segments_end<MultiLinestring, multi_linestring_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
MultiLinestring
>::type return_type;
static inline return_type apply(MultiLinestring& multilinestring)
{
return return_type(boost::end(multilinestring));
}
};
template <typename MultiPolygon>
struct segments_end<MultiPolygon, multi_polygon_tag>
{
typedef typename detail::segment_iterator::iterator_type
<
MultiPolygon
>::type return_type;
static inline return_type apply(MultiPolygon& multipolygon)
{
return return_type(boost::end(multipolygon));
}
};
} // namespace dispatch
#endif // DOXYGEN_NO_DISPATCH
// MK:: need to add doc here
template <typename Geometry>
class segment_iterator
: public detail::segment_iterator::iterator_type<Geometry>::type
{
private:
typedef typename detail::segment_iterator::iterator_type
<
Geometry
>::type base;
inline base const* base_ptr() const
{
return this;
}
template <typename OtherGeometry> friend class segment_iterator;
template <typename G>
friend inline segment_iterator<G const> segments_begin(G const&);
template <typename G>
friend inline segment_iterator<G const> segments_end(G const&);
inline segment_iterator(base const& base_it) : base(base_it) {}
public:
// The following typedef is needed for this iterator to be
// bidirectional.
// Normally we would not have to define this. However, due to the
// fact that the value type of the iterator is not a reference,
// the iterator_facade framework (used to define the base class of
// this iterator) degrades automatically the iterator's category
// to input iterator. With the following typedef we recover the
// correct iterator category.
typedef std::bidirectional_iterator_tag iterator_category;
inline segment_iterator() {}
template <typename OtherGeometry>
inline segment_iterator(segment_iterator<OtherGeometry> const& other)
: base(*other.base_ptr())
{
static const bool is_conv
= boost::is_convertible<
typename detail::segment_iterator::iterator_type
<
OtherGeometry
>::type,
typename detail::segment_iterator::iterator_type<Geometry>::type
>::value;
BOOST_MPL_ASSERT_MSG((is_conv),
NOT_CONVERTIBLE,
(segment_iterator<OtherGeometry>));
}
inline segment_iterator& operator++() // prefix
{
base::operator++();
return *this;
}
inline segment_iterator& operator--() // prefix
{
base::operator--();
return *this;
}
inline segment_iterator operator++(int) // postfix
{
segment_iterator copy(*this);
base::operator++();
return copy;
}
inline segment_iterator operator--(int) // postfix
{
segment_iterator copy(*this);
base::operator--();
return copy;
}
};
// MK:: need to add doc here
template <typename Geometry>
inline segment_iterator<Geometry const>
segments_begin(Geometry const& geometry)
{
return dispatch::segments_begin<Geometry const>::apply(geometry);
}
// MK:: need to add doc here
template <typename Geometry>
inline segment_iterator<Geometry const>
segments_end(Geometry const& geometry)
{
return dispatch::segments_end<Geometry const>::apply(geometry);
}
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ITERATORS_SEGMENT_ITERATOR_HPP