1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2014, Oracle and/or its affiliates. 4 5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 6 7 // Licensed under the Boost Software License version 1.0. 8 // http://www.boost.org/users/license.html 9 10 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP 11 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP 12 13 #include <boost/core/ignore_unused.hpp> 14 15 16 namespace boost { namespace geometry 17 { 18 19 #ifndef DOXYGEN_NO_DETAIL 20 namespace detail 21 { 22 23 // Check whether (each element of) an iterator range satisfies a given 24 // predicate. 25 // The predicate must be implemented as having a static apply unary 26 // method that returns a bool. 27 // By default an empty range is accepted 28 template <typename Predicate, bool AllowEmptyRange = true> 29 struct check_iterator_range 30 { 31 template <typename InputIterator> applyboost::geometry::detail::check_iterator_range32 static inline bool apply(InputIterator first, InputIterator beyond) 33 { 34 for (InputIterator it = first; it != beyond; ++it) 35 { 36 if (! Predicate::apply(*it)) 37 { 38 return false; 39 } 40 } 41 return AllowEmptyRange || first != beyond; 42 } 43 44 45 // version where we can pass a predicate object 46 template <typename InputIterator> applyboost::geometry::detail::check_iterator_range47 static inline bool apply(InputIterator first, 48 InputIterator beyond, 49 Predicate const& predicate) 50 { 51 // in case predicate's apply method is static, MSVC will 52 // complain that predicate is not used 53 boost::ignore_unused(predicate); 54 55 for (InputIterator it = first; it != beyond; ++it) 56 { 57 if (! predicate.apply(*it)) 58 { 59 return false; 60 } 61 } 62 return AllowEmptyRange || first != beyond; 63 } 64 }; 65 66 } // namespace detail 67 #endif // DOXYGEN_NO_DETAIL 68 69 }} // namespace boost::geometry 70 71 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_CHECK_ITERATOR_RANGE_HPP 72