[Libreoffice-commits] core.git: include/o3tl

Stephan Bergmann sbergman at redhat.com
Tue May 16 12:14:07 UTC 2017


 include/o3tl/strong_int.hxx |   50 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 47 insertions(+), 3 deletions(-)

New commits:
commit a6f29aae36e5b07d877d7ea833b6d06b49b5574a
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Tue May 16 10:11:20 2017 +0200

    Blind fix for MSVC 2017 warning C4018: '>=': signed/unsigned mismatch
    
    ...and get rid of the arbitrary, bogus 'long' strong_int ctor parameter
    type
    
    Change-Id: If71f4d3993e984b4089b74ff96dce75c68a6cf77
    Reviewed-on: https://gerrit.libreoffice.org/37665
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    Tested-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/include/o3tl/strong_int.hxx b/include/o3tl/strong_int.hxx
index ce5466e45167..8a9d91dbfb8c 100644
--- a/include/o3tl/strong_int.hxx
+++ b/include/o3tl/strong_int.hxx
@@ -23,10 +23,52 @@
 #include <sal/config.h>
 #include <limits>
 #include <cassert>
+#include <type_traits>
 
 namespace o3tl
 {
 
+#if HAVE_CXX14_CONSTEXPR
+
+namespace detail {
+
+template<typename T1, typename T2> constexpr
+typename std::enable_if<
+    std::is_signed<T1>::value && std::is_signed<T2>::value, bool>::type
+isInRange(T2 value) {
+    return value >= std::numeric_limits<T1>::min()
+        && value <= std::numeric_limits<T1>::max();
+}
+
+template<typename T1, typename T2> constexpr
+typename std::enable_if<
+    std::is_signed<T1>::value && std::is_unsigned<T2>::value, bool>::type
+isInRange(T2 value) {
+    return value
+        <= static_cast<typename std::make_unsigned<T1>::type>(
+            std::numeric_limits<T1>::max());
+}
+
+template<typename T1, typename T2> constexpr
+typename std::enable_if<
+    std::is_unsigned<T1>::value && std::is_signed<T2>::value, bool>::type
+isInRange(T2 value) {
+    return value >= 0
+        && (static_cast<typename std::make_unsigned<T2>::type>(value)
+            <= std::numeric_limits<T1>::max());
+}
+
+template<typename T1, typename T2> constexpr
+typename std::enable_if<
+    std::is_unsigned<T1>::value && std::is_unsigned<T2>::value, bool>::type
+isInRange(T2 value) {
+    return value <= std::numeric_limits<T1>::max();
+}
+
+}
+
+#endif
+
 ///
 /// Wrap up an integer type so that we prevent accidental conversion to other integer types.
 ///
@@ -42,12 +84,14 @@ template <typename UNDERLYING_TYPE, typename PHANTOM_TYPE>
 struct strong_int
 {
 public:
-    explicit constexpr strong_int(long value) : m_value(value)
+    template<typename T> explicit constexpr strong_int(
+        T value,
+        typename std::enable_if<std::is_integral<T>::value, int>::type = 0):
+        m_value(value)
     {
 #if HAVE_CXX14_CONSTEXPR
         // catch attempts to pass in out-of-range values early
-        assert(value >= std::numeric_limits<UNDERLYING_TYPE>::min()
-               && value <= std::numeric_limits<UNDERLYING_TYPE>::max()
+        assert(detail::isInRange<UNDERLYING_TYPE>(value)
                && "out of range");
 #endif
     }


More information about the Libreoffice-commits mailing list