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