[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