/*

 *

 * Copyright (c) 1998-2002

 * John Maddock

 *

 * Use, modification and distribution are subject to 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)

 *

 */



 /*

  *   LOCATION:    see http://www.boost.org for most recent version.

  *   FILE         regex_format.hpp

  *   VERSION      see <boost/version.hpp>

  *   DESCRIPTION: Provides formatting output routines for search and replace

  *                operations.  Note this is an internal header file included

  *                by regex.hpp, do not include on its own.

  */



#ifndef BOOST_REGEX_V4_REGEX_REPLACE_HPP

#define BOOST_REGEX_V4_REGEX_REPLACE_HPP





namespace boost{



#ifdef BOOST_MSVC

#pragma warning(push)

#pragma warning(disable: 4103)

#endif

#ifdef BOOST_HAS_ABI_HEADERS

#  include BOOST_ABI_PREFIX

#endif

#ifdef BOOST_MSVC

#pragma warning(pop)

#endif



template <class OutputIterator, class BidirectionalIterator, class traits, class charT>

OutputIterator regex_replace(OutputIterator out,

                         BidirectionalIterator first,

                         BidirectionalIterator last,

                         const basic_regex<charT, traits>& e, 

                         const charT* fmt, 

                         match_flag_type flags = match_default)

{

   regex_iterator<BidirectionalIterator, charT, traits> i(first, last, e, flags);

   regex_iterator<BidirectionalIterator, charT, traits> j;

   if(i == j)

   {

      if(!(flags & regex_constants::format_no_copy))

         out = re_detail::copy(first, last, out);

   }

   else

   {

      BidirectionalIterator last_m(first);

      while(i != j)

      {

         if(!(flags & regex_constants::format_no_copy))

            out = re_detail::copy(i->prefix().first, i->prefix().second, out); 

         out = i->format(out, fmt, flags, e);

         last_m = (*i)[0].second;

         if(flags & regex_constants::format_first_only)

            break;

         ++i;

      }

      if(!(flags & regex_constants::format_no_copy))

         out = re_detail::copy(last_m, last, out);

   }

   return out;

}



template <class OutputIterator, class Iterator, class traits, class charT>

inline OutputIterator regex_replace(OutputIterator out,

                         Iterator first,

                         Iterator last,

                         const basic_regex<charT, traits>& e, 

                         const std::basic_string<charT>& fmt,

                         match_flag_type flags = match_default)

{

   return regex_replace(out, first, last, e, fmt.c_str(), flags);

}



template <class traits, class charT>

std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,

                         const basic_regex<charT, traits>& e, 

                         const charT* fmt,

                         match_flag_type flags = match_default)

{

   std::basic_string<charT> result;

   re_detail::string_out_iterator<std::basic_string<charT> > i(result);

   regex_replace(i, s.begin(), s.end(), e, fmt, flags);

   return result;

}



template <class traits, class charT>

std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,

                         const basic_regex<charT, traits>& e, 

                         const std::basic_string<charT>& fmt,

                         match_flag_type flags = match_default)

{

   std::basic_string<charT> result;

   re_detail::string_out_iterator<std::basic_string<charT> > i(result);

   regex_replace(i, s.begin(), s.end(), e, fmt.c_str(), flags);

   return result;

}



#ifdef BOOST_MSVC

#pragma warning(push)

#pragma warning(disable: 4103)

#endif

#ifdef BOOST_HAS_ABI_HEADERS

#  include BOOST_ABI_SUFFIX

#endif

#ifdef BOOST_MSVC

#pragma warning(pop)

#endif



} // namespace boost



#endif  // BOOST_REGEX_V4_REGEX_REPLACE_HPP





