blob: 59ca94f14397dbae5dd6c2e2dc2be4f052bc03f7 [file] [log] [blame]
Jeff Thompsona28eed82013-08-22 16:21:10 -07001
2// Copyright 2000 John Maddock (john@johnmaddock.co.uk)
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt).
6//
7// See http://www.boost.org/libs/type_traits for most recent version including documentation.
8
9#ifndef BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
10#define BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED
11
12#include <ndnboost/config.hpp>
13#include <ndnboost/type_traits/is_function.hpp>
14#include <ndnboost/type_traits/add_pointer.hpp>
15
16namespace ndnboost {
17
18#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
19namespace detail {
20
21template<typename Function> struct function_traits_helper;
22
23template<typename R>
24struct function_traits_helper<R (*)(void)>
25{
26 BOOST_STATIC_CONSTANT(unsigned, arity = 0);
27 typedef R result_type;
28};
29
30template<typename R, typename T1>
31struct function_traits_helper<R (*)(T1)>
32{
33 BOOST_STATIC_CONSTANT(unsigned, arity = 1);
34 typedef R result_type;
35 typedef T1 arg1_type;
36 typedef T1 argument_type;
37};
38
39template<typename R, typename T1, typename T2>
40struct function_traits_helper<R (*)(T1, T2)>
41{
42 BOOST_STATIC_CONSTANT(unsigned, arity = 2);
43 typedef R result_type;
44 typedef T1 arg1_type;
45 typedef T2 arg2_type;
46 typedef T1 first_argument_type;
47 typedef T2 second_argument_type;
48};
49
50template<typename R, typename T1, typename T2, typename T3>
51struct function_traits_helper<R (*)(T1, T2, T3)>
52{
53 BOOST_STATIC_CONSTANT(unsigned, arity = 3);
54 typedef R result_type;
55 typedef T1 arg1_type;
56 typedef T2 arg2_type;
57 typedef T3 arg3_type;
58};
59
60template<typename R, typename T1, typename T2, typename T3, typename T4>
61struct function_traits_helper<R (*)(T1, T2, T3, T4)>
62{
63 BOOST_STATIC_CONSTANT(unsigned, arity = 4);
64 typedef R result_type;
65 typedef T1 arg1_type;
66 typedef T2 arg2_type;
67 typedef T3 arg3_type;
68 typedef T4 arg4_type;
69};
70
71template<typename R, typename T1, typename T2, typename T3, typename T4,
72 typename T5>
73struct function_traits_helper<R (*)(T1, T2, T3, T4, T5)>
74{
75 BOOST_STATIC_CONSTANT(unsigned, arity = 5);
76 typedef R result_type;
77 typedef T1 arg1_type;
78 typedef T2 arg2_type;
79 typedef T3 arg3_type;
80 typedef T4 arg4_type;
81 typedef T5 arg5_type;
82};
83
84template<typename R, typename T1, typename T2, typename T3, typename T4,
85 typename T5, typename T6>
86struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6)>
87{
88 BOOST_STATIC_CONSTANT(unsigned, arity = 6);
89 typedef R result_type;
90 typedef T1 arg1_type;
91 typedef T2 arg2_type;
92 typedef T3 arg3_type;
93 typedef T4 arg4_type;
94 typedef T5 arg5_type;
95 typedef T6 arg6_type;
96};
97
98template<typename R, typename T1, typename T2, typename T3, typename T4,
99 typename T5, typename T6, typename T7>
100struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7)>
101{
102 BOOST_STATIC_CONSTANT(unsigned, arity = 7);
103 typedef R result_type;
104 typedef T1 arg1_type;
105 typedef T2 arg2_type;
106 typedef T3 arg3_type;
107 typedef T4 arg4_type;
108 typedef T5 arg5_type;
109 typedef T6 arg6_type;
110 typedef T7 arg7_type;
111};
112
113template<typename R, typename T1, typename T2, typename T3, typename T4,
114 typename T5, typename T6, typename T7, typename T8>
115struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8)>
116{
117 BOOST_STATIC_CONSTANT(unsigned, arity = 8);
118 typedef R result_type;
119 typedef T1 arg1_type;
120 typedef T2 arg2_type;
121 typedef T3 arg3_type;
122 typedef T4 arg4_type;
123 typedef T5 arg5_type;
124 typedef T6 arg6_type;
125 typedef T7 arg7_type;
126 typedef T8 arg8_type;
127};
128
129template<typename R, typename T1, typename T2, typename T3, typename T4,
130 typename T5, typename T6, typename T7, typename T8, typename T9>
131struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9)>
132{
133 BOOST_STATIC_CONSTANT(unsigned, arity = 9);
134 typedef R result_type;
135 typedef T1 arg1_type;
136 typedef T2 arg2_type;
137 typedef T3 arg3_type;
138 typedef T4 arg4_type;
139 typedef T5 arg5_type;
140 typedef T6 arg6_type;
141 typedef T7 arg7_type;
142 typedef T8 arg8_type;
143 typedef T9 arg9_type;
144};
145
146template<typename R, typename T1, typename T2, typename T3, typename T4,
147 typename T5, typename T6, typename T7, typename T8, typename T9,
148 typename T10>
149struct function_traits_helper<R (*)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
150{
151 BOOST_STATIC_CONSTANT(unsigned, arity = 10);
152 typedef R result_type;
153 typedef T1 arg1_type;
154 typedef T2 arg2_type;
155 typedef T3 arg3_type;
156 typedef T4 arg4_type;
157 typedef T5 arg5_type;
158 typedef T6 arg6_type;
159 typedef T7 arg7_type;
160 typedef T8 arg8_type;
161 typedef T9 arg9_type;
162 typedef T10 arg10_type;
163};
164
165} // end namespace detail
166
167template<typename Function>
168struct function_traits :
169 public ndnboost::detail::function_traits_helper<typename ndnboost::add_pointer<Function>::type>
170{
171};
172
173#else
174
175namespace detail {
176
177template<unsigned N>
178struct type_of_size
179{
180 char elements[N];
181};
182
183template<typename R>
184type_of_size<1> function_arity_helper(R (*f)());
185
186template<typename R, typename T1>
187type_of_size<2> function_arity_helper(R (*f)(T1));
188
189template<typename R, typename T1, typename T2>
190type_of_size<3> function_arity_helper(R (*f)(T1, T2));
191
192template<typename R, typename T1, typename T2, typename T3>
193type_of_size<4> function_arity_helper(R (*f)(T1, T2, T3));
194
195template<typename R, typename T1, typename T2, typename T3, typename T4>
196type_of_size<5> function_arity_helper(R (*f)(T1, T2, T3, T4));
197
198template<typename R, typename T1, typename T2, typename T3, typename T4,
199 typename T5>
200type_of_size<6> function_arity_helper(R (*f)(T1, T2, T3, T4, T5));
201
202template<typename R, typename T1, typename T2, typename T3, typename T4,
203 typename T5, typename T6>
204type_of_size<7> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6));
205
206template<typename R, typename T1, typename T2, typename T3, typename T4,
207 typename T5, typename T6, typename T7>
208type_of_size<8> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7));
209
210template<typename R, typename T1, typename T2, typename T3, typename T4,
211 typename T5, typename T6, typename T7, typename T8>
212type_of_size<9> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8));
213
214template<typename R, typename T1, typename T2, typename T3, typename T4,
215 typename T5, typename T6, typename T7, typename T8, typename T9>
216type_of_size<10> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8,
217 T9));
218
219template<typename R, typename T1, typename T2, typename T3, typename T4,
220 typename T5, typename T6, typename T7, typename T8, typename T9,
221 typename T10>
222type_of_size<11> function_arity_helper(R (*f)(T1, T2, T3, T4, T5, T6, T7, T8,
223 T9, T10));
224} // end namespace detail
225
226// Won't work with references
227template<typename Function>
228struct function_traits
229{
230 BOOST_STATIC_CONSTANT(unsigned, arity = (sizeof(ndnboost::detail::function_arity_helper((Function*)0))-1));
231};
232
233#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
234}
235
236#endif // BOOST_TT_FUNCTION_TRAITS_HPP_INCLUDED