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