mirror of
https://github.com/boostorg/geometry.git
synced 2025-05-09 23:24:02 +00:00
[geometry] fixed c08 example w.r.t. iterators
[SVN r85294]
This commit is contained in:
parent
1fa129395f
commit
914f558a3c
@ -65,41 +65,59 @@ class my_polygon
|
||||
// Adaption: implement iterator and range-extension, and register with Boost.Geometry
|
||||
|
||||
// 1) implement iterator (const and non-const versions)
|
||||
template <bool IsConst>
|
||||
template<typename MyPolygon>
|
||||
struct custom_iterator : public boost::iterator_facade
|
||||
<
|
||||
custom_iterator<IsConst>,
|
||||
custom_iterator<MyPolygon>,
|
||||
my_point,
|
||||
boost::random_access_traversal_tag,
|
||||
typename boost::geometry::add_const_if_c<IsConst, my_point>::type&
|
||||
typename boost::mpl::if_
|
||||
<
|
||||
boost::is_const<MyPolygon>,
|
||||
my_point const,
|
||||
my_point
|
||||
>::type&
|
||||
>
|
||||
{
|
||||
// Constructor for begin()
|
||||
explicit custom_iterator(typename boost::geometry::add_const_if_c<IsConst, my_polygon>::type& polygon)
|
||||
explicit custom_iterator(MyPolygon& polygon)
|
||||
: m_polygon(&polygon)
|
||||
, m_index(0)
|
||||
{}
|
||||
|
||||
// Constructor for end()
|
||||
explicit custom_iterator(bool, typename boost::geometry::add_const_if_c<IsConst, my_polygon>::type& polygon)
|
||||
explicit custom_iterator(bool, MyPolygon& polygon)
|
||||
: m_polygon(&polygon)
|
||||
, m_index(polygon.point_count())
|
||||
{}
|
||||
|
||||
|
||||
// Default constructor
|
||||
explicit custom_iterator()
|
||||
: m_polygon(NULL)
|
||||
, m_index(-1)
|
||||
{}
|
||||
|
||||
typedef typename boost::mpl::if_
|
||||
<
|
||||
boost::is_const<MyPolygon>,
|
||||
my_point const,
|
||||
my_point
|
||||
>::type my_point_type;
|
||||
|
||||
private:
|
||||
friend class boost::iterator_core_access;
|
||||
|
||||
|
||||
typedef boost::iterator_facade
|
||||
<
|
||||
custom_iterator<IsConst>,
|
||||
custom_iterator<MyPolygon>,
|
||||
my_point,
|
||||
boost::random_access_traversal_tag,
|
||||
typename boost::geometry::add_const_if_c<IsConst, my_point>::type&
|
||||
my_point_type&
|
||||
> facade;
|
||||
|
||||
typename boost::geometry::add_const_if_c<IsConst, my_polygon>::type* m_polygon;
|
||||
MyPolygon* m_polygon;
|
||||
int m_index;
|
||||
|
||||
bool equal(custom_iterator const& other) const
|
||||
@ -134,7 +152,7 @@ private:
|
||||
}
|
||||
|
||||
// const and non-const dereference of this iterator
|
||||
typename boost::geometry::add_const_if_c<IsConst, my_point>::type& dereference() const
|
||||
my_point_type& dereference() const
|
||||
{
|
||||
return m_polygon->get_point(m_index);
|
||||
}
|
||||
@ -150,12 +168,12 @@ namespace boost
|
||||
{
|
||||
template<> struct range_mutable_iterator<my_polygon>
|
||||
{
|
||||
typedef custom_iterator<false> type;
|
||||
typedef custom_iterator<my_polygon> type;
|
||||
};
|
||||
|
||||
template<> struct range_const_iterator<my_polygon>
|
||||
{
|
||||
typedef custom_iterator<true> type;
|
||||
typedef custom_iterator<my_polygon const> type;
|
||||
};
|
||||
|
||||
// RangeEx
|
||||
@ -168,24 +186,24 @@ namespace boost
|
||||
|
||||
|
||||
// 2b) free-standing function for Boost.Range ADP
|
||||
inline custom_iterator<false> range_begin(my_polygon& polygon)
|
||||
inline custom_iterator<my_polygon> range_begin(my_polygon& polygon)
|
||||
{
|
||||
return custom_iterator<false>(polygon);
|
||||
return custom_iterator<my_polygon>(polygon);
|
||||
}
|
||||
|
||||
inline custom_iterator<true> range_begin(my_polygon const& polygon)
|
||||
inline custom_iterator<my_polygon const> range_begin(my_polygon const& polygon)
|
||||
{
|
||||
return custom_iterator<true>(polygon);
|
||||
return custom_iterator<my_polygon const>(polygon);
|
||||
}
|
||||
|
||||
inline custom_iterator<false> range_end(my_polygon& polygon)
|
||||
inline custom_iterator<my_polygon> range_end(my_polygon& polygon)
|
||||
{
|
||||
return custom_iterator<false>(true, polygon);
|
||||
return custom_iterator<my_polygon>(true, polygon);
|
||||
}
|
||||
|
||||
inline custom_iterator<true> range_end(my_polygon const& polygon)
|
||||
inline custom_iterator<my_polygon const> range_end(my_polygon const& polygon)
|
||||
{
|
||||
return custom_iterator<true>(true, polygon);
|
||||
return custom_iterator<my_polygon const>(true, polygon);
|
||||
}
|
||||
|
||||
|
||||
@ -210,6 +228,14 @@ template<> struct resize<my_polygon>
|
||||
}
|
||||
};
|
||||
|
||||
template<> struct clear<my_polygon>
|
||||
{
|
||||
static inline void apply(my_polygon& polygon)
|
||||
{
|
||||
polygon.erase_all();
|
||||
}
|
||||
};
|
||||
|
||||
}}}
|
||||
|
||||
|
||||
@ -225,8 +251,8 @@ BOOST_GEOMETRY_REGISTER_RING(my_polygon)
|
||||
|
||||
void walk_using_iterator(my_polygon const& polygon)
|
||||
{
|
||||
for (custom_iterator<true> it = custom_iterator<true>(polygon);
|
||||
it != custom_iterator<true>(true, polygon);
|
||||
for (custom_iterator<my_polygon const> it = custom_iterator<my_polygon const>(polygon);
|
||||
it != custom_iterator<my_polygon const>(true, polygon);
|
||||
++it)
|
||||
{
|
||||
std::cout << boost::geometry::dsv(*it) << std::endl;
|
||||
|
Loading…
x
Reference in New Issue
Block a user