stabilize build system: depends, installer, boost/bdb fixes, cross targets groundwork
This commit is contained in:
@@ -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
|
||||
+153
@@ -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
|
||||
+66
@@ -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
|
||||
+136
@@ -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
|
||||
+47
@@ -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
|
||||
+153
@@ -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
|
||||
+215
@@ -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
|
||||
+71
@@ -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
|
||||
+47
@@ -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
|
||||
+47
@@ -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
|
||||
+203
@@ -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
|
||||
+89
@@ -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
|
||||
Reference in New Issue
Block a user