1 //  Boost string_algo library predicate.hpp header file  ---------------------------//
2 
3 //  Copyright Pavol Droba 2002-2003.
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 //    (See accompanying file LICENSE_1_0.txt or copy at
7 //          http://www.boost.org/LICENSE_1_0.txt)
8 
9 //  See http://www.boost.org/ for updates, documentation, and revision history.
10 
11 #ifndef BOOST_STRING_PREDICATE_DETAIL_HPP
12 #define BOOST_STRING_PREDICATE_DETAIL_HPP
13 
14 #include <iterator>
15 #include <boost/algorithm/string/find.hpp>
16 
17 namespace boost {
18     namespace algorithm {
19         namespace detail {
20 
21 //  ends_with predicate implementation ----------------------------------//
22 
23             template<
24                 typename ForwardIterator1T,
25                 typename ForwardIterator2T,
26                 typename PredicateT>
ends_with_iter_select(ForwardIterator1T Begin,ForwardIterator1T End,ForwardIterator2T SubBegin,ForwardIterator2T SubEnd,PredicateT Comp,std::bidirectional_iterator_tag)27             inline bool ends_with_iter_select(
28                 ForwardIterator1T Begin,
29                 ForwardIterator1T End,
30                 ForwardIterator2T SubBegin,
31                 ForwardIterator2T SubEnd,
32                 PredicateT Comp,
33                 std::bidirectional_iterator_tag)
34             {
35                 ForwardIterator1T it=End;
36                 ForwardIterator2T pit=SubEnd;
37                 for(;it!=Begin && pit!=SubBegin;)
38                 {
39                     if( !(Comp(*(--it),*(--pit))) )
40                         return false;
41                 }
42 
43                 return pit==SubBegin;
44             }
45 
46             template<
47                 typename ForwardIterator1T,
48                 typename ForwardIterator2T,
49                 typename PredicateT>
ends_with_iter_select(ForwardIterator1T Begin,ForwardIterator1T End,ForwardIterator2T SubBegin,ForwardIterator2T SubEnd,PredicateT Comp,std::forward_iterator_tag)50             inline bool ends_with_iter_select(
51                 ForwardIterator1T Begin,
52                 ForwardIterator1T End,
53                 ForwardIterator2T SubBegin,
54                 ForwardIterator2T SubEnd,
55                 PredicateT Comp,
56                 std::forward_iterator_tag)
57             {
58                 if ( SubBegin==SubEnd )
59                 {
60                     // empty subsequence check
61                     return true;
62                 }
63 
64                 iterator_range<ForwardIterator1T> Result
65                     =last_finder(
66                         ::boost::make_iterator_range(SubBegin, SubEnd),
67                         Comp)(Begin, End);
68 
69                 return !Result.empty() && Result.end()==End;
70             }
71 
72         } // namespace detail
73     } // namespace algorithm
74 } // namespace boost
75 
76 
77 #endif  // BOOST_STRING_PREDICATE_DETAIL_HPP
78