/usr/include/boost/geometry/geometries/adapted/boost_polygon
Edit: /usr/include/boost/geometry/geometries/adapted/boost_polygon/holes_proxy.hpp (6015B)
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2010-2012 Barend Gehrels, 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_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP
#define BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP
// Adapts Geometries from Boost.Polygon for usage in Boost.Geometry
// boost::polygon::polygon_with_holes_data -> boost::geometry::polygon
// pair{begin_holes, begin_holes} -> interior_proxy
#include
#include
#include
namespace boost { namespace geometry
{
namespace adapt { namespace bp
{
// Polygon should implement the boost::polygon::polygon_with_holes_concept
// Specify constness in the template parameter if necessary
template
struct holes_proxy
{
typedef ring_proxy
<
typename boost::mpl::if_
<
typename boost::is_const,
Polygon const,
Polygon
>::type
> proxy_type;
typedef hole_iterator iterator_type;
// The next line does not work probably because coordinate_type is part of the
// polygon_traits, but not of the polygon_with_holes_traits
// typedef typename boost::polygon::polygon_traits::coordinate_type coordinate_type;
// So we use:
typedef typename Polygon::coordinate_type coordinate_type;
inline holes_proxy(Polygon& p)
: polygon(p)
{}
inline void clear()
{
Polygon empty;
// Clear the holes
polygon.set_holes
(
boost::polygon::begin_holes(empty),
boost::polygon::end_holes(empty)
);
}
inline void resize(std::size_t new_size)
{
std::vector > temporary_copy
(
boost::polygon::begin_holes(polygon),
boost::polygon::end_holes(polygon)
);
temporary_copy.resize(new_size);
polygon.set_holes(temporary_copy.begin(), temporary_copy.end());
}
template
inline void push_back(Ring const& ring)
{
std::vector > temporary_copy
(
boost::polygon::begin_holes(polygon),
boost::polygon::end_holes(polygon)
);
boost::polygon::polygon_data added;
boost::polygon::set_points(added, ring.begin(), ring.end());
temporary_copy.push_back(added);
polygon.set_holes(temporary_copy.begin(), temporary_copy.end());
}
Polygon& polygon;
};
// Support holes_proxy for Boost.Range ADP
// Const versions
template
inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type
range_begin(boost::geometry::adapt::bp::holes_proxy const& proxy)
{
typename boost::geometry::adapt::bp::holes_proxy::iterator_type
begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon));
return begin;
}
template
inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type
range_end(boost::geometry::adapt::bp::holes_proxy const& proxy)
{
typename boost::geometry::adapt::bp::holes_proxy::iterator_type
end(proxy.polygon, boost::polygon::end_holes(proxy.polygon));
return end;
}
// Mutable versions
template
inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type
range_begin(boost::geometry::adapt::bp::holes_proxy& proxy)
{
typename boost::geometry::adapt::bp::holes_proxy::iterator_type
begin(proxy.polygon, boost::polygon::begin_holes(proxy.polygon));
return begin;
}
template
inline typename boost::geometry::adapt::bp::holes_proxy::iterator_type
range_end(boost::geometry::adapt::bp::holes_proxy& proxy)
{
typename boost::geometry::adapt::bp::holes_proxy::iterator_type
end(proxy.polygon, boost::polygon::end_holes(proxy.polygon));
return end;
}
}}
namespace traits
{
template
struct rvalue_type >
{
typedef adapt::bp::holes_proxy type;
};
template
struct clear >
{
static inline void apply(adapt::bp::holes_proxy proxy)
{
proxy.clear();
}
};
template
struct resize >
{
static inline void apply(adapt::bp::holes_proxy proxy, std::size_t new_size)
{
proxy.resize(new_size);
}
};
template
struct push_back >
{
template
static inline void apply(adapt::bp::holes_proxy proxy, Ring const& ring)
{
proxy.push_back(ring);
}
};
} // namespace traits
}}
// Specialize holes_proxy for Boost.Range
namespace boost
{
template
struct range_mutable_iterator >
{
typedef typename geometry::adapt::bp::holes_proxy::iterator_type type;
};
template
struct range_const_iterator >
{
typedef typename geometry::adapt::bp::holes_proxy::iterator_type type;
};
} // namespace boost
#endif // BOOST_GEOMETRY_GEOMETRIES_ADAPTED_BOOST_POLYGON_HOLES_PROXY_HPP