Created
February 10, 2018 19:14
-
-
Save iscgar/7c80afe3cececbb4bdf1b8e118f4a2dd to your computer and use it in GitHub Desktop.
C++ Version of __builtin_types_compatible_p
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stddef.h> | |
namespace detail | |
{ | |
template<class, class> struct is_compatible { enum { value = 0 }; }; | |
template<class T> struct is_compatible<T, T> { enum { value = 1 }; }; | |
template<class T, size_t N> struct is_compatible<T[], T[N]> { enum { value = 1 }; }; | |
template<class T, size_t N> struct is_compatible<T[N], T[]> { enum { value = 1 }; }; | |
template<class T, class U> struct is_compatible<T, U const volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const volatile, U> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const, U const volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const volatile, U const> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T volatile, U const volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const volatile, U volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const, U volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T volatile, U const> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T, U const> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T const, U> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T, U volatile> : is_compatible<T, U> {}; | |
template<class T, class U> struct is_compatible<T volatile, U> : is_compatible<T, U> {}; | |
} | |
static_assert(detail::is_compatible<int, int>::value, ""); | |
static_assert(detail::is_compatible<int, const int>::value, ""); | |
static_assert(detail::is_compatible<const int, int>::value, ""); | |
static_assert(detail::is_compatible<int, volatile int>::value, ""); | |
static_assert(detail::is_compatible<volatile int, int>::value, ""); | |
static_assert(detail::is_compatible<const volatile int, int>::value, ""); | |
static_assert(detail::is_compatible<int, const volatile int>::value, ""); | |
static_assert(detail::is_compatible<const volatile int, const int>::value, ""); | |
static_assert(detail::is_compatible<const int, const volatile int>::value, ""); | |
static_assert(detail::is_compatible<const volatile int, volatile int>::value, ""); | |
static_assert(detail::is_compatible<volatile int, const volatile int>::value, ""); | |
static_assert(detail::is_compatible<int[], int[5]>::value, ""); | |
static_assert(detail::is_compatible<int[5], int[5]>::value, ""); | |
static_assert(!detail::is_compatible<const int*, int*>::value, ""); | |
static_assert(!detail::is_compatible<volatile int*, int*>::value, ""); | |
static_assert(!detail::is_compatible<int*, const int*>::value, ""); | |
static_assert(!detail::is_compatible<int*, volatile int*>::value, ""); | |
static_assert(!detail::is_compatible<int[5], int[6]>::value, ""); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment