mirror of
https://github.com/yuzu-emu/ext-boost.git
synced 2024-12-23 03:35:27 +00:00
274 lines
10 KiB
C++
274 lines
10 KiB
C++
// Boost string_algo library find_format_all.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_ALL_DETAIL_HPP
|
|
#define BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP
|
|
|
|
#include <boost/algorithm/string/config.hpp>
|
|
#include <boost/range/iterator_range_core.hpp>
|
|
#include <boost/range/const_iterator.hpp>
|
|
#include <boost/range/value_type.hpp>
|
|
#include <boost/algorithm/string/detail/find_format_store.hpp>
|
|
#include <boost/algorithm/string/detail/replace_storage.hpp>
|
|
|
|
namespace boost {
|
|
namespace algorithm {
|
|
namespace detail {
|
|
|
|
// find_format_all_copy (iterator variant) implementation ---------------------------//
|
|
|
|
template<
|
|
typename OutputIteratorT,
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT,
|
|
typename FormatResultT >
|
|
inline OutputIteratorT find_format_all_copy_impl2(
|
|
OutputIteratorT Output,
|
|
const InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
const FindResultT& FindResult,
|
|
const FormatResultT& FormatResult )
|
|
{
|
|
typedef BOOST_STRING_TYPENAME
|
|
range_const_iterator<InputT>::type input_iterator_type;
|
|
|
|
typedef find_format_store<
|
|
input_iterator_type,
|
|
FormatterT,
|
|
FormatResultT > store_type;
|
|
|
|
// Create store for the find result
|
|
store_type M( FindResult, FormatResult, Formatter );
|
|
|
|
// Initialize last match
|
|
input_iterator_type LastMatch=::boost::begin(Input);
|
|
|
|
// Iterate through all matches
|
|
while( M )
|
|
{
|
|
// Copy the beginning of the sequence
|
|
Output = std::copy( LastMatch, M.begin(), Output );
|
|
// Copy formatted result
|
|
Output = std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output );
|
|
|
|
// Proceed to the next match
|
|
LastMatch=M.end();
|
|
M=Finder( LastMatch, ::boost::end(Input) );
|
|
}
|
|
|
|
// Copy the rest of the sequence
|
|
Output = std::copy( LastMatch, ::boost::end(Input), Output );
|
|
|
|
return Output;
|
|
}
|
|
|
|
template<
|
|
typename OutputIteratorT,
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT >
|
|
inline OutputIteratorT find_format_all_copy_impl(
|
|
OutputIteratorT Output,
|
|
const InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
const FindResultT& FindResult )
|
|
{
|
|
if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
|
|
return ::boost::algorithm::detail::find_format_all_copy_impl2(
|
|
Output,
|
|
Input,
|
|
Finder,
|
|
Formatter,
|
|
FindResult,
|
|
Formatter(FindResult) );
|
|
} else {
|
|
return std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
|
|
}
|
|
}
|
|
|
|
// find_format_all_copy implementation ----------------------------------------------//
|
|
|
|
template<
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT,
|
|
typename FormatResultT >
|
|
inline InputT find_format_all_copy_impl2(
|
|
const InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
const FindResultT& FindResult,
|
|
const FormatResultT& FormatResult)
|
|
{
|
|
typedef BOOST_STRING_TYPENAME
|
|
range_const_iterator<InputT>::type input_iterator_type;
|
|
|
|
typedef find_format_store<
|
|
input_iterator_type,
|
|
FormatterT,
|
|
FormatResultT > store_type;
|
|
|
|
// Create store for the find result
|
|
store_type M( FindResult, FormatResult, Formatter );
|
|
|
|
// Initialize last match
|
|
input_iterator_type LastMatch=::boost::begin(Input);
|
|
|
|
// Output temporary
|
|
InputT Output;
|
|
|
|
// Iterate through all matches
|
|
while( M )
|
|
{
|
|
// Copy the beginning of the sequence
|
|
boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, M.begin() );
|
|
// Copy formatted result
|
|
boost::algorithm::detail::insert( Output, ::boost::end(Output), M.format_result() );
|
|
|
|
// Proceed to the next match
|
|
LastMatch=M.end();
|
|
M=Finder( LastMatch, ::boost::end(Input) );
|
|
}
|
|
|
|
// Copy the rest of the sequence
|
|
::boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) );
|
|
|
|
return Output;
|
|
}
|
|
|
|
template<
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT >
|
|
inline InputT find_format_all_copy_impl(
|
|
const InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
const FindResultT& FindResult)
|
|
{
|
|
if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
|
|
return ::boost::algorithm::detail::find_format_all_copy_impl2(
|
|
Input,
|
|
Finder,
|
|
Formatter,
|
|
FindResult,
|
|
Formatter(FindResult) );
|
|
} else {
|
|
return Input;
|
|
}
|
|
}
|
|
|
|
// find_format_all implementation ------------------------------------------------//
|
|
|
|
template<
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT,
|
|
typename FormatResultT >
|
|
inline void find_format_all_impl2(
|
|
InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
FindResultT FindResult,
|
|
FormatResultT FormatResult)
|
|
{
|
|
typedef BOOST_STRING_TYPENAME
|
|
range_iterator<InputT>::type input_iterator_type;
|
|
typedef find_format_store<
|
|
input_iterator_type,
|
|
FormatterT,
|
|
FormatResultT > store_type;
|
|
|
|
// Create store for the find result
|
|
store_type M( FindResult, FormatResult, Formatter );
|
|
|
|
// Instantiate replacement storage
|
|
std::deque<
|
|
BOOST_STRING_TYPENAME range_value<InputT>::type> Storage;
|
|
|
|
// Initialize replacement iterators
|
|
input_iterator_type InsertIt=::boost::begin(Input);
|
|
input_iterator_type SearchIt=::boost::begin(Input);
|
|
|
|
while( M )
|
|
{
|
|
// process the segment
|
|
InsertIt=process_segment(
|
|
Storage,
|
|
Input,
|
|
InsertIt,
|
|
SearchIt,
|
|
M.begin() );
|
|
|
|
// Adjust search iterator
|
|
SearchIt=M.end();
|
|
|
|
// Copy formatted replace to the storage
|
|
::boost::algorithm::detail::copy_to_storage( Storage, M.format_result() );
|
|
|
|
// Find range for a next match
|
|
M=Finder( SearchIt, ::boost::end(Input) );
|
|
}
|
|
|
|
// process the last segment
|
|
InsertIt=::boost::algorithm::detail::process_segment(
|
|
Storage,
|
|
Input,
|
|
InsertIt,
|
|
SearchIt,
|
|
::boost::end(Input) );
|
|
|
|
if ( Storage.empty() )
|
|
{
|
|
// Truncate input
|
|
::boost::algorithm::detail::erase( Input, InsertIt, ::boost::end(Input) );
|
|
}
|
|
else
|
|
{
|
|
// Copy remaining data to the end of input
|
|
::boost::algorithm::detail::insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() );
|
|
}
|
|
}
|
|
|
|
template<
|
|
typename InputT,
|
|
typename FinderT,
|
|
typename FormatterT,
|
|
typename FindResultT >
|
|
inline void find_format_all_impl(
|
|
InputT& Input,
|
|
FinderT Finder,
|
|
FormatterT Formatter,
|
|
FindResultT FindResult)
|
|
{
|
|
if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
|
|
::boost::algorithm::detail::find_format_all_impl2(
|
|
Input,
|
|
Finder,
|
|
Formatter,
|
|
FindResult,
|
|
Formatter(FindResult) );
|
|
}
|
|
}
|
|
|
|
} // namespace detail
|
|
} // namespace algorithm
|
|
} // namespace boost
|
|
|
|
#endif // BOOST_STRING_FIND_FORMAT_ALL_DETAIL_HPP
|