[patch] Avoid #ifdef _GLIBCXX_DEBUG in regex_compiler.h

Jonathan Wakely jwakely@redhat.com
Mon Sep 7 15:23:00 GMT 2015


On 07/09/15 15:54 +0100, Jonathan Wakely wrote:
>@@ -457,10 +457,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> 	return 1ul << (sizeof(_CharT) * __CHAR_BIT__ * int(_UseCache::value));
>       }
>
>-      struct _Dummy { };
>-      typedef typename std::conditional<_UseCache::value,
>-					std::bitset<_S_cache_size()>,
>-					_Dummy>::type _CacheT;
>+      struct _Flags
>+      {
>+	bool _M_is_non_matching;
>+	bool _M_is_ready;
>+      };
>+
>+      struct _Empty { };
>+
>+      struct _ExtraMembers
>+      : _Flags,
>+	conditional<_UseCache::value, bitset<_S_cache_size()>, _Empty>::type
>+      {
>+	explicit
>+	_ExtraMembers(bool __is_non_matching)
>+	: _Flags{__is_non_matching, false}
>+	{ }
>+      };
>+

And we could get rid of the _Empty type, because std::bitset<0> is an
empty type anyway, so if we made _S_cache_size()==0 when _UseCache is
false then in the current code we could just unconditionally use:

  using _CacheT = std::bitset<_S_cache_size()>;

and for the suggested change to use a padding byte for the _M_is_ready
flag we could use:

      struct _ExtraMembers
      : _Flags, bitset<_S_cache_size()>
      {
        explicit
        _ExtraMembers(bool __is_non_matching)
        : _Flags{__is_non_matching, false}
        { }
      };



More information about the Gcc-patches mailing list