/* | |
* | |
* Copyright (c) 2004 | |
* 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 mfc.hpp | |
* VERSION see <boost/version.hpp> | |
* DESCRIPTION: Overloads and helpers for using MFC/ATL string types with Boost.Regex. | |
*/ | |
#ifndef BOOST_REGEX_MFC_HPP | |
#define BOOST_REGEX_MFC_HPP | |
#include <atlsimpstr.h> | |
#include <boost/regex.hpp> | |
namespace boost{ | |
// | |
// define the types used for TCHAR's: | |
typedef basic_regex<TCHAR> tregex; | |
typedef match_results<TCHAR const*> tmatch; | |
typedef regex_iterator<TCHAR const*> tregex_iterator; | |
typedef regex_token_iterator<TCHAR const*> tregex_token_iterator; | |
#if _MSC_VER >= 1310 | |
#define SIMPLE_STRING_PARAM class B, bool b | |
#define SIMPLE_STRING_ARG_LIST B, b | |
#else | |
#define SIMPLE_STRING_PARAM class B | |
#define SIMPLE_STRING_ARG_LIST B | |
#endif | |
// | |
// define regex creation functions: | |
// | |
template <SIMPLE_STRING_PARAM> | |
inline basic_regex<B> | |
make_regex(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, ::boost::regex_constants::syntax_option_type f = boost::regex_constants::normal) | |
{ | |
basic_regex<B> result(s.GetString(), s.GetString() + s.GetLength(), f); | |
return result; | |
} | |
// | |
// regex_match overloads: | |
// | |
template <SIMPLE_STRING_PARAM, class A, class T> | |
inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, | |
match_results<const B*, A>& what, | |
const basic_regex<B, T>& e, | |
boost::regex_constants::match_flag_type f = boost::regex_constants::match_default) | |
{ | |
return ::boost::regex_match(s.GetString(), | |
s.GetString() + s.GetLength(), | |
what, | |
e, | |
f); | |
} | |
template <SIMPLE_STRING_PARAM, class T> | |
inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, | |
const basic_regex<B, T>& e, | |
boost::regex_constants::match_flag_type f = boost::regex_constants::match_default) | |
{ | |
return ::boost::regex_match(s.GetString(), | |
s.GetString() + s.GetLength(), | |
e, | |
f); | |
} | |
// | |
// regex_search overloads: | |
// | |
template <SIMPLE_STRING_PARAM, class A, class T> | |
inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, | |
match_results<const B*, A>& what, | |
const basic_regex<B, T>& e, | |
boost::regex_constants::match_flag_type f = boost::regex_constants::match_default) | |
{ | |
return ::boost::regex_search(s.GetString(), | |
s.GetString() + s.GetLength(), | |
what, | |
e, | |
f); | |
} | |
template <SIMPLE_STRING_PARAM, class T> | |
inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, | |
const basic_regex<B, T>& e, | |
boost::regex_constants::match_flag_type f = boost::regex_constants::match_default) | |
{ | |
return ::boost::regex_search(s.GetString(), | |
s.GetString() + s.GetLength(), | |
e, | |
f); | |
} | |
// | |
// regex_iterator creation: | |
// | |
template <SIMPLE_STRING_PARAM> | |
inline regex_iterator<B const*> | |
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) | |
{ | |
regex_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, f); | |
return result; | |
} | |
template <SIMPLE_STRING_PARAM> | |
inline regex_token_iterator<B const*> | |
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) | |
{ | |
regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, sub, f); | |
return result; | |
} | |
template <SIMPLE_STRING_PARAM> | |
inline regex_token_iterator<B const*> | |
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) | |
{ | |
regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f); | |
return result; | |
} | |
template <SIMPLE_STRING_PARAM, std::size_t N> | |
inline regex_token_iterator<B const*> | |
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) | |
{ | |
regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f); | |
return result; | |
} | |
template <class OutputIterator, class BidirectionalIterator, class traits, | |
SIMPLE_STRING_PARAM> | |
OutputIterator regex_replace(OutputIterator out, | |
BidirectionalIterator first, | |
BidirectionalIterator last, | |
const basic_regex<B, traits>& e, | |
const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt, | |
match_flag_type flags = match_default) | |
{ | |
return ::boost::regex_replace(out, first, last, e, fmt.GetString(), flags); | |
} | |
namespace re_detail{ | |
template <SIMPLE_STRING_PARAM> | |
class mfc_string_out_iterator | |
{ | |
ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>* out; | |
public: | |
mfc_string_out_iterator(ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s) : out(&s) {} | |
mfc_string_out_iterator& operator++() { return *this; } | |
mfc_string_out_iterator& operator++(int) { return *this; } | |
mfc_string_out_iterator& operator*() { return *this; } | |
mfc_string_out_iterator& operator=(B v) | |
{ | |
out->AppendChar(v); | |
return *this; | |
} | |
typedef std::ptrdiff_t difference_type; | |
typedef B value_type; | |
typedef value_type* pointer; | |
typedef value_type& reference; | |
typedef std::output_iterator_tag iterator_category; | |
}; | |
} | |
template <class traits, SIMPLE_STRING_PARAM> | |
ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> regex_replace(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, | |
const basic_regex<B, traits>& e, | |
const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt, | |
match_flag_type flags = match_default) | |
{ | |
ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> result(s.GetManager()); | |
re_detail::mfc_string_out_iterator<SIMPLE_STRING_ARG_LIST> i(result); | |
regex_replace(i, s.GetString(), s.GetString() + s.GetLength(), e, fmt.GetString(), flags); | |
return result; | |
} | |
} // namespace boost. | |
#endif |