1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- // 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_CHECK_ITERATOR_RANGE_HPP
- #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP
- #include <boost/core/ignore_unused.hpp>
- namespace boost { namespace geometry
- {
- #ifndef DOXYGEN_NO_DETAIL
- namespace detail
- {
- // Check whether (each element of) an iterator range satisfies a given
- // predicate.
- // The predicate must be implemented as having a static apply unary
- // method that returns a bool.
- // By default an empty range is accepted
- template <typename Predicate, bool AllowEmptyRange = true>
- struct check_iterator_range
- {
- template <typename InputIterator>
- static inline bool apply(InputIterator first, InputIterator beyond)
- {
- for (InputIterator it = first; it != beyond; ++it)
- {
- if (! Predicate::apply(*it))
- {
- return false;
- }
- }
- return AllowEmptyRange || first != beyond;
- }
- // version where we can pass a predicate object
- template <typename InputIterator>
- static inline bool apply(InputIterator first,
- InputIterator beyond,
- Predicate const& predicate)
- {
- // in case predicate's apply method is static, MSVC will
- // complain that predicate is not used
- boost::ignore_unused(predicate);
- for (InputIterator it = first; it != beyond; ++it)
- {
- if (! predicate.apply(*it))
- {
- return false;
- }
- }
- return AllowEmptyRange || first != beyond;
- }
- };
- } // namespace detail
- #endif // DOXYGEN_NO_DETAIL
- }} // namespace boost::geometry
- #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP
|