@@ -516,14 +509,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
template<typename _FwdIter>
basic_regex(_FwdIter __first, _FwdIter __last,
flag_type __f = ECMAScript)
- : _M_flags(__f),
- _M_loc(),
- _M_original_str(__first, __last),
- _M_automaton(__detail::__compile_nfa<_Rx_traits>(
- _M_original_str.c_str(),
- _M_original_str.c_str() + _M_original_str.size(),
- _M_loc,
- _M_flags))
+ : basic_regex(std::move(__first), std::move(__last), locale_type(), __f)
Am I missing something here, why are you moving the iterators?
Iterators are cheap to copy, so moving them is not necessary.
@@ -764,7 +745,15 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
#endif
private:
- typedef std::shared_ptr<__detail::_NFA<_Rx_traits>> _AutomatonPtr;
+ typedef std::shared_ptr<const __detail::_NFA<_Rx_traits>> _AutomatonPtr;
+
+ template<typename _FwdIter>
+ basic_regex(_FwdIter __first, _FwdIter __last, locale_type __loc,
+ flag_type __f)
+ : _M_flags(__f), _M_loc(std::move(__loc)),
+ _M_automaton(__detail::__compile_nfa<_FwdIter, _Rx_traits>(
+ std::move(__first), std::move(__last), _M_loc, _M_flags))
Again, I don't think std::move is needed for the iterators.
diff --git a/libstdc++-v3/include/bits/regex_compiler.h
b/libstdc++-v3/include/bits/regex_compiler.h
index 81f8c8e..56962a9 100644
--- a/libstdc++-v3/include/bits/regex_compiler.h
+++ b/libstdc++-v3/include/bits/regex_compiler.h
@@ -59,9 +59,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Compiler(_IterT __b, _IterT __e,
const typename _TraitsT::locale_type& __traits, _FlagT __flags);
- std::shared_ptr<_RegexT>
+ shared_ptr<const _RegexT>
_M_get_nfa()
- { return std::move(_M_nfa); }
+ { return shared_ptr<const _RegexT>(_M_nfa.release()); }
This could be:
{ return shared_ptr<const _RegexT>(std::move(_M_nfa)); }
or simply left as it was:
{ return std::move(_M_nfa); }
because shared_ptr has an implicit conversion from unique_ptr rvalues.
@@ -138,20 +138,65 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_FlagT _M_flags;
_ScannerT _M_scanner;
- shared_ptr<_RegexT> _M_nfa;
+ unique_ptr<_RegexT> _M_nfa;
_StringT _M_value;
_StackT _M_stack;
const _TraitsT& _M_traits;
const _CtypeT& _M_ctype;
};
diff --git a/libstdc++-v3/include/bits/regex_compiler.tcc
b/libstdc++-v3/include/bits/regex_compiler.tcc
index 33d7118..20b3172 100644
--- a/libstdc++-v3/include/bits/regex_compiler.tcc
+++ b/libstdc++-v3/include/bits/regex_compiler.tcc
@@ -73,7 +73,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
? __flags
: __flags | regex_constants::ECMAScript),
_M_scanner(__b, __e, _M_flags, __loc),
- _M_nfa(make_shared<_RegexT>(__loc, _M_flags)),
+ _M_nfa(new _RegexT(__loc, _M_flags)),
Am I right in thinking that this unique_ptr will always end up being
converted to a shared_ptr?
In that case, why bother using a unique_ptr initially, if it will just
have to allocate a shared_ptr control block later anyway? It's better
to use make_shared to reduce the number of allocations, isn't it?