123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // 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_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
- #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
- #include <cstddef>
- #include <algorithm>
- #include <boost/range.hpp>
- namespace boost { namespace geometry
- {
- #ifndef DOXYGEN_NO_DETAIL
- namespace detail
- {
- // returns the number of distinct values in the range;
- // return values are 0u through MaximumNumber, where MaximumNumber
- // corresponds to MaximumNumber or more distinct values
- //
- // FUTURE: take into account topologically closed ranges;
- // add appropriate template parameter(s) to control whether
- // the closing point for topologically closed ranges is to be
- // accounted for separately or not
- template
- <
- typename Range,
- std::size_t MaximumNumber,
- bool AllowDuplicates /* true */,
- typename NotEqualTo
- >
- struct num_distinct_consecutive_points
- {
- static inline std::size_t apply(Range const& range)
- {
- typedef typename boost::range_iterator<Range const>::type iterator;
- std::size_t const size = boost::size(range);
- if ( size < 2u )
- {
- return (size < MaximumNumber) ? size : MaximumNumber;
- }
- iterator current = boost::begin(range);
- std::size_t counter(0);
- do
- {
- ++counter;
- iterator next = std::find_if(current,
- boost::end(range),
- NotEqualTo(*current));
- current = next;
- }
- while ( current != boost::end(range) && counter <= MaximumNumber );
- return counter;
- }
- };
- template <typename Range, std::size_t MaximumNumber, typename NotEqualTo>
- struct num_distinct_consecutive_points<Range, MaximumNumber, false, NotEqualTo>
- {
- static inline std::size_t apply(Range const& range)
- {
- std::size_t const size = boost::size(range);
- return (size < MaximumNumber) ? size : MaximumNumber;
- }
- };
- } // namespace detail
- #endif // DOXYGEN_NO_DETAIL
- }} // namespace boost::geometry
- #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_NUM_DISTINCT_CONSECUTIVE_POINTS_HPP
|