Chris@102: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@102: Chris@102: // Copyright (c) 2014, Oracle and/or its affiliates. Chris@102: Chris@102: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle Chris@102: Chris@102: // Licensed under the Boost Software License version 1.0. Chris@102: // http://www.boost.org/users/license.html Chris@102: Chris@102: #ifndef BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP Chris@102: #define BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace geometry Chris@102: { Chris@102: Chris@102: #ifndef DOXYGEN_NO_DETAIL Chris@102: namespace detail { namespace num_segments Chris@102: { Chris@102: Chris@102: Chris@102: struct range_count Chris@102: { Chris@102: template Chris@102: static inline std::size_t apply(Range const& range) Chris@102: { Chris@102: std::size_t n = boost::size(range); Chris@102: if ( n <= 1 ) Chris@102: { Chris@102: return 0; Chris@102: } Chris@102: Chris@102: return Chris@102: geometry::closure::value == open Chris@102: ? Chris@102: n Chris@102: : Chris@102: static_cast(n - 1); Chris@102: } Chris@102: }; Chris@102: Chris@102: }} // namespace detail::num_segments Chris@102: #endif // DOXYGEN_NO_DETAIL Chris@102: Chris@102: Chris@102: Chris@102: #ifndef DOXYGEN_NO_DISPATCH Chris@102: namespace dispatch Chris@102: { Chris@102: Chris@102: template ::type> Chris@102: struct num_segments Chris@102: : not_implemented Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::other_count<0> Chris@102: {}; Chris@102: Chris@102: // the number of segments (1-dimensional faces) of the hypercube is Chris@102: // given by the formula: d * 2^(d-1), where d is the dimension of the Chris@102: // hypercube; see also: Chris@102: // http://en.wikipedia.org/wiki/Hypercube Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::other_count Chris@102: < Chris@102: geometry::dimension::value Chris@102: * (1 << (geometry::dimension::value - 1)) Chris@102: > Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::other_count<1> Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::num_segments::range_count Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::num_segments::range_count Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::polygon_count Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::other_count<0> Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::multi_count Chris@102: < Chris@102: num_segments< typename boost::range_value::type> Chris@102: > Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: : detail::counting::multi_count Chris@102: < Chris@102: num_segments< typename boost::range_value::type> Chris@102: > Chris@102: {}; Chris@102: Chris@102: Chris@102: } // namespace dispatch Chris@102: #endif // DOXYGEN_NO_DISPATCH Chris@102: Chris@102: Chris@102: Chris@102: namespace resolve_variant Chris@102: { Chris@102: Chris@102: Chris@102: template Chris@102: struct num_segments Chris@102: { Chris@102: static inline std::size_t apply(Geometry const& geometry) Chris@102: { Chris@102: concept::check(); Chris@102: Chris@102: return dispatch::num_segments::apply(geometry); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct num_segments > Chris@102: { Chris@102: struct visitor: boost::static_visitor Chris@102: { Chris@102: template Chris@102: inline std::size_t operator()(Geometry const& geometry) const Chris@102: { Chris@102: return num_segments::apply(geometry); Chris@102: } Chris@102: }; Chris@102: Chris@102: static inline std::size_t Chris@102: apply(boost::variant const& geometry) Chris@102: { Chris@102: return boost::apply_visitor(visitor(), geometry); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: } // namespace resolve_variant Chris@102: Chris@102: Chris@102: Chris@102: /*! Chris@102: \brief \brief_calc{number of segments} Chris@102: \ingroup num_segments Chris@102: \details \details_calc{num_segments, number of segments}. Chris@102: \tparam Geometry \tparam_geometry Chris@102: \param geometry \param_geometry Chris@102: \return \return_calc{number of segments} Chris@102: Chris@102: \qbk{[include reference/algorithms/num_segments.qbk]} Chris@102: */ Chris@102: template Chris@102: inline std::size_t num_segments(Geometry const& geometry) Chris@102: { Chris@102: return resolve_variant::num_segments::apply(geometry); Chris@102: } Chris@102: Chris@102: Chris@102: Chris@102: }} // namespace boost::geometry Chris@102: Chris@102: #endif // BOOST_GEOMETRY_ALGORITHMS_NUM_SEGMENTS_HPP