1// Boost string_algo library trim.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_TRIM_DETAIL_HPP
12#define BOOST_STRING_TRIM_DETAIL_HPP
13
14#include <boost/algorithm/string/config.hpp>
15#include <boost/detail/iterator.hpp>
16
17namespace boost {
18 namespace algorithm {
19 namespace detail {
20
21// trim iterator helper -----------------------------------------------//
22
23 template< typename ForwardIteratorT, typename PredicateT >
24 inline ForwardIteratorT trim_end_iter_select(
25 ForwardIteratorT InBegin,
26 ForwardIteratorT InEnd,
27 PredicateT IsSpace,
28 std::forward_iterator_tag )
29 {
30 ForwardIteratorT TrimIt=InBegin;
31
32 for( ForwardIteratorT It=InBegin; It!=InEnd; ++It )
33 {
34 if ( !IsSpace(*It) )
35 {
36 TrimIt=It;
37 ++TrimIt;
38 }
39 }
40
41 return TrimIt;
42 }
43
44 template< typename ForwardIteratorT, typename PredicateT >
45 inline ForwardIteratorT trim_end_iter_select(
46 ForwardIteratorT InBegin,
47 ForwardIteratorT InEnd,
48 PredicateT IsSpace,
49 std::bidirectional_iterator_tag )
50 {
51 for( ForwardIteratorT It=InEnd; It!=InBegin; )
52 {
53 if ( !IsSpace(*(--It)) )
54 return ++It;
55 }
56
57 return InBegin;
58 }
59 // Search for first non matching character from the beginning of the sequence
60 template< typename ForwardIteratorT, typename PredicateT >
61 inline ForwardIteratorT trim_begin(
62 ForwardIteratorT InBegin,
63 ForwardIteratorT InEnd,
64 PredicateT IsSpace )
65 {
66 ForwardIteratorT It=InBegin;
67 for(; It!=InEnd; ++It )
68 {
69 if (!IsSpace(*It))
70 return It;
71 }
72
73 return It;
74 }
75
76 // Search for first non matching character from the end of the sequence
77 template< typename ForwardIteratorT, typename PredicateT >
78 inline ForwardIteratorT trim_end(
79 ForwardIteratorT InBegin,
80 ForwardIteratorT InEnd,
81 PredicateT IsSpace )
82 {
83 typedef BOOST_STRING_TYPENAME boost::detail::
84 iterator_traits<ForwardIteratorT>::iterator_category category;
85
86 return ::boost::algorithm::detail::trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
87 }
88
89
90 } // namespace detail
91 } // namespace algorithm
92} // namespace boost
93
94
95#endif // BOOST_STRING_TRIM_DETAIL_HPP
96