[PATCH] [libc++] Teach is_integral, is_[un]signed and make_[un]signed about __[u]int128_t
Stephan Tolksdorf
st at quanttec.com
Sun Mar 2 11:16:39 PST 2014
Hi mclow.lists,
I've added _LIBCPP_INT128 and _LIBCPP_UINT128 macros to __config to make it easy to support 128-bit integers that are not spelled __int128_t and __uint128_t.
I was't sure whether the __SIZEOF_INT128__ check should be moved into the compiler-dependent sections of __config or not. AFAIK, 128-bit integer types are currently only supported by GCC-compatible compilers.
http://llvm-reviews.chandlerc.com/D2917
Files:
include/__config
include/type_traits
test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp
test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp
test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
Index: include/__config
===================================================================
--- include/__config
+++ include/__config
@@ -485,6 +485,11 @@
typedef unsigned int char32_t;
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
+#ifdef __SIZEOF_INT128__
+#define _LIBCPP_INT128 __int128_t
+#define _LIBCPP_UINT128 __uint128_t
+#endif
+
#ifdef _LIBCPP_HAS_NO_STATIC_ASSERT
template <bool> struct __static_assert_test;
Index: include/type_traits
===================================================================
--- include/type_traits
+++ include/type_traits
@@ -324,6 +324,10 @@
template <> struct __libcpp_is_integral<unsigned long> : public true_type {};
template <> struct __libcpp_is_integral<long long> : public true_type {};
template <> struct __libcpp_is_integral<unsigned long long> : public true_type {};
+#ifdef _LIBCPP_INT128
+template <> struct __libcpp_is_integral<_LIBCPP_INT128> : public true_type {};
+template <> struct __libcpp_is_integral<_LIBCPP_UINT128> : public true_type {};
+#endif
template <class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_integral
: public __libcpp_is_integral<typename remove_cv<_Tp>::type> {};
@@ -1239,16 +1243,24 @@
__type_list<signed int,
__type_list<signed long,
__type_list<signed long long,
+#ifdef _LIBCPP_INT128
+ __type_list<_LIBCPP_INT128, __nat>
+#else
__nat
+#endif
> > > > > __signed_types;
typedef
__type_list<unsigned char,
__type_list<unsigned short,
__type_list<unsigned int,
__type_list<unsigned long,
__type_list<unsigned long long,
+#ifdef _LIBCPP_UINT128
+ __type_list<_LIBCPP_UINT128, __nat>
+#else
__nat
+#endif
> > > > > __unsigned_types;
template <class _TypeList, size_t _Size, bool = _Size <= sizeof(typename _TypeList::_Head)> struct __find_first;
@@ -1332,6 +1344,10 @@
template <> struct __make_signed<unsigned long, true> {typedef long type;};
template <> struct __make_signed< signed long long, true> {typedef long long type;};
template <> struct __make_signed<unsigned long long, true> {typedef long long type;};
+#ifdef _LIBCPP_INT128
+template <> struct __make_signed<_LIBCPP_INT128, true> {typedef _LIBCPP_INT128 type;};
+template <> struct __make_signed<_LIBCPP_UINT128, true> {typedef _LIBCPP_INT128 type;};
+#endif
template <class _Tp>
struct _LIBCPP_TYPE_VIS_ONLY make_signed
@@ -1361,6 +1377,10 @@
template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;};
template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;};
template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;};
+#ifdef _LIBCPP_INT128
+template <> struct __make_unsigned<_LIBCPP_INT128, true> {typedef _LIBCPP_UINT128 type;};
+template <> struct __make_unsigned<_LIBCPP_UINT128, true> {typedef _LIBCPP_UINT128 type;};
+#endif
template <class _Tp>
struct _LIBCPP_TYPE_VIS_ONLY make_unsigned
Index: test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
===================================================================
--- test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
+++ test/utilities/meta/meta.trans/meta.trans.sign/make_signed.pass.cpp
@@ -21,6 +21,13 @@
big = 0xFFFFFFFFFFFFFFFFULL
};
+#ifdef _LIBCPP_INT128
+enum HugeEnum : _LIBCPP_UINT128
+{
+ hugezero
+};
+#endif
+
template <class T, class U>
void test_make_signed()
{
@@ -47,4 +54,9 @@
test_make_signed< const wchar_t, std::conditional<sizeof(wchar_t) == 4, const int, const short>::type >();
test_make_signed< const Enum, const int >();
test_make_signed< BigEnum, std::conditional<sizeof(long) == 4, long long, long>::type >();
+#ifdef _LIBCPP_INT128
+ test_make_signed< _LIBCPP_INT128, _LIBCPP_INT128 >();
+ test_make_signed< _LIBCPP_UINT128, _LIBCPP_INT128 >();
+ test_make_signed< HugeEnum, _LIBCPP_INT128 >();
+#endif
}
Index: test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
===================================================================
--- test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
+++ test/utilities/meta/meta.trans/meta.trans.sign/make_unsigned.pass.cpp
@@ -21,6 +21,13 @@
big = 0xFFFFFFFFFFFFFFFFULL
};
+#ifdef _LIBCPP_INT128
+enum HugeEnum : _LIBCPP_INT128
+{
+ hugezero
+};
+#endif
+
template <class T, class U>
void test_make_unsigned()
{
@@ -48,4 +55,9 @@
test_make_unsigned<const Enum, const unsigned int> ();
test_make_unsigned<BigEnum,
std::conditional<sizeof(long) == 4, unsigned long long, unsigned long>::type> ();
+#ifdef _LIBCPP_INT128
+ test_make_unsigned<_LIBCPP_INT128, _LIBCPP_UINT128>();
+ test_make_unsigned<_LIBCPP_UINT128, _LIBCPP_UINT128>();
+ test_make_unsigned<HugeEnum, _LIBCPP_UINT128>();
+#endif
}
Index: test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp
===================================================================
--- test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp
+++ test/utilities/meta/meta.unary/meta.unary.cat/integral.pass.cpp
@@ -58,4 +58,8 @@
test_integral<unsigned long>();
test_integral<long long>();
test_integral<unsigned long long>();
+#ifdef _LIBCPP_INT128
+ test_integral<_LIBCPP_INT128>();
+ test_integral<_LIBCPP_UINT128>();
+#endif
}
Index: test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp
===================================================================
--- test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp
+++ test/utilities/meta/meta.unary/meta.unary.comp/integral.pass.cpp
@@ -49,4 +49,8 @@
test_integral<unsigned long>();
test_integral<long long>();
test_integral<unsigned long long>();
+#ifdef _LIBCPP_INT128
+ test_integral<_LIBCPP_INT128>();
+ test_integral<_LIBCPP_UINT128>();
+#endif
}
Index: test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
===================================================================
--- test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
+++ test/utilities/meta/meta.unary/meta.unary.prop/is_signed.pass.cpp
@@ -51,4 +51,9 @@
test_is_signed<int>();
test_is_signed<double>();
+
+#ifdef _LIBCPP_INT128
+ test_is_signed<_LIBCPP_INT128>();
+ test_is_not_signed<_LIBCPP_UINT128>();
+#endif
}
Index: test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
===================================================================
--- test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
+++ test/utilities/meta/meta.unary/meta.unary.prop/is_unsigned.pass.cpp
@@ -51,4 +51,9 @@
test_is_unsigned<bool>();
test_is_unsigned<unsigned>();
+
+#ifdef _LIBCPP_INT128
+ test_is_unsigned<_LIBCPP_UINT128>();
+ test_is_not_unsigned<_LIBCPP_INT128>();
+#endif
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D2917.1.patch
Type: text/x-patch
Size: 6952 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140302/d3a494c0/attachment.bin>
More information about the cfe-commits
mailing list