imgtools/imglib/boostlibrary/boost/regex/mfc.hpp
changeset 600 6d08f4a05d93
equal deleted inserted replaced
599:fa7a3cc6effd 600:6d08f4a05d93
       
     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