Kaydet (Commit) 6bee7792 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Get rid of false GCC 4.7 -Werror=type-limits in template code

Change-Id: I4b13d3b7d74690401234dfa30c8c1b6647820b6a
Reviewed-on: https://gerrit.libreoffice.org/15216Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTor Lillqvist <tml@collabora.com>
Tested-by: 's avatarTor Lillqvist <tml@collabora.com>
üst 2391931e
...@@ -23,11 +23,29 @@ ...@@ -23,11 +23,29 @@
#include <sal/config.h> #include <sal/config.h>
#include <cassert> #include <cassert>
#include <type_traits>
#include <o3tl/underlying_type.hxx> #include <o3tl/underlying_type.hxx>
namespace o3tl { namespace o3tl {
namespace detail {
template<typename T> inline
typename std::enable_if<std::is_signed<T>::value, bool>::type isNonNegative(
T value)
{
return value >= 0;
}
template<typename T> inline
typename std::enable_if<std::is_unsigned<T>::value, bool>::type isNonNegative(T)
{
return true;
}
}
template<typename T> struct typed_flags {}; template<typename T> struct typed_flags {};
/// Mark a (scoped) enumeration as a set of bit flags, with accompanying /// Mark a (scoped) enumeration as a set of bit flags, with accompanying
...@@ -54,7 +72,7 @@ struct is_typed_flags { ...@@ -54,7 +72,7 @@ struct is_typed_flags {
public: public:
explicit Wrap(typename underlying_type<E>::type value): explicit Wrap(typename underlying_type<E>::type value):
value_(value) value_(value)
{ assert(value >= 0); } { assert(detail::isNonNegative(value)); }
operator E() { return static_cast<E>(value_); } operator E() { return static_cast<E>(value_); }
...@@ -73,7 +91,9 @@ struct is_typed_flags { ...@@ -73,7 +91,9 @@ struct is_typed_flags {
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ~(E rhs) { inline typename o3tl::typed_flags<E>::Wrap operator ~(E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( return static_cast<typename o3tl::typed_flags<E>::Wrap>(
o3tl::typed_flags<E>::mask o3tl::typed_flags<E>::mask
& ~static_cast<typename o3tl::underlying_type<E>::type>(rhs)); & ~static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -90,8 +110,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator ~( ...@@ -90,8 +110,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator ~(
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ^(E lhs, E rhs) { inline typename o3tl::typed_flags<E>::Wrap operator ^(E lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
^ static_cast<typename o3tl::underlying_type<E>::type>(rhs)); ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -101,7 +125,9 @@ template<typename E> ...@@ -101,7 +125,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ^( inline typename o3tl::typed_flags<E>::Wrap operator ^(
E lhs, typename o3tl::typed_flags<E>::Wrap rhs) E lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
^ static_cast<typename o3tl::underlying_type<E>::type>(rhs)); ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -111,7 +137,9 @@ template<typename E> ...@@ -111,7 +137,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator ^( inline typename o3tl::typed_flags<E>::Wrap operator ^(
typename o3tl::typed_flags<E>::Wrap lhs, E rhs) typename o3tl::typed_flags<E>::Wrap lhs, E rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
^ static_cast<typename o3tl::underlying_type<E>::type>(rhs)); ^ static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -129,8 +157,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^( ...@@ -129,8 +157,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator ^(
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator &(E lhs, E rhs) { inline typename o3tl::typed_flags<E>::Wrap operator &(E lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
& static_cast<typename o3tl::underlying_type<E>::type>(rhs)); & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -140,7 +172,9 @@ template<typename E> ...@@ -140,7 +172,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator &( inline typename o3tl::typed_flags<E>::Wrap operator &(
E lhs, typename o3tl::typed_flags<E>::Wrap rhs) E lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
& static_cast<typename o3tl::underlying_type<E>::type>(rhs)); & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -150,7 +184,9 @@ template<typename E> ...@@ -150,7 +184,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator &( inline typename o3tl::typed_flags<E>::Wrap operator &(
typename o3tl::typed_flags<E>::Wrap lhs, E rhs) typename o3tl::typed_flags<E>::Wrap lhs, E rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
& static_cast<typename o3tl::underlying_type<E>::type>(rhs)); & static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -168,8 +204,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator &( ...@@ -168,8 +204,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator &(
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator |(E lhs, E rhs) { inline typename o3tl::typed_flags<E>::Wrap operator |(E lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
| static_cast<typename o3tl::underlying_type<E>::type>(rhs)); | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -179,7 +219,9 @@ template<typename E> ...@@ -179,7 +219,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator |( inline typename o3tl::typed_flags<E>::Wrap operator |(
E lhs, typename o3tl::typed_flags<E>::Wrap rhs) E lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
| static_cast<typename o3tl::underlying_type<E>::type>(rhs)); | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -189,7 +231,9 @@ template<typename E> ...@@ -189,7 +231,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Wrap operator |( inline typename o3tl::typed_flags<E>::Wrap operator |(
typename o3tl::typed_flags<E>::Wrap lhs, E rhs) typename o3tl::typed_flags<E>::Wrap lhs, E rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
return static_cast<typename o3tl::typed_flags<E>::Wrap>( 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>(lhs)
| static_cast<typename o3tl::underlying_type<E>::type>(rhs)); | static_cast<typename o3tl::underlying_type<E>::type>(rhs));
...@@ -207,8 +251,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator |( ...@@ -207,8 +251,12 @@ inline typename o3tl::typed_flags<E>::Wrap operator |(
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Self operator &=(E & lhs, E rhs) { inline typename o3tl::typed_flags<E>::Self operator &=(E & lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
lhs = lhs & rhs; lhs = lhs & rhs;
return lhs; return lhs;
} }
...@@ -217,15 +265,21 @@ template<typename E> ...@@ -217,15 +265,21 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Self operator &=( inline typename o3tl::typed_flags<E>::Self operator &=(
E & lhs, typename o3tl::typed_flags<E>::Wrap rhs) E & lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
lhs = lhs & rhs; lhs = lhs & rhs;
return lhs; return lhs;
} }
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Self operator |=(E & lhs, E rhs) { inline typename o3tl::typed_flags<E>::Self operator |=(E & lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
lhs = lhs | rhs; lhs = lhs | rhs;
return lhs; return lhs;
} }
...@@ -234,15 +288,21 @@ template<typename E> ...@@ -234,15 +288,21 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Self operator |=( inline typename o3tl::typed_flags<E>::Self operator |=(
E & lhs, typename o3tl::typed_flags<E>::Wrap rhs) E & lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
lhs = lhs | rhs; lhs = lhs | rhs;
return lhs; return lhs;
} }
template<typename E> template<typename E>
inline typename o3tl::typed_flags<E>::Self operator ^=(E & lhs, E rhs) { inline typename o3tl::typed_flags<E>::Self operator ^=(E & lhs, E rhs) {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
assert(static_cast<typename o3tl::underlying_type<E>::type>(rhs) >= 0); o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(rhs)));
lhs = lhs ^ rhs; lhs = lhs ^ rhs;
return lhs; return lhs;
} }
...@@ -251,7 +311,9 @@ template<typename E> ...@@ -251,7 +311,9 @@ template<typename E>
inline typename o3tl::typed_flags<E>::Self operator ^=( inline typename o3tl::typed_flags<E>::Self operator ^=(
E & lhs, typename o3tl::typed_flags<E>::Wrap rhs) E & lhs, typename o3tl::typed_flags<E>::Wrap rhs)
{ {
assert(static_cast<typename o3tl::underlying_type<E>::type>(lhs) >= 0); assert(
o3tl::detail::isNonNegative(
static_cast<typename o3tl::underlying_type<E>::type>(lhs)));
lhs = lhs ^ rhs; lhs = lhs ^ rhs;
return lhs; return lhs;
} }
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
namespace o3tl { namespace o3tl {
template<typename T> struct underlying_type { template<typename T> struct underlying_type {
#if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 7 && \ #if defined __GNUC__ && __GNUC__ == 4 && __GNUC_MINOR__ <= 6 && \
!defined __clang__ !defined __clang__
typedef int type; typedef int type;
#else #else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment