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