You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
287 lines
10 KiB
287 lines
10 KiB
// Boost string_algo library find_format.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_FIND_FORMAT_HPP |
|
#define BOOST_STRING_FIND_FORMAT_HPP |
|
|
|
#include <deque> |
|
#include <boost/detail/iterator.hpp> |
|
#include <boost/range/iterator_range.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/algorithm/string/concept.hpp> |
|
#include <boost/algorithm/string/detail/find_format.hpp> |
|
#include <boost/algorithm/string/detail/find_format_all.hpp> |
|
|
|
/*! \file |
|
Defines generic replace algorithms. Each algorithm replaces |
|
part(s) of the input. The part to be replaced is looked up using a Finder object. |
|
Result of finding is then used by a Formatter object to generate the replacement. |
|
*/ |
|
|
|
namespace boost { |
|
namespace algorithm { |
|
|
|
// generic replace -----------------------------------------------------------------// |
|
|
|
//! Generic replace algorithm |
|
/*! |
|
Use the Finder to search for a substring. Use the Formatter to format |
|
this substring and replace it in the input. |
|
The result is a modified 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 sequence |
|
\param Finder A Finder object used to search for a match to be replaced |
|
\param Formatter A Formatter object used to format a match |
|
\return An output iterator pointing just after the last inserted character or |
|
a modified copy of the input |
|
|
|
\note The second variant of this function provides the strong exception-safety guarantee |
|
*/ |
|
template< |
|
typename OutputIteratorT, |
|
typename RangeT, |
|
typename FinderT, |
|
typename FormatterT> |
|
inline OutputIteratorT find_format_copy( |
|
OutputIteratorT Output, |
|
const RangeT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter ) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> |
|
)); |
|
|
|
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input)); |
|
|
|
return detail::find_format_copy_impl( |
|
Output, |
|
lit_input, |
|
Formatter, |
|
Finder( ::boost::begin(lit_input), ::boost::end(lit_input) ) ); |
|
} |
|
|
|
//! Generic replace algorithm |
|
/*! |
|
\overload |
|
*/ |
|
template< |
|
typename SequenceT, |
|
typename FinderT, |
|
typename FormatterT> |
|
inline SequenceT find_format_copy( |
|
const SequenceT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter ) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
|
|
return detail::find_format_copy_impl( |
|
Input, |
|
Formatter, |
|
Finder(::boost::begin(Input), ::boost::end(Input))); |
|
} |
|
|
|
//! Generic replace algorithm |
|
/*! |
|
Use the Finder to search for a substring. Use the Formatter to format |
|
this substring and replace it in the input. The input is modified in-place. |
|
|
|
\param Input An input sequence |
|
\param Finder A Finder object used to search for a match to be replaced |
|
\param Formatter A Formatter object used to format a match |
|
*/ |
|
template< |
|
typename SequenceT, |
|
typename FinderT, |
|
typename FormatterT> |
|
inline void find_format( |
|
SequenceT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
|
|
detail::find_format_impl( |
|
Input, |
|
Formatter, |
|
Finder(::boost::begin(Input), ::boost::end(Input))); |
|
} |
|
|
|
|
|
// find_format_all generic ----------------------------------------------------------------// |
|
|
|
//! Generic replace all algorithm |
|
/*! |
|
Use the Finder to search for a substring. Use the Formatter to format |
|
this substring and replace it in the input. Repeat this for all matching |
|
substrings. |
|
The result is a modified 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 sequence |
|
\param Finder A Finder object used to search for a match to be replaced |
|
\param Formatter A Formatter object used to format a match |
|
\return An output iterator pointing just after the last inserted character or |
|
a modified copy of the input |
|
|
|
\note The second variant of this function provides the strong exception-safety guarantee |
|
*/ |
|
template< |
|
typename OutputIteratorT, |
|
typename RangeT, |
|
typename FinderT, |
|
typename FormatterT> |
|
inline OutputIteratorT find_format_all_copy( |
|
OutputIteratorT Output, |
|
const RangeT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> |
|
)); |
|
|
|
iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input)); |
|
|
|
return detail::find_format_all_copy_impl( |
|
Output, |
|
lit_input, |
|
Finder, |
|
Formatter, |
|
Finder(::boost::begin(lit_input), ::boost::end(lit_input))); |
|
} |
|
|
|
//! Generic replace all algorithm |
|
/*! |
|
\overload |
|
*/ |
|
template< |
|
typename SequenceT, |
|
typename FinderT, |
|
typename FormatterT > |
|
inline SequenceT find_format_all_copy( |
|
const SequenceT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter ) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
|
|
return detail::find_format_all_copy_impl( |
|
Input, |
|
Finder, |
|
Formatter, |
|
Finder( ::boost::begin(Input), ::boost::end(Input) ) ); |
|
} |
|
|
|
//! Generic replace all algorithm |
|
/*! |
|
Use the Finder to search for a substring. Use the Formatter to format |
|
this substring and replace it in the input. Repeat this for all matching |
|
substrings.The input is modified in-place. |
|
|
|
\param Input An input sequence |
|
\param Finder A Finder object used to search for a match to be replaced |
|
\param Formatter A Formatter object used to format a match |
|
*/ |
|
template< |
|
typename SequenceT, |
|
typename FinderT, |
|
typename FormatterT > |
|
inline void find_format_all( |
|
SequenceT& Input, |
|
FinderT Finder, |
|
FormatterT Formatter ) |
|
{ |
|
// Concept check |
|
BOOST_CONCEPT_ASSERT(( |
|
FinderConcept< |
|
FinderT, |
|
BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
BOOST_CONCEPT_ASSERT(( |
|
FormatterConcept< |
|
FormatterT, |
|
FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> |
|
)); |
|
|
|
detail::find_format_all_impl( |
|
Input, |
|
Finder, |
|
Formatter, |
|
Finder(::boost::begin(Input), ::boost::end(Input))); |
|
|
|
} |
|
|
|
} // namespace algorithm |
|
|
|
// pull the names to the boost namespace |
|
using algorithm::find_format_copy; |
|
using algorithm::find_format; |
|
using algorithm::find_format_all_copy; |
|
using algorithm::find_format_all; |
|
|
|
} // namespace boost |
|
|
|
|
|
#endif // BOOST_STRING_FIND_FORMAT_HPP
|
|
|