diff --git a/cppu/source/uno/eq.hxx b/cppu/source/uno/eq.hxx index 6287cdcc3506..e81f0972e801 100644 --- a/cppu/source/uno/eq.hxx +++ b/cppu/source/uno/eq.hxx @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -259,6 +260,27 @@ inline bool _equalSequence( } } +template +std::enable_if_t && std::is_signed_v, bool> equal(T1 value1, T2 value2) { + return value1 == value2; +} + +template +std::enable_if_t && std::is_unsigned_v, bool> equal(T1 value1, T2 value2) { + return value1 >= 0 && static_cast>(value1) == value2; +} + +template +std::enable_if_t && std::is_signed_v, bool> equal(T1 value1, T2 value2) { + return value2 >= 0 && value1 == static_cast>(value2); +} + +template +std::enable_if_t && std::is_unsigned_v, bool> equal(T1 value1, T2 value2) +{ + return value1 == value2; +} + inline bool _equalData( void * pDest, typelib_TypeDescriptionReference * pDestType, typelib_TypeDescription * pDestTypeDescr, @@ -294,20 +316,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (*static_cast(pDest) >= 0 && - static_cast(*static_cast(pDest)) == *static_cast(pSource)); // same size + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -319,20 +340,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (*static_cast(pDest) >= 0 && - static_cast(*static_cast(pDest)) == *static_cast(pSource)); // same size + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -344,19 +364,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -368,20 +388,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (*static_cast(pDest) >= 0 && - static_cast(*static_cast(pDest)) == *static_cast(pSource)); // same size + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -393,19 +412,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (static_cast(*static_cast(pDest)) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -417,20 +436,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (*static_cast(pDest) >= 0 && - *static_cast(pDest) == *static_cast(pSource)); // same size + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: return (static_cast(*static_cast(pDest)) == *static_cast(pSource)); case typelib_TypeClass_DOUBLE: @@ -442,23 +460,19 @@ inline bool _equalData( switch (eSourceTypeClass) { case typelib_TypeClass_BYTE: - return (*static_cast(pSource) >= 0 && - *static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_SHORT: - return (*static_cast(pSource) >= 0 && - *static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_SHORT: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_LONG: - return (*static_cast(pSource) >= 0 && - *static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_LONG: - return (*static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_HYPER: - return (*static_cast(pSource) >= 0 && - *static_cast(pDest) == static_cast(*static_cast(pSource))); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_UNSIGNED_HYPER: - return (*static_cast(pDest) == *static_cast(pSource)); + return equal(*static_cast(pDest), *static_cast(pSource)); case typelib_TypeClass_FLOAT: if (::floor( *static_cast(pSource) ) != *static_cast(pSource) || *static_cast(pSource) < 0) return false;