/* Copyright Barrett Adair 2016 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #ifndef CT_ASSERT #define CT_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) #endif //CT_ASSERT #ifdef CALLABLE_TRAITS_DISABLE_REFERENCE_QUALIFIERS #define LREF #define RREF #else #define LREF & #define RREF && #endif struct foo {}; namespace ct = callable_traits; int main() { { using f = void(foo::*)(); using l = void(foo::*)() LREF; using r = void(foo::*)() RREF ; using c = void(foo::*)() const; using cl = void(foo::*)() const LREF; using cr = void(foo::*)() const RREF; using v = void(foo::*)() volatile; using vl = void(foo::*)() volatile LREF; using vr = void(foo::*)() volatile RREF; using cv = void(foo::*)() const volatile; using cvl = void(foo::*)() const volatile LREF; using cvr = void(foo::*)() const volatile RREF; using va_f = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...); using va_l = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) LREF; using va_r = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) RREF ; using va_c = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const; using va_cl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const LREF; using va_cr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const RREF; using va_v = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile; using va_vl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile LREF; using va_vr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) volatile RREF; using va_cv = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile; using va_cvl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile LREF; using va_cvr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::*)(...) const volatile RREF; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(foo::* const &)(int&, int&&); using l = void(foo::* const &)(int&, int&&) LREF; using r = void(foo::* const &)(int&, int&&) RREF ; using c = void(foo::* const &)(int&, int&&) const; using cl = void(foo::* const &)(int&, int&&) const LREF; using cr = void(foo::* const &)(int&, int&&) const RREF; using v = void(foo::* const &)(int&, int&&) volatile; using vl = void(foo::* const &)(int&, int&&) volatile LREF; using vr = void(foo::* const &)(int&, int&&) volatile RREF; using cv = void(foo::* const &)(int&, int&&) const volatile; using cvl = void(foo::* const &)(int&, int&&) const volatile LREF; using cvr = void(foo::* const &)(int&, int&&) const volatile RREF; using va_f = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...); using va_l = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) LREF; using va_r = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) RREF ; using va_c = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const; using va_cl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const LREF; using va_cr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const RREF; using va_v = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile; using va_vl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile LREF; using va_vr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) volatile RREF; using va_cv = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile; using va_cvl = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile LREF; using va_cvr = void(CALLABLE_TRAITS_DEFAULT_VARARGS_CC foo::* const &)(int&, int&&, ...) const volatile RREF; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } #ifndef CALLABLE_TRAITS_DISABLE_ABOMINABLE_FUNCTIONS { using f = void(); using l = void() LREF; using r = void() RREF ; using c = void() const; using cl = void() const LREF; using cr = void() const RREF; using v = void() volatile; using vl = void() volatile LREF; using vr = void() volatile RREF; using cv = void() const volatile; using cvl = void() const volatile LREF; using cvr = void() const volatile RREF; using va_f = void(...); using va_l = void(...) LREF; using va_r = void(...) RREF ; using va_c = void(...) const; using va_cl = void(...) const LREF; using va_cr = void(...) const RREF; using va_v = void(...) volatile; using va_vl = void(...) volatile LREF; using va_vr = void(...) volatile RREF; using va_cv = void(...) const volatile; using va_cvl = void(...) const volatile LREF; using va_cvr = void(...) const volatile RREF; CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } #endif //#ifndef CALLABLE_TRAITS_DISABLE_ABOMINABLE_FUNCTIONS { using f = void(*)(); using l = void(* &)(); using r = void(* &&)(); using c = void(* const)(); using cl = void(* const &)(); using cr = void(* const &&)(); using v = void(* volatile)(); using vl = void(* volatile &)(); using vr = void(* volatile &&)(); using cv = void(* const volatile)(); using cvl = void(* const volatile &)(); using cvr = void(* const volatile &&)(); using va_f = void(* )(...); using va_l = void(* &)(...); using va_r = void(* &&)(...); using va_c = void(* const)(...); using va_cl = void(* const &)(...); using va_cr = void(* const &&)(...); using va_v = void(* volatile)(...); using va_vl = void(* volatile &)(...); using va_vr = void(* volatile &&)(...); using va_cv = void(* const volatile)(...); using va_cvl = void(* const volatile &)(...); using va_cvr = void(* const volatile &&)(...); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); CT_ASSERT(std::is_same>{}); } { using f = void(&)(); using va_f = void(&)(...); CT_ASSERT(std::is_same>{}); } }