Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2014-2014. Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/intrusive for documentation. Chris@102: // Chris@102: ////////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP Chris@102: #define BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: namespace boost { Chris@102: namespace intrusive { Chris@102: Chris@102: struct algo_pred_equal Chris@102: { Chris@102: template Chris@102: bool operator()(const T &x, const T &y) const Chris@102: { return x == y; } Chris@102: }; Chris@102: Chris@102: struct algo_pred_less Chris@102: { Chris@102: template Chris@102: bool operator()(const T &x, const T &y) const Chris@102: { return x < y; } Chris@102: }; Chris@102: Chris@102: template Chris@102: bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p) Chris@102: { Chris@102: for (; first1 != last1; ++first1, ++first2) { Chris@102: if (!p(*first1, *first2)) { Chris@102: return false; Chris@102: } Chris@102: } Chris@102: return true; Chris@102: } Chris@102: Chris@102: template Chris@102: bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2) Chris@102: { return (algo_equal)(first1, last1, first2, algo_pred_equal()); } Chris@102: Chris@102: template Chris@102: bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate pred) Chris@102: { Chris@102: for (; first1 != last1 && first2 != last2; ++first1, ++first2) Chris@102: if (!pred(*first1, *first2)) Chris@102: return false; Chris@102: return first1 == last1 && first2 == last2; Chris@102: } Chris@102: Chris@102: template Chris@102: bool algo_equal(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) Chris@102: { return (algo_equal)(first1, last1, first2, last2, algo_pred_equal()); } Chris@102: Chris@102: template Chris@102: bool algo_lexicographical_compare (InputIterator1 first1, InputIterator1 last1, Chris@102: InputIterator2 first2, InputIterator2 last2, Chris@102: BinaryPredicate pred) Chris@102: { Chris@102: while (first1 != last1){ Chris@102: if (first2 == last2 || *first2 < *first1) return false; Chris@102: else if (pred(*first1, *first2)) return true; Chris@102: ++first1; ++first2; Chris@102: } Chris@102: return (first2 != last2); Chris@102: } Chris@102: Chris@102: template Chris@102: bool algo_lexicographical_compare (InputIterator1 first1, InputIterator1 last1, Chris@102: InputIterator2 first2, InputIterator2 last2) Chris@102: { return (algo_lexicographical_compare)(first1, last1, first2, last2, algo_pred_less()); } Chris@102: Chris@102: } //namespace intrusive { Chris@102: } //namespace boost { Chris@102: Chris@102: #endif //#ifndef BOOST_INTRUSIVE_DETAIL_ALGORITHM_HPP