summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/check_iterator_range.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/check_iterator_range.hpp')
-rw-r--r--boost/geometry/algorithms/detail/check_iterator_range.hpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/boost/geometry/algorithms/detail/check_iterator_range.hpp b/boost/geometry/algorithms/detail/check_iterator_range.hpp
new file mode 100644
index 0000000000..09ea7f79a0
--- /dev/null
+++ b/boost/geometry/algorithms/detail/check_iterator_range.hpp
@@ -0,0 +1,71 @@
+// 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