diff --git a/example/snippets/icu_example.cpp b/example/snippets/icu_example.cpp index 8f4a41ed..7dbd5b84 100644 --- a/example/snippets/icu_example.cpp +++ b/example/snippets/icu_example.cpp @@ -28,7 +28,7 @@ // Find out if *password* meets our password requirements, // as defined by the regular expression *requirements*. // -bool is_valid_password(const UnicodeString& password, const UnicodeString& requirements) +bool is_valid_password(const U_NAMESPACE_QUALIFIER UnicodeString& password, const U_NAMESPACE_QUALIFIER UnicodeString& requirements) { return boost::u32regex_match(password, boost::make_u32regex(requirements)); } @@ -52,7 +52,7 @@ std::string get_filename(const std::string& path) } } -UnicodeString extract_greek(const UnicodeString& text) +U_NAMESPACE_QUALIFIER UnicodeString extract_greek(const U_NAMESPACE_QUALIFIER UnicodeString& text) { // searches through some UTF-16 encoded text for a block encoded in Greek, // this expression is imperfect, but the best we can do for now - searching @@ -62,7 +62,7 @@ UnicodeString extract_greek(const UnicodeString& text) if(boost::u32regex_search(text, what, r)) { // extract $0 as a UnicodeString: - return UnicodeString(what[0].first, what.length(0)); + return U_NAMESPACE_QUALIFIER UnicodeString(what[0].first, what.length(0)); } else { @@ -127,7 +127,7 @@ void enumerate_currencies2(const std::string& text) const boost::u32regex e = boost::make_u32regex("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"); const char* human_format = "$1-$2-$3-$4"; -UnicodeString human_readable_card_number(const UnicodeString& s) +U_NAMESPACE_QUALIFIER UnicodeString human_readable_card_number(const U_NAMESPACE_QUALIFIER UnicodeString& s) { return boost::u32regex_replace(s, e, human_format); } @@ -136,8 +136,8 @@ UnicodeString human_readable_card_number(const UnicodeString& s) int main() { // password checks using u32regex_match: - UnicodeString pwd = "abcDEF---"; - UnicodeString pwd_check = "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}"; + U_NAMESPACE_QUALIFIER UnicodeString pwd = "abcDEF---"; + U_NAMESPACE_QUALIFIER UnicodeString pwd_check = "(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}"; bool b = is_valid_password(pwd, pwd_check); assert(b); pwd = "abcD-"; @@ -152,8 +152,8 @@ int main() assert(file == "d.h"); // Greek text extraction with u32regex_search: - UnicodeString text = L"Some where in \x0391\x039D\x0395\x0398\x0391 2004"; - UnicodeString greek = extract_greek(text); + U_NAMESPACE_QUALIFIER UnicodeString text = L"Some where in \x0391\x039D\x0395\x0398\x0391 2004"; + U_NAMESPACE_QUALIFIER UnicodeString greek = extract_greek(text); assert(greek == L"\x0391\x039D\x0395\x0398\x0391 2004"); // extract currency symbols with associated value, use iterator interface: @@ -161,7 +161,7 @@ int main() enumerate_currencies(text2); enumerate_currencies2(text2); - UnicodeString credit_card_number = "1234567887654321"; + U_NAMESPACE_QUALIFIER UnicodeString credit_card_number = "1234567887654321"; credit_card_number = human_readable_card_number(credit_card_number); assert(credit_card_number == "1234-5678-8765-4321"); return 0; diff --git a/include/boost/regex/config.hpp b/include/boost/regex/config.hpp index 8306f3ff..e4b21384 100644 --- a/include/boost/regex/config.hpp +++ b/include/boost/regex/config.hpp @@ -92,6 +92,12 @@ #if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS) # define BOOST_REGEX_NO_EXTERNAL_TEMPLATES #endif +/* + * Shared regex lib will crash without this, frankly it looks a lot like a gcc bug: + */ +#if defined(__MINGW32__) +# define BOOST_REGEX_NO_EXTERNAL_TEMPLATES +#endif /* * If there isn't good enough wide character support then there will diff --git a/include/boost/regex/icu.hpp b/include/boost/regex/icu.hpp index 24715572..c8770c6d 100644 --- a/include/boost/regex/icu.hpp +++ b/include/boost/regex/icu.hpp @@ -376,7 +376,7 @@ inline u32regex make_u32regex(const std::basic_string& s, boost::regex_ // // Construction from ICU string type: // -inline u32regex make_u32regex(const UnicodeString& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl) +inline u32regex make_u32regex(const U_NAMESPACE_QUALIFIER UnicodeString& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl) { return re_detail::do_make_u32regex(s.getBuffer(), s.getBuffer() + s.length(), opt, static_cast const*>(0)); } @@ -498,7 +498,7 @@ inline bool u32regex_match(const std::wstring& s, return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const UnicodeString& s, +inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, match_results& m, const u32regex& e, match_flag_type flags = match_default) @@ -562,7 +562,7 @@ inline bool u32regex_match(const std::wstring& s, return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast const*>(0)); } #endif -inline bool u32regex_match(const UnicodeString& s, +inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, match_flag_type flags = match_default) { @@ -683,7 +683,7 @@ inline bool u32regex_search(const std::wstring& s, return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #endif -inline bool u32regex_search(const UnicodeString& s, +inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, match_results& m, const u32regex& e, match_flag_type flags = match_default) @@ -744,7 +744,7 @@ inline bool u32regex_search(const std::wstring& s, return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast const*>(0)); } #endif -inline bool u32regex_search(const UnicodeString& s, +inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, match_flag_type flags = match_default) { @@ -921,7 +921,7 @@ inline OutputIterator u32regex_replace(OutputIterator out, Iterator first, Iterator last, const u32regex& e, - const UnicodeString& fmt, + const U_NAMESPACE_QUALIFIER UnicodeString& fmt, match_flag_type flags = match_default) { return re_detail::extract_output_base @@ -966,9 +966,9 @@ namespace re_detail{ class unicode_string_out_iterator { - UnicodeString* out; + U_NAMESPACE_QUALIFIER UnicodeString* out; public: - unicode_string_out_iterator(UnicodeString& s) : out(&s) {} + unicode_string_out_iterator(U_NAMESPACE_QUALIFIER UnicodeString& s) : out(&s) {} unicode_string_out_iterator& operator++() { return *this; } unicode_string_out_iterator& operator++(int) { return *this; } unicode_string_out_iterator& operator*() { return *this; } @@ -986,23 +986,23 @@ public: } -inline UnicodeString u32regex_replace(const UnicodeString& s, +inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, const UChar* fmt, match_flag_type flags = match_default) { - UnicodeString result; + U_NAMESPACE_QUALIFIER UnicodeString result; re_detail::unicode_string_out_iterator i(result); u32regex_replace(i, s.getBuffer(), s.getBuffer()+s.length(), e, fmt, flags); return result; } -inline UnicodeString u32regex_replace(const UnicodeString& s, +inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, - const UnicodeString& fmt, + const U_NAMESPACE_QUALIFIER UnicodeString& fmt, match_flag_type flags = match_default) { - UnicodeString result; + U_NAMESPACE_QUALIFIER UnicodeString result; re_detail::unicode_string_out_iterator i(result); re_detail::do_regex_replace( re_detail::make_utf32_out(i, static_cast const*>(0)), diff --git a/include/boost/regex/v4/match_results.hpp b/include/boost/regex/v4/match_results.hpp index e493810b..000bb43a 100644 --- a/include/boost/regex/v4/match_results.hpp +++ b/include/boost/regex/v4/match_results.hpp @@ -348,6 +348,8 @@ public: { std::swap(m_subs, that.m_subs); std::swap(m_base, that.m_base); + std::swap(m_named_subs, that.m_named_subs); + std::swap(m_last_closed_paren, that.m_last_closed_paren); } bool operator==(const match_results& that)const { diff --git a/include/boost/regex/v4/u32regex_iterator.hpp b/include/boost/regex/v4/u32regex_iterator.hpp index 7e893e69..65ebd7f8 100644 --- a/include/boost/regex/v4/u32regex_iterator.hpp +++ b/include/boost/regex/v4/u32regex_iterator.hpp @@ -178,7 +178,7 @@ inline u32regex_iterator::const typedef typename std::basic_string::const_iterator iter_type; return u32regex_iterator(p.begin(), p.end(), e, m); } -inline u32regex_iterator make_u32regex_iterator(const UnicodeString& s, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default) +inline u32regex_iterator make_u32regex_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default) { return u32regex_iterator(s.getBuffer(), s.getBuffer() + s.length(), e, m); } diff --git a/include/boost/regex/v4/u32regex_token_iterator.hpp b/include/boost/regex/v4/u32regex_token_iterator.hpp index 2726d486..c47a2192 100644 --- a/include/boost/regex/v4/u32regex_token_iterator.hpp +++ b/include/boost/regex/v4/u32regex_token_iterator.hpp @@ -294,7 +294,7 @@ inline u32regex_token_iterator: typedef typename std::basic_string::const_iterator iter_type; return u32regex_token_iterator(p.begin(), p.end(), e, m); } -inline u32regex_token_iterator make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default) +inline u32regex_token_iterator make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default) { return u32regex_token_iterator(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m); } @@ -327,7 +327,7 @@ inline u32regex_token_iterator: return u32regex_token_iterator(p.begin(), p.end(), e, m); } template -inline u32regex_token_iterator make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default) +inline u32regex_token_iterator make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default) { return u32regex_token_iterator(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m); } @@ -356,7 +356,7 @@ inline u32regex_token_iterator: typedef typename std::basic_string::const_iterator iter_type; return u32regex_token_iterator(p.begin(), p.end(), e, m); } -inline u32regex_token_iterator make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, const std::vector& submatch, regex_constants::match_flag_type m = regex_constants::match_default) +inline u32regex_token_iterator make_u32regex_token_iterator(const U_NAMESPACE_QUALIFIER UnicodeString& s, const u32regex& e, const std::vector& submatch, regex_constants::match_flag_type m = regex_constants::match_default) { return u32regex_token_iterator(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m); } diff --git a/test/concepts/icu_concept_check.cpp b/test/concepts/icu_concept_check.cpp index 59fd2a04..526758a4 100644 --- a/test/concepts/icu_concept_check.cpp +++ b/test/concepts/icu_concept_check.cpp @@ -8,6 +8,13 @@ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) * */ + +// +// This define keep ICU in it's own namespace: helps us to track bugs that would +// otherwise go unnoticed: +// +#define U_USING_ICU_NAMESPACE 0 + #include #if defined(BOOST_MSVC) @@ -66,7 +73,7 @@ int main() boost::regex_constants::match_flag_type flgs = boost::regex_constants::match_default; std::string s1; std::wstring s2; - UnicodeString us; + U_NAMESPACE_QUALIFIER UnicodeString us; b = boost::u32regex_match(utf8_arch1(), utf8_arch1(), m1, e1, flgs); b = boost::u32regex_match(utf8_arch1(), utf8_arch1(), m1, e1); b = boost::u32regex_match(utf8_arch2(), utf8_arch2(), m2, e1, flgs); diff --git a/test/regress/test_icu.cpp b/test/regress/test_icu.cpp index 88d6fe4a..16f667d9 100644 --- a/test/regress/test_icu.cpp +++ b/test/regress/test_icu.cpp @@ -564,7 +564,7 @@ void test_icu(const wchar_t&, const test_regex_replace_tag&) // // Now with UnicodeString: // - UnicodeString expression16u, text16u, format16u, result16u, found16u; + U_NAMESPACE_QUALIFIER UnicodeString expression16u, text16u, format16u, result16u, found16u; if(expression16.size()) expression16u.setTo(&*expression16.begin(), expression16.size()); if(text16.size())