1 /* ///////////////////////////////////////////////////////////////////////
7 * Brief: is_func traits
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
12 #ifndef EXTL_TYPE_TRAITS_IS_FUNC_H
13 #define EXTL_TYPE_TRAITS_IS_FUNC_H
15 #ifndef EXTL_TYPE_TRAITS_IS_FUNC_SUPPORT
16 # error extl::is_func is not supported by current compiler.
19 /* ///////////////////////////////////////////////////////////////////////
24 #ifdef EXTL_TYPE_TRAITS_IS_FUNC_PTR_SUPPORT
25 # include "is_func_ptr.h"
28 /* ///////////////////////////////////////////////////////////////////////
31 #define EXTL_MUST_BE_FUNC(type) EXTL_MUST_BE_(is_func, type)
32 #define EXTL_MUST_BE_CV_FUNC(type) EXTL_MUST_BE_CV_(is_func, type)
34 #define EXTL_MUST_NOT_BE_FUNC(type) EXTL_MUST_NOT_BE_(is_func, type)
35 #define EXTL_MUST_NOT_BE_CV_FUNC(type) EXTL_MUST_NOT_BE_CV_(is_func, type)
36 /* ///////////////////////////////////////////////////////////////////////
41 #ifdef EXTL_TYPE_TRAITS_SUPPORT
42 /* //////////////////////////////////////////////////////////////////// */
44 # ifdef EXTL_TEMPLATE_PARTIAL_SPEC_SUPPORT
45 EXTL_BOOL_TRAIT_DEF_1(is_func
, is_func_ptr
<T
*>::value
)
46 /* exclude reference type */
47 EXTL_BOOL_TRAIT_PARTIAL_SPEC_1_1(typename_param_k T
, is_func
, T
&, e_false_v
)
50 char EXTL_CDECL
is_func_helper1(...);
51 template <typename_param_k T
>
52 T(* is_func_helper1(type_wrap
<T
>))[1];
54 yes_type EXTL_CDECL
is_func_helper2(...);
55 template <typename_param_k T
>
56 no_type
is_func_helper2(T (*)[1]); /* exclude function type */
58 EXTL_BOOL_TRAIT_DEF_1(is_func
, sizeof(is_func_helper2(is_func_helper1(type_wrap
<T
>()))) == sizeof(yes_type
))
60 EXTL_BOOL_TRAIT_SPEC_1(is_func
, void, e_false_v
)
61 # ifdef EXTL_CV_VOID_SPEC_SUPPORT
62 EXTL_BOOL_TRAIT_SPEC_1(is_func
, void const, e_false_v
)
63 EXTL_BOOL_TRAIT_SPEC_1(is_func
, void volatile, e_false_v
)
64 EXTL_BOOL_TRAIT_SPEC_1(is_func
, void const volatile, e_false_v
)
69 /* ///////////////////////////////////////////////////////////////////////
72 # ifdef EXTL_TYPE_TRAITS_TEST_ENABLE
73 # include "unit_test/is_func_test.h"
75 #endif /* EXTL_TYPE_TRAITS_SUPPORT */
77 /* ///////////////////////////////////////////////////////////////////////
82 /* //////////////////////////////////////////////////////////////////// */
83 #endif /* EXTL_TYPE_TRAITS_IS_FUNC_H */
84 /* //////////////////////////////////////////////////////////////////// */