| // Boost string_algo library trim.hpp header file ---------------------------// |
| |
| // Copyright Pavol Droba 2002-2003. |
| // |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| // See http://www.boost.org/ for updates, documentation, and revision history. |
| |
| #ifndef BOOST_STRING_TRIM_HPP |
| #define BOOST_STRING_TRIM_HPP |
| |
| #include <boost/algorithm/string/config.hpp> |
| |
| #include <boost/range/begin.hpp> |
| #include <boost/range/end.hpp> |
| #include <boost/range/const_iterator.hpp> |
| #include <boost/range/as_literal.hpp> |
| #include <boost/range/iterator_range.hpp> |
| |
| #include <boost/algorithm/string/detail/trim.hpp> |
| #include <boost/algorithm/string/classification.hpp> |
| #include <locale> |
| |
| /*! \file |
| Defines trim algorithms. |
| Trim algorithms are used to remove trailing and leading spaces from a |
| sequence (string). Space is recognized using given locales. |
| |
| Parametric (\c _if) variants use a predicate (functor) to select which characters |
| are to be trimmed.. |
| Functions take a selection predicate as a parameter, which is used to determine |
| whether a character is a space. Common predicates are provided in classification.hpp header. |
| |
| */ |
| |
| namespace boost { |
| namespace algorithm { |
| |
| // left trim -----------------------------------------------// |
| |
| |
| //! Left trim - parametric |
| /*! |
| Remove all leading spaces from the input. |
| The supplied predicate is used to determine which characters are considered spaces. |
| The result is a trimmed copy of the input. It is returned as a sequence |
| or copied to the output iterator |
| |
| \param Output An output iterator to which the result will be copied |
| \param Input An input range |
| \param IsSpace An unary predicate identifying spaces |
| \return |
| An output iterator pointing just after the last inserted character or |
| a copy of the input |
| |
| \note The second variant of this function provides the strong exception-safety guarantee |
| */ |
| template<typename OutputIteratorT, typename RangeT, typename PredicateT> |
| inline OutputIteratorT trim_left_copy_if( |
| OutputIteratorT Output, |
| const RangeT& Input, |
| PredicateT IsSpace) |
| { |
| iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input)); |
| |
| std::copy( |
| ::boost::algorithm::detail::trim_begin( |
| ::boost::begin(lit_range), |
| ::boost::end(lit_range), |
| IsSpace ), |
| ::boost::end(lit_range), |
| Output); |
| |
| return Output; |
| } |
| |
| //! Left trim - parametric |
| /*! |
| \overload |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline SequenceT trim_left_copy_if(const SequenceT& Input, PredicateT IsSpace) |
| { |
| return SequenceT( |
| ::boost::algorithm::detail::trim_begin( |
| ::boost::begin(Input), |
| ::boost::end(Input), |
| IsSpace ), |
| ::boost::end(Input)); |
| } |
| |
| //! Left trim - parametric |
| /*! |
| Remove all leading spaces from the input. |
| The result is a trimmed copy of the input. |
| |
| \param Input An input sequence |
| \param Loc a locale used for 'space' classification |
| \return A trimmed copy of the input |
| |
| \note This function provides the strong exception-safety guarantee |
| */ |
| template<typename SequenceT> |
| inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) |
| { |
| return |
| ::boost::algorithm::trim_left_copy_if( |
| Input, |
| is_space(Loc)); |
| } |
| |
| //! Left trim |
| /*! |
| Remove all leading spaces from the input. The supplied predicate is |
| used to determine which characters are considered spaces. |
| The input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param IsSpace An unary predicate identifying spaces |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline void trim_left_if(SequenceT& Input, PredicateT IsSpace) |
| { |
| Input.erase( |
| ::boost::begin(Input), |
| ::boost::algorithm::detail::trim_begin( |
| ::boost::begin(Input), |
| ::boost::end(Input), |
| IsSpace)); |
| } |
| |
| //! Left trim |
| /*! |
| Remove all leading spaces from the input. |
| The Input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param Loc A locale used for 'space' classification |
| */ |
| template<typename SequenceT> |
| inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale()) |
| { |
| ::boost::algorithm::trim_left_if( |
| Input, |
| is_space(Loc)); |
| } |
| |
| // right trim -----------------------------------------------// |
| |
| //! Right trim - parametric |
| /*! |
| Remove all trailing spaces from the input. |
| The supplied predicate is used to determine which characters are considered spaces. |
| The result is a trimmed copy of the input. It is returned as a sequence |
| or copied to the output iterator |
| |
| \param Output An output iterator to which the result will be copied |
| \param Input An input range |
| \param IsSpace An unary predicate identifying spaces |
| \return |
| An output iterator pointing just after the last inserted character or |
| a copy of the input |
| |
| \note The second variant of this function provides the strong exception-safety guarantee |
| */ |
| template<typename OutputIteratorT, typename RangeT, typename PredicateT> |
| inline OutputIteratorT trim_right_copy_if( |
| OutputIteratorT Output, |
| const RangeT& Input, |
| PredicateT IsSpace ) |
| { |
| iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input)); |
| |
| std::copy( |
| ::boost::begin(lit_range), |
| ::boost::algorithm::detail::trim_end( |
| ::boost::begin(lit_range), |
| ::boost::end(lit_range), |
| IsSpace ), |
| Output ); |
| |
| return Output; |
| } |
| |
| //! Right trim - parametric |
| /*! |
| \overload |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline SequenceT trim_right_copy_if(const SequenceT& Input, PredicateT IsSpace) |
| { |
| return SequenceT( |
| ::boost::begin(Input), |
| ::boost::algorithm::detail::trim_end( |
| ::boost::begin(Input), |
| ::boost::end(Input), |
| IsSpace) |
| ); |
| } |
| |
| //! Right trim |
| /*! |
| Remove all trailing spaces from the input. |
| The result is a trimmed copy of the input |
| |
| \param Input An input sequence |
| \param Loc A locale used for 'space' classification |
| \return A trimmed copy of the input |
| |
| \note This function provides the strong exception-safety guarantee |
| */ |
| template<typename SequenceT> |
| inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale()) |
| { |
| return |
| ::boost::algorithm::trim_right_copy_if( |
| Input, |
| is_space(Loc)); |
| } |
| |
| |
| //! Right trim - parametric |
| /*! |
| Remove all trailing spaces from the input. |
| The supplied predicate is used to determine which characters are considered spaces. |
| The input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param IsSpace An unary predicate identifying spaces |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline void trim_right_if(SequenceT& Input, PredicateT IsSpace) |
| { |
| Input.erase( |
| ::boost::algorithm::detail::trim_end( |
| ::boost::begin(Input), |
| ::boost::end(Input), |
| IsSpace ), |
| ::boost::end(Input) |
| ); |
| } |
| |
| |
| //! Right trim |
| /*! |
| Remove all trailing spaces from the input. |
| The input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param Loc A locale used for 'space' classification |
| */ |
| template<typename SequenceT> |
| inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale()) |
| { |
| ::boost::algorithm::trim_right_if( |
| Input, |
| is_space(Loc) ); |
| } |
| |
| // both side trim -----------------------------------------------// |
| |
| //! Trim - parametric |
| /*! |
| Remove all trailing and leading spaces from the input. |
| The supplied predicate is used to determine which characters are considered spaces. |
| The result is a trimmed copy of the input. It is returned as a sequence |
| or copied to the output iterator |
| |
| \param Output An output iterator to which the result will be copied |
| \param Input An input range |
| \param IsSpace An unary predicate identifying spaces |
| \return |
| An output iterator pointing just after the last inserted character or |
| a copy of the input |
| |
| \note The second variant of this function provides the strong exception-safety guarantee |
| */ |
| template<typename OutputIteratorT, typename RangeT, typename PredicateT> |
| inline OutputIteratorT trim_copy_if( |
| OutputIteratorT Output, |
| const RangeT& Input, |
| PredicateT IsSpace) |
| { |
| iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input)); |
| |
| BOOST_STRING_TYPENAME |
| range_const_iterator<RangeT>::type TrimEnd= |
| ::boost::algorithm::detail::trim_end( |
| ::boost::begin(lit_range), |
| ::boost::end(lit_range), |
| IsSpace); |
| |
| std::copy( |
| detail::trim_begin( |
| ::boost::begin(lit_range), TrimEnd, IsSpace), |
| TrimEnd, |
| Output |
| ); |
| |
| return Output; |
| } |
| |
| //! Trim - parametric |
| /*! |
| \overload |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline SequenceT trim_copy_if(const SequenceT& Input, PredicateT IsSpace) |
| { |
| BOOST_STRING_TYPENAME |
| range_const_iterator<SequenceT>::type TrimEnd= |
| ::boost::algorithm::detail::trim_end( |
| ::boost::begin(Input), |
| ::boost::end(Input), |
| IsSpace); |
| |
| return SequenceT( |
| detail::trim_begin( |
| ::boost::begin(Input), |
| TrimEnd, |
| IsSpace), |
| TrimEnd |
| ); |
| } |
| |
| //! Trim |
| /*! |
| Remove all leading and trailing spaces from the input. |
| The result is a trimmed copy of the input |
| |
| \param Input An input sequence |
| \param Loc A locale used for 'space' classification |
| \return A trimmed copy of the input |
| |
| \note This function provides the strong exception-safety guarantee |
| */ |
| template<typename SequenceT> |
| inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() ) |
| { |
| return |
| ::boost::algorithm::trim_copy_if( |
| Input, |
| is_space(Loc) ); |
| } |
| |
| //! Trim |
| /*! |
| Remove all leading and trailing spaces from the input. |
| The supplied predicate is used to determine which characters are considered spaces. |
| The input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param IsSpace An unary predicate identifying spaces |
| */ |
| template<typename SequenceT, typename PredicateT> |
| inline void trim_if(SequenceT& Input, PredicateT IsSpace) |
| { |
| ::boost::algorithm::trim_right_if( Input, IsSpace ); |
| ::boost::algorithm::trim_left_if( Input, IsSpace ); |
| } |
| |
| //! Trim |
| /*! |
| Remove all leading and trailing spaces from the input. |
| The input sequence is modified in-place. |
| |
| \param Input An input sequence |
| \param Loc A locale used for 'space' classification |
| */ |
| template<typename SequenceT> |
| inline void trim(SequenceT& Input, const std::locale& Loc=std::locale()) |
| { |
| ::boost::algorithm::trim_if( |
| Input, |
| is_space( Loc ) ); |
| } |
| |
| } // namespace algorithm |
| |
| // pull names to the boost namespace |
| using algorithm::trim_left; |
| using algorithm::trim_left_if; |
| using algorithm::trim_left_copy; |
| using algorithm::trim_left_copy_if; |
| using algorithm::trim_right; |
| using algorithm::trim_right_if; |
| using algorithm::trim_right_copy; |
| using algorithm::trim_right_copy_if; |
| using algorithm::trim; |
| using algorithm::trim_if; |
| using algorithm::trim_copy; |
| using algorithm::trim_copy_if; |
| |
| } // namespace boost |
| |
| #endif // BOOST_STRING_TRIM_HPP |