Home | History | Annotate | Download | only in detail
      1 //  Boost string_algo library find_format.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_FIND_FORMAT_DETAIL_HPP
     12 #define BOOST_STRING_FIND_FORMAT_DETAIL_HPP
     13 
     14 #include <boost/algorithm/string/config.hpp>
     15 #include <boost/range/iterator_range.hpp>
     16 #include <boost/range/const_iterator.hpp>
     17 #include <boost/range/iterator.hpp>
     18 #include <boost/algorithm/string/detail/find_format_store.hpp>
     19 #include <boost/algorithm/string/detail/replace_storage.hpp>
     20 
     21 namespace boost {
     22     namespace algorithm {
     23         namespace detail {
     24 
     25 // find_format_copy (iterator variant) implementation -------------------------------//
     26 
     27            template<
     28                 typename OutputIteratorT,
     29                 typename InputT,
     30                 typename FormatterT,
     31                 typename FindResultT,
     32                 typename FormatResultT >
     33             inline OutputIteratorT find_format_copy_impl2(
     34                 OutputIteratorT Output,
     35                 const InputT& Input,
     36                 FormatterT Formatter,
     37                 const FindResultT& FindResult,
     38                 const FormatResultT& FormatResult )
     39             {
     40                 typedef find_format_store<
     41                     BOOST_STRING_TYPENAME
     42                         range_const_iterator<InputT>::type,
     43                         FormatterT,
     44                         FormatResultT > store_type;
     45 
     46                 // Create store for the find result
     47                 store_type M( FindResult, FormatResult, Formatter );
     48 
     49                 if ( !M )
     50                 {
     51                     // Match not found - return original sequence
     52                     Output = std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
     53                     return Output;
     54                 }
     55 
     56                 // Copy the beginning of the sequence
     57                 Output = std::copy( ::boost::begin(Input), ::boost::begin(M), Output );
     58                 // Format find result
     59                 // Copy formated result
     60                 Output = std::copy( ::boost::begin(M.format_result()), ::boost::end(M.format_result()), Output );
     61                 // Copy the rest of the sequence
     62                 Output = std::copy( M.end(), ::boost::end(Input), Output );
     63 
     64                 return Output;
     65             }
     66 
     67             template<
     68                 typename OutputIteratorT,
     69                 typename InputT,
     70                 typename FormatterT,
     71                 typename FindResultT >
     72             inline OutputIteratorT find_format_copy_impl(
     73                 OutputIteratorT Output,
     74                 const InputT& Input,
     75                 FormatterT Formatter,
     76                 const FindResultT& FindResult )
     77             {
     78                 if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
     79                     return ::boost::algorithm::detail::find_format_copy_impl2(
     80                         Output,
     81                         Input,
     82                         Formatter,
     83                         FindResult,
     84                         Formatter(FindResult) );
     85                 } else {
     86                     return std::copy( ::boost::begin(Input), ::boost::end(Input), Output );
     87                 }
     88             }
     89 
     90 
     91 // find_format_copy implementation --------------------------------------------------//
     92 
     93            template<
     94                 typename InputT,
     95                 typename FormatterT,
     96                 typename FindResultT,
     97                 typename FormatResultT >
     98             inline InputT find_format_copy_impl2(
     99                 const InputT& Input,
    100                 FormatterT Formatter,
    101                 const FindResultT& FindResult,
    102                 const FormatResultT& FormatResult)
    103             {
    104                 typedef find_format_store<
    105                     BOOST_STRING_TYPENAME
    106                         range_const_iterator<InputT>::type,
    107                         FormatterT,
    108                         FormatResultT > store_type;
    109 
    110                 // Create store for the find result
    111                 store_type M( FindResult, FormatResult, Formatter );
    112 
    113                 if ( !M )
    114                 {
    115                     // Match not found - return original sequence
    116                     return InputT( Input );
    117                 }
    118 
    119                 InputT Output;
    120                 // Copy the beginning of the sequence
    121                 insert( Output, ::boost::end(Output), ::boost::begin(Input), M.begin() );
    122                 // Copy formated result
    123                 insert( Output, ::boost::end(Output), M.format_result() );
    124                 // Copy the rest of the sequence
    125                 insert( Output, ::boost::end(Output), M.end(), ::boost::end(Input) );
    126 
    127                 return Output;
    128             }
    129 
    130             template<
    131                 typename InputT,
    132                 typename FormatterT,
    133                 typename FindResultT >
    134             inline InputT find_format_copy_impl(
    135                 const InputT& Input,
    136                 FormatterT Formatter,
    137                 const FindResultT& FindResult)
    138             {
    139                 if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
    140                     return ::boost::algorithm::detail::find_format_copy_impl2(
    141                         Input,
    142                         Formatter,
    143                         FindResult,
    144                         Formatter(FindResult) );
    145                 } else {
    146                     return Input;
    147                 }
    148             }
    149 
    150  // replace implementation ----------------------------------------------------//
    151 
    152             template<
    153                 typename InputT,
    154                 typename FormatterT,
    155                 typename FindResultT,
    156                 typename FormatResultT >
    157             inline void find_format_impl2(
    158                 InputT& Input,
    159                 FormatterT Formatter,
    160                 const FindResultT& FindResult,
    161                 const FormatResultT& FormatResult)
    162             {
    163                 typedef find_format_store<
    164                     BOOST_STRING_TYPENAME
    165                         range_iterator<InputT>::type,
    166                         FormatterT,
    167                         FormatResultT > store_type;
    168 
    169                 // Create store for the find result
    170                 store_type M( FindResult, FormatResult, Formatter );
    171 
    172                 if ( !M )
    173                 {
    174                     // Search not found - return original sequence
    175                     return;
    176                 }
    177 
    178                 // Replace match
    179                 ::boost::algorithm::detail::replace( Input, M.begin(), M.end(), M.format_result() );
    180             }
    181 
    182             template<
    183                 typename InputT,
    184                 typename FormatterT,
    185                 typename FindResultT >
    186             inline void find_format_impl(
    187                 InputT& Input,
    188                 FormatterT Formatter,
    189                 const FindResultT& FindResult)
    190             {
    191                 if( ::boost::algorithm::detail::check_find_result(Input, FindResult) ) {
    192                     ::boost::algorithm::detail::find_format_impl2(
    193                         Input,
    194                         Formatter,
    195                         FindResult,
    196                         Formatter(FindResult) );
    197                 }
    198             }
    199 
    200         } // namespace detail
    201     } // namespace algorithm
    202 } // namespace boost
    203 
    204 #endif  // BOOST_STRING_FIND_FORMAT_DETAIL_HPP
    205