diff --git a/include/boost/regex/concepts.hpp b/include/boost/regex/concepts.hpp index 0f88cdc9..5e6ebc01 100644 --- a/include/boost/regex/concepts.hpp +++ b/include/boost/regex/concepts.hpp @@ -76,13 +76,10 @@ inline long hash_value(char_architype val) // } // namespace boost namespace std{ - template<> struct char_traits - { - // The intent is that this template is not instantiated, - // but this typedef gives us a chance of compilation in - // case it is: - typedef boost::char_architype char_type; - }; + // + // We should never use this, if we do it should be an error: + // + template<> struct char_traits; } // // Allocator architype: @@ -412,6 +409,10 @@ struct BaseRegexConcept Regex e5(in1, in2, m_flags); ignore_unused_variable_warning(e5); + // equals: + e1 == e2; + e1 != e2; + // assign etc: Regex e; e = m_pointer; diff --git a/include/boost/regex/v5/basic_regex.hpp b/include/boost/regex/v5/basic_regex.hpp index 230dc514..c09151ff 100644 --- a/include/boost/regex/v5/basic_regex.hpp +++ b/include/boost/regex/v5/basic_regex.hpp @@ -533,7 +533,21 @@ public: return status() - that.status(); if(flags() != that.flags()) return flags() - that.flags(); - return str().compare(that.str()); + + const char_type* i = m_pimpl->begin(); + const char_type* j = that.m_pimpl->begin(); + while ((i != m_pimpl->end()) && (j != that.m_pimpl->end())) + { + if (*i != *j) + return *i < *j ? -1 : 1; + ++i; + ++j; + } + if (i != m_pimpl->end()) + return *i > static_cast(0) ? 1 : -1; + if (j != that.m_pimpl->end()) + return *j > static_cast(0) ? -1 : 1; + return 0; } bool operator==(const basic_regex& e)const {