os/ossrv/ossrv_pub/boost_apis/boost/regex/mfc.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /*
     2  *
     3  * Copyright (c) 2004
     4  * John Maddock
     5  *
     6  * Use, modification and distribution are subject to the 
     7  * Boost Software License, Version 1.0. (See accompanying file 
     8  * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
     9  *
    10  */
    11 
    12  /*
    13   *   LOCATION:    see http://www.boost.org for most recent version.
    14   *   FILE         mfc.hpp
    15   *   VERSION      see <boost/version.hpp>
    16   *   DESCRIPTION: Overloads and helpers for using MFC/ATL string types with Boost.Regex.
    17   */
    18 
    19 #ifndef BOOST_REGEX_MFC_HPP
    20 #define BOOST_REGEX_MFC_HPP
    21 
    22 #include <atlsimpstr.h>
    23 #include <boost/regex.hpp>
    24 
    25 namespace boost{
    26 
    27 //
    28 // define the types used for TCHAR's:
    29 typedef basic_regex<TCHAR> tregex;
    30 typedef match_results<TCHAR const*> tmatch;
    31 typedef regex_iterator<TCHAR const*> tregex_iterator;
    32 typedef regex_token_iterator<TCHAR const*> tregex_token_iterator;
    33 
    34 #if _MSC_VER >= 1310
    35 #define SIMPLE_STRING_PARAM class B, bool b
    36 #define SIMPLE_STRING_ARG_LIST B, b
    37 #else
    38 #define SIMPLE_STRING_PARAM class B
    39 #define SIMPLE_STRING_ARG_LIST B
    40 #endif
    41 
    42 //
    43 // define regex creation functions:
    44 //
    45 template <SIMPLE_STRING_PARAM>
    46 inline basic_regex<B> 
    47 make_regex(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, ::boost::regex_constants::syntax_option_type f = boost::regex_constants::normal)
    48 {
    49    basic_regex<B> result(s.GetString(), s.GetString() + s.GetLength(), f);
    50    return result;
    51 }
    52 //
    53 // regex_match overloads:
    54 //
    55 template <SIMPLE_STRING_PARAM, class A, class T>
    56 inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
    57                  match_results<const B*, A>& what,
    58                  const basic_regex<B, T>& e,
    59                  boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
    60 {
    61    return ::boost::regex_match(s.GetString(),
    62                                s.GetString() + s.GetLength(),
    63                                what,
    64                                e,
    65                                f);
    66 }
    67 
    68 template <SIMPLE_STRING_PARAM, class T>
    69 inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
    70                  const basic_regex<B, T>& e,
    71                  boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
    72 {
    73    return ::boost::regex_match(s.GetString(),
    74                                s.GetString() + s.GetLength(),
    75                                e,
    76                                f);
    77 }
    78 //
    79 // regex_search overloads:
    80 //
    81 template <SIMPLE_STRING_PARAM, class A, class T>
    82 inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
    83                  match_results<const B*, A>& what,
    84                  const basic_regex<B, T>& e,
    85                  boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
    86 {
    87    return ::boost::regex_search(s.GetString(),
    88                                s.GetString() + s.GetLength(),
    89                                what,
    90                                e,
    91                                f);
    92 }
    93 
    94 template <SIMPLE_STRING_PARAM, class T>
    95 inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
    96                  const basic_regex<B, T>& e,
    97                  boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
    98 {
    99    return ::boost::regex_search(s.GetString(),
   100                                s.GetString() + s.GetLength(),
   101                                e,
   102                                f);
   103 }
   104 //
   105 // regex_iterator creation:
   106 //
   107 template <SIMPLE_STRING_PARAM>
   108 inline regex_iterator<B const*> 
   109 make_regex_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
   110 {
   111    regex_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, f);
   112    return result;
   113 }
   114 
   115 template <SIMPLE_STRING_PARAM>
   116 inline regex_token_iterator<B const*> 
   117    make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, int sub = 0, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
   118 {
   119    regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, sub, f);
   120    return result;
   121 }
   122 
   123 template <SIMPLE_STRING_PARAM>
   124 inline regex_token_iterator<B const*> 
   125 make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, const std::vector<int>& subs, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
   126 {
   127    regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f);
   128    return result;
   129 }
   130 
   131 template <SIMPLE_STRING_PARAM, std::size_t N>
   132 inline regex_token_iterator<B const*> 
   133 make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, const int (& subs)[N], ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
   134 {
   135    regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f);
   136    return result;
   137 }
   138 
   139 template <class OutputIterator, class BidirectionalIterator, class traits,
   140           SIMPLE_STRING_PARAM>
   141 OutputIterator regex_replace(OutputIterator out,
   142                            BidirectionalIterator first,
   143                            BidirectionalIterator last,
   144                            const basic_regex<B, traits>& e,
   145                            const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt,
   146                            match_flag_type flags = match_default)
   147 {
   148    return ::boost::regex_replace(out, first, last, e, fmt.GetString(), flags);
   149 }
   150 
   151 namespace re_detail{
   152 
   153 template <SIMPLE_STRING_PARAM>
   154 class mfc_string_out_iterator
   155 {
   156    ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>* out;
   157 public:
   158    mfc_string_out_iterator(ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s) : out(&s) {}
   159    mfc_string_out_iterator& operator++() { return *this; }
   160    mfc_string_out_iterator& operator++(int) { return *this; }
   161    mfc_string_out_iterator& operator*() { return *this; }
   162    mfc_string_out_iterator& operator=(B v) 
   163    { 
   164       out->AppendChar(v); 
   165       return *this; 
   166    }
   167    typedef std::ptrdiff_t difference_type;
   168    typedef B value_type;
   169    typedef value_type* pointer;
   170    typedef value_type& reference;
   171    typedef std::output_iterator_tag iterator_category;
   172 };
   173 
   174 }
   175 
   176 template <class traits, SIMPLE_STRING_PARAM>
   177 ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> regex_replace(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
   178                             const basic_regex<B, traits>& e,
   179                             const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt,
   180                             match_flag_type flags = match_default)
   181 {
   182    ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> result(s.GetManager());
   183    re_detail::mfc_string_out_iterator<SIMPLE_STRING_ARG_LIST> i(result);
   184    regex_replace(i, s.GetString(), s.GetString() + s.GetLength(), e, fmt.GetString(), flags);
   185    return result;
   186 }
   187 
   188 } // namespace boost.
   189 
   190 #endif