/usr/include/boost/geometry/algorithms/detail/overlay
Edit: /usr/include/boost/geometry/algorithms/detail/overlay/get_ring.hpp (3700B)
// Boost.Geometry (aka GGL, Generic Geometry Library)
// Copyright (c) 2007-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_ALGORITHMS_DETAIL_OVERLAY_GET_RING_HPP
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_RING_HPP
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace boost { namespace geometry
{
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace overlay
{
template
struct get_ring
{};
// A range of rings (multi-ring but that does not exist)
// gets the "void" tag and is dispatched here.
template<>
struct get_ring
{
template
static inline typename boost::range_value::type const&
apply(ring_identifier const& id, Range const& container)
{
return range::at(container, id.multi_index);
}
};
template<>
struct get_ring
{
template
static inline Ring const& apply(ring_identifier const& , Ring const& ring)
{
return ring;
}
};
template<>
struct get_ring
{
template
static inline Box const& apply(ring_identifier const& ,
Box const& box)
{
return box;
}
};
template<>
struct get_ring
{
template
static inline typename ring_return_type::type const apply(
ring_identifier const& id,
Polygon const& polygon)
{
BOOST_GEOMETRY_ASSERT
(
id.ring_index >= -1
&& id.ring_index < int(boost::size(interior_rings(polygon)))
);
return id.ring_index < 0
? exterior_ring(polygon)
: range::at(interior_rings(polygon), id.ring_index);
}
};
template<>
struct get_ring
{
template
static inline typename ring_type::type const& apply(
ring_identifier const& id,
MultiPolygon const& multi_polygon)
{
BOOST_GEOMETRY_ASSERT
(
id.multi_index >= 0
&& id.multi_index < int(boost::size(multi_polygon))
);
return get_ring::apply(id,
range::at(multi_polygon, id.multi_index));
}
};
template
inline std::size_t segment_count_on_ring(Geometry const& geometry,
segment_identifier const& seg_id)
{
typedef typename geometry::tag::type tag;
ring_identifier const rid(0, seg_id.multi_index, seg_id.ring_index);
// A closed polygon, a triangle of 4 points, including starting point,
// contains 3 segments. So handle as if closed and subtract one.
return geometry::num_points(detail::overlay::get_ring::apply(rid, geometry), true) - 1;
}
}} // namespace detail::overlay
#endif // DOXYGEN_NO_DETAIL
}} // namespace boost::geometry
#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_GET_RING_HPP