[Libreoffice-commits] core.git: 2 commits - include/o3tl
Thorsten Behrens
Thorsten.Behrens at CIB.de
Sat May 9 01:44:53 PDT 2015
include/o3tl/typed_flags_set.hxx | 116 ++++++++++++++++++++-------------------
include/o3tl/underlying_type.hxx | 6 --
2 files changed, 62 insertions(+), 60 deletions(-)
New commits:
commit 0aa2fd972f8c611df5292ac6ca345fc8d2b223c9
Author: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Date: Fri May 8 21:05:07 2015 +0200
Fix ICEs in gcc 4.6.3 for small-int typed_flags.
Subtle failures in nested template instantiations there, for
sal_{u}Int8 and sal_{u}Int16 - use wide-int fallback to do bitmask
ops. Type is not used to store any dynamic values.
This partially reverts a1ecce3ad7df6a82191c4956cec986dc50503dde
Change-Id: Ifa7070c1c3830fd70d7ced082d651411ff523444
diff --git a/include/o3tl/typed_flags_set.hxx b/include/o3tl/typed_flags_set.hxx
index 6151bab..01a4009 100644
--- a/include/o3tl/typed_flags_set.hxx
+++ b/include/o3tl/typed_flags_set.hxx
@@ -25,8 +25,6 @@
#include <cassert>
#include <type_traits>
-#include <o3tl/underlying_type.hxx>
-
namespace o3tl {
namespace detail {
@@ -48,6 +46,14 @@ typename std::enable_if<std::is_unsigned<T>::value, bool>::type isNonNegative(T)
template<typename T> struct typed_flags {};
+#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 6 && \
+ !defined __clang__
+// use largest sensible unsigned type as fallback
+#define O3TL_STD_UNDERLYING_TYPE_E unsigned long long
+#else
+#define O3TL_STD_UNDERLYING_TYPE_E typename std::underlying_type<E>::type
+#endif
+
/// Mark a (scoped) enumeration as a set of bit flags, with accompanying
/// operations.
///
@@ -61,7 +67,7 @@ template<typename T> struct typed_flags {};
///
/// \param E the enumeration type.
/// \param M the all-bits-set value for the bit flags.
-template<typename E, typename underlying_type<E>::type M>
+template<typename E, O3TL_STD_UNDERLYING_TYPE_E M>
struct is_typed_flags {
static_assert(
M >= 0, "is_typed_flags expects only non-negative bit values");
@@ -70,21 +76,21 @@ struct is_typed_flags {
class Wrap {
public:
- explicit Wrap(typename underlying_type<E>::type value):
+ explicit Wrap(O3TL_STD_UNDERLYING_TYPE_E value):
value_(value)
{ assert(detail::isNonNegative(value)); }
operator E() { return static_cast<E>(value_); }
- explicit operator typename underlying_type<E>::type() { return value_; }
+ explicit operator O3TL_STD_UNDERLYING_TYPE_E() { return value_; }
explicit operator bool() { return value_ != 0; }
private:
- typename underlying_type<E>::type value_;
+ O3TL_STD_UNDERLYING_TYPE_E value_;
};
- static typename underlying_type<E>::type const mask = M;
+ static O3TL_STD_UNDERLYING_TYPE_E const mask = M;
};
}
@@ -93,10 +99,10 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ~(E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
o3tl::typed_flags<E>::mask
- & ~static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ & ~static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -105,20 +111,20 @@ inline typename o3tl::typed_flags<E>::Wrap operator ~(
{
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
o3tl::typed_flags<E>::mask
- & ~static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ & ~static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ^(E lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ ^ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -127,10 +133,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ ^ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -139,10 +145,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ ^ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -151,21 +157,21 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^(
typename o3tl::typed_flags<E>::Wrap rhs)
{
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ ^ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator &(E lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ & static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -174,10 +180,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator &(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ & static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -186,10 +192,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator &(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ & static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -198,21 +204,21 @@ inline typename o3tl::typed_flags<E>::Wrap operator &(
typename o3tl::typed_flags<E>::Wrap rhs)
{
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ & static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator |(E lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ | static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -221,10 +227,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator |(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ | static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -233,10 +239,10 @@ inline typename o3tl::typed_flags<E>::Wrap operator |(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ | static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
@@ -245,18 +251,18 @@ inline typename o3tl::typed_flags<E>::Wrap operator |(
typename o3tl::typed_flags<E>::Wrap rhs)
{
return static_cast<typename o3tl::typed_flags<E>::Wrap>(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)
- | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)
+ | static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs));
}
template<typename E>
inline typename o3tl::typed_flags<E>::Self operator &=(E & lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
lhs = lhs & rhs;
return lhs;
}
@@ -267,7 +273,7 @@ inline typename o3tl::typed_flags<E>::Self operator &=(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
lhs = lhs & rhs;
return lhs;
}
@@ -276,10 +282,10 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Self operator |=(E & lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
lhs = lhs | rhs;
return lhs;
}
@@ -290,7 +296,7 @@ inline typename o3tl::typed_flags<E>::Self operator |=(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
lhs = lhs | rhs;
return lhs;
}
@@ -299,10 +305,10 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Self operator ^=(E & lhs, E rhs) {
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(rhs)));
lhs = lhs ^ rhs;
return lhs;
}
@@ -313,7 +319,7 @@ inline typename o3tl::typed_flags<E>::Self operator ^=(
{
assert(
o3tl::detail::isNonNegative(
- static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
+ static_cast<O3TL_STD_UNDERLYING_TYPE_E>(lhs)));
lhs = lhs ^ rhs;
return lhs;
}
commit 973d038193574d0309c1cfd44618f431c8c25732
Author: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Date: Sat May 9 10:37:47 2015 +0200
Revert "improve fallback behaviour of underlying_type for old gcc"
This reverts commit 7ad4e562b462af22a1c29c955293238cdb30267b, which
was causing ICEs on precisely the compiler versions it was targetted
at.
Change-Id: I996792d723a8bd0d7edd5f248d74217322b5ce3f
diff --git a/include/o3tl/underlying_type.hxx b/include/o3tl/underlying_type.hxx
index 534e088..4b2e077 100644
--- a/include/o3tl/underlying_type.hxx
+++ b/include/o3tl/underlying_type.hxx
@@ -19,11 +19,7 @@ namespace o3tl {
template<typename T> struct underlying_type {
#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 6 && \
!defined __clang__
- typedef typename std::conditional<
- T( -1 ) < T( 0 ),
- typename std::make_signed< T >::type,
- typename std::make_unsigned< T >::type
- >::type type;
+ typedef int type;
#else
typedef typename std::underlying_type<T>::type type;
#endif
More information about the Libreoffice-commits
mailing list