_GLIBCXX_END_NAMESPACE_CXX11
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
namespace __detail
{
/**
_CharT
_M_translate(_CharT __ch) const
{
- if _GLIBCXX17_CONSTEXPR (__icase)
+ if constexpr (__icase)
return _M_traits.translate_nocase(__ch);
- else if _GLIBCXX17_CONSTEXPR (__collate)
+ else if constexpr (__collate)
return _M_traits.translate(__ch);
else
return __ch;
bool
_M_match_range(_CharT __first, _CharT __last, _CharT __ch) const
{
- if _GLIBCXX17_CONSTEXPR (!__icase)
+ if constexpr (!__icase)
return __first <= __ch && __ch <= __last;
else
return this->_M_in_range_icase(__first, __last, __ch);
bool
operator()(_CharT __ch) const
- { return _M_apply(__ch, typename is_same<_CharT, char>::type()); }
-
- bool
- _M_apply(_CharT __ch, true_type) const
{
- auto __c = _M_translator._M_translate(__ch);
- auto __n = _M_translator._M_translate('\n');
- auto __r = _M_translator._M_translate('\r');
- return __c != __n && __c != __r;
- }
-
- bool
- _M_apply(_CharT __ch, false_type) const
- {
- auto __c = _M_translator._M_translate(__ch);
- auto __n = _M_translator._M_translate('\n');
- auto __r = _M_translator._M_translate('\r');
- auto __u2028 = _M_translator._M_translate(u'\u2028');
- auto __u2029 = _M_translator._M_translate(u'\u2029');
- return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
+ const auto __c = _M_translator._M_translate(__ch);
+ if (__c == _M_translator._M_translate('\n'))
+ return false;
+ if (__c == _M_translator._M_translate('\r'))
+ return false;
+ if constexpr (!is_same<_CharT, char>::value)
+ {
+ if (__c == _M_translator._M_translate(u'\u2028')) // line sep
+ return false;
+ if (__c == _M_translator._M_translate(u'\u2029')) // para sep
+ return false;
+ }
+ return true;
}
_TransT _M_translator;
operator()(_CharT __ch) const
{
_GLIBCXX_DEBUG_ASSERT(_M_is_ready);
- return _M_apply(__ch, _UseCache());
+ if constexpr (_UseCache::value)
+ if (!(__ch & 0x80)) [[__likely__]]
+ return _M_cache[static_cast<_UnsignedCharT>(__ch)];
+ return _M_apply(__ch);
}
void
std::sort(_M_char_set.begin(), _M_char_set.end());
auto __end = std::unique(_M_char_set.begin(), _M_char_set.end());
_M_char_set.erase(__end, _M_char_set.end());
- _M_make_cache(_UseCache());
+ if constexpr (_UseCache::value)
+ for (unsigned __i = 0; __i < 128; __i++) // Only cache 7-bit chars
+ _M_cache[__i] = _M_apply(static_cast<_CharT>(__i));
_GLIBCXX_DEBUG_ONLY(_M_is_ready = true);
}
using _UnsignedCharT = typename std::make_unsigned<_CharT>::type;
bool
- _M_apply(_CharT __ch, false_type) const;
-
- bool
- _M_apply(_CharT __ch, true_type) const
- { return _M_cache[static_cast<_UnsignedCharT>(__ch)]; }
-
- void
- _M_make_cache(true_type)
- {
- for (unsigned __i = 0; __i < _M_cache.size(); __i++)
- _M_cache[__i] = _M_apply(static_cast<_CharT>(__i), false_type());
- }
-
- void
- _M_make_cache(false_type)
- { }
+ _M_apply(_CharT __ch) const;
private:
_GLIBCXX_STD_C::vector<_CharT> _M_char_set;
///@} regex-detail
} // namespace __detail
+#pragma GCC diagnostic pop
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
namespace __detail
{
template<typename _BiIter, typename _Alloc, typename _TraitsT,
}
else // Non-greedy mode
{
- if (__dfs_mode)
+ if constexpr (__dfs_mode)
{
// vice-versa.
_M_dfs(__match_mode, __state._M_next);
if (_M_current == _M_end)
return;
- if (__dfs_mode)
+ if constexpr (__dfs_mode)
{
if (__state._M_matches(*_M_current))
{
void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
_M_handle_backref(_Match_mode __match_mode, _StateIdT __i)
{
- __glibcxx_assert(__dfs_mode);
+ static_assert(__dfs_mode, "this should never be instantiated");
const auto& __state = _M_nfa[__i];
auto& __submatch = _M_cur_results[__state._M_backref_index];
void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
_M_handle_accept(_Match_mode __match_mode, _StateIdT)
{
- if _GLIBCXX17_CONSTEXPR (__dfs_mode)
+ if constexpr (__dfs_mode)
{
__glibcxx_assert(!_M_has_sol);
if (__match_mode == _Match_mode::_Exact)
case _S_opcode_match:
_M_handle_match(__match_mode, __i); break;
case _S_opcode_backref:
- _M_handle_backref(__match_mode, __i); break;
+ if constexpr (__dfs_mode)
+ _M_handle_backref(__match_mode, __i);
+ else
+ __builtin_unreachable();
+ break;
case _S_opcode_accept:
_M_handle_accept(__match_mode, __i); break;
case _S_opcode_alternative:
return __left_is_word != __right_is_word;
}
} // namespace __detail
+#pragma GCC diagnostic pop
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace