• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <iterator>
16 
17 namespace boost {
18     namespace algorithm {
19         namespace detail {
20 
21 //  trim iterator helper -----------------------------------------------//
22 
23             template< typename ForwardIteratorT, typename PredicateT >
trim_end_iter_select(ForwardIteratorT InBegin,ForwardIteratorT InEnd,PredicateT IsSpace,std::forward_iterator_tag)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 >
trim_end_iter_select(ForwardIteratorT InBegin,ForwardIteratorT InEnd,PredicateT IsSpace,std::bidirectional_iterator_tag)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 >
trim_begin(ForwardIteratorT InBegin,ForwardIteratorT InEnd,PredicateT IsSpace)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 >
trim_end(ForwardIteratorT InBegin,ForwardIteratorT InEnd,PredicateT IsSpace)78             inline ForwardIteratorT trim_end(
79                 ForwardIteratorT InBegin,
80                 ForwardIteratorT InEnd,
81                 PredicateT IsSpace )
82             {
83                 typedef BOOST_STRING_TYPENAME
84                     std::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