Chris@16: // Boost string_algo library predicate.hpp header file ---------------------------// Chris@16: Chris@16: // Copyright Pavol Droba 2002-2003. Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/ for updates, documentation, and revision history. Chris@16: Chris@16: #ifndef BOOST_STRING_PREDICATE_DETAIL_HPP Chris@16: #define BOOST_STRING_PREDICATE_DETAIL_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace algorithm { Chris@16: namespace detail { Chris@16: Chris@16: // ends_with predicate implementation ----------------------------------// Chris@16: Chris@16: template< Chris@16: typename ForwardIterator1T, Chris@16: typename ForwardIterator2T, Chris@16: typename PredicateT> Chris@16: inline bool ends_with_iter_select( Chris@16: ForwardIterator1T Begin, Chris@16: ForwardIterator1T End, Chris@16: ForwardIterator2T SubBegin, Chris@16: ForwardIterator2T SubEnd, Chris@16: PredicateT Comp, Chris@16: std::bidirectional_iterator_tag) Chris@16: { Chris@16: ForwardIterator1T it=End; Chris@16: ForwardIterator2T pit=SubEnd; Chris@16: for(;it!=Begin && pit!=SubBegin;) Chris@16: { Chris@16: if( !(Comp(*(--it),*(--pit))) ) Chris@16: return false; Chris@16: } Chris@16: Chris@16: return pit==SubBegin; Chris@16: } Chris@16: Chris@16: template< Chris@16: typename ForwardIterator1T, Chris@16: typename ForwardIterator2T, Chris@16: typename PredicateT> Chris@16: inline bool ends_with_iter_select( Chris@16: ForwardIterator1T Begin, Chris@16: ForwardIterator1T End, Chris@16: ForwardIterator2T SubBegin, Chris@16: ForwardIterator2T SubEnd, Chris@16: PredicateT Comp, Chris@16: std::forward_iterator_tag) Chris@16: { Chris@16: if ( SubBegin==SubEnd ) Chris@16: { Chris@16: // empty subsequence check Chris@16: return true; Chris@16: } Chris@16: Chris@16: iterator_range Result Chris@16: =last_finder( Chris@16: ::boost::make_iterator_range(SubBegin, SubEnd), Chris@16: Comp)(Begin, End); Chris@16: Chris@16: return !Result.empty() && Result.end()==End; Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace algorithm Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: #endif // BOOST_STRING_PREDICATE_DETAIL_HPP