Ticket #2749: Multimethod.3.hpp

File Multimethod.3.hpp, 86.9 KB (added by nowake@…, 14 years ago)

Update MultiMethod to enhance flexibility of return value.

Line 
1#ifndef SikiMultimethodH
2#define SikiMultimethodH
3/*---------------------------------------------------------------------------
4 Multimethod.hpp
5
6 ---------------------------------------------------------------------------
7 Copyright (C) 2009/01 - 2009 Nowake nowake@fircewinds.net
8
9----------------------------------------------------------------------------*/
10
11#include <vector>
12#include <map>
13#include <boost/type_traits.hpp>
14#include <boost/any.hpp>
15#include <boost/unordered_map.hpp>
16#include <loki/LokiTypeInfo.h>
17#include "MemberFunctionChecker.hpp" // http://groups.google.com/group/comp.lang.c++.moderated/tree/browse_frm/thread/4f7c7a96f9afbe44/c95a7b4c645e449f#doc_e5fbc9305539f699
18
19
20namespace Loki {
21 std::size_t hash_value(const TypeInfo& value) {
22 boost::hash<const std::type_info*> hasher;
23 return hasher(&(value.Get()));
24 }
25}
26
27///////////////////////////////////////////////////////////////////////////
28// multi method executor
29///////////////////////////////////////////////////////////////////////////
30struct Multimethod {
31 Multimethod() {};
32public:
33 template<typename holder_t> struct ArgumentTraits;
34 template<typename to_t>
35 struct ReturnTraits {
36 template<typename from_t>
37 static to_t result(from_t& value) { return value; };
38 template<typename from_t>
39 static to_t result(const from_t& value) { return value; };
40 };
41public: //////////////////////////////////////////////////////////////////////
42 class BadMultimethod : public std::bad_cast {
43 public:
44 virtual const char * what() const throw() {
45 return "Bad Multimethod apply: no entried argument set.";
46 };
47 };
48 ////////////////////////////////////////////////////////////////////////
49 template<typename R, typename T>
50 static R& find(const T& type1) {
51 /*
52 typedef boost::unordered_map<const T, R> map1;
53 /*/
54 typedef std::map<const T, R> map1;
55 //*/
56 static map1 rr;
57 std::pair<map1::iterator, bool> t1(rr.insert(make_pair(type1, static_cast<R>(0))));
58 return t1.first->second;
59 };
60 template<typename R, typename T>
61 static R& find(const T& type1, const T& type2) {
62 /*
63 typedef boost::unordered_map<const T, R> map1;
64 typedef boost::unordered_map<const T, map1> map2;
65 /*/
66 typedef std::map<const T, R> map1;
67 typedef std::map<const T, map1> map2;
68 //*/
69 static map2 rr;
70 std::pair<map2::iterator, bool> t2(rr.insert(make_pair(type2, map1())));
71 std::pair<map1::iterator, bool> t1(t2.first->second.insert(make_pair(type1, static_cast<R>(0))));
72 return t1.first->second;
73 };
74 template<typename R, typename T>
75 static R& find(const T& type1, const T& type2, const T& type3) {
76 /*
77 typedef boost::unordered_map<const T, R> map1;
78 typedef boost::unordered_map<const T, map1> map2;
79 typedef boost::unordered_map<const T, map2> map3;
80 /*/
81 typedef std::map<const T, R> map1;
82 typedef std::map<const T, map1> map2;
83 typedef std::map<const T, map2> map3;
84 //*/
85 static map3 rr;
86 std::pair<map3::iterator, bool> t3(rr.insert(make_pair(type3, map2())));
87 std::pair<map2::iterator, bool> t2(t3.first->second.insert(make_pair(type2, map1())));
88 std::pair<map1::iterator, bool> t1(t2.first->second.insert(make_pair(type1, static_cast<R>(0))));
89 return t1.first->second;
90 };
91 template<typename R, typename T>
92 static R& find(const T& type1, const T& type2, const T& type3, const T& type4) {
93 /*
94 typedef boost::unordered_map<const T, R> map1;
95 typedef boost::unordered_map<const T, map1> map2;
96 typedef boost::unordered_map<const T, map2> map3;
97 typedef boost::unordered_map<const T, map3> map4;
98 /*/
99 typedef std::map<const T, R> map1;
100 typedef std::map<const T, map1> map2;
101 typedef std::map<const T, map2> map3;
102 typedef std::map<const T, map3> map4;
103 //*/
104 static map4 rr;
105 std::pair<map4::iterator, bool> t4(rr.insert(make_pair(type4, map3())));
106 std::pair<map3::iterator, bool> t3(t4.first->second.insert(make_pair(type3, map2())));
107 std::pair<map2::iterator, bool> t2(t3.first->second.insert(make_pair(type2, map1())));
108 std::pair<map1::iterator, bool> t1(t2.first->second.insert(make_pair(type1, static_cast<R>(0))));
109 return t1.first->second;
110 };
111 /*template<typename T>
112 static T& find(const Loki::TypeInfo& type1, const Loki::TypeInfo& type2, const Loki::TypeInfo& type3, const Loki::TypeInfo& type4, const Loki::TypeInfo& type5) {
113 typedef std::map<const T, T> map1;
114 typedef std::map<const T, map1> map2;
115 typedef std::map<const T, map2> map3;
116 typedef std::map<const T, map3> map4;
117 typedef std::map<const T, map4> map5;
118 static map5 rr;
119 std::pair<map5::iterator, bool> t5(rr.insert(make_pair(type5, map4())));
120 std::pair<map4::iterator, bool> t4(t5.first->second.insert(make_pair(type4, map3())));
121 std::pair<map3::iterator, bool> t3(t4.first->second.insert(make_pair(type3, map2())));
122 std::pair<map2::iterator, bool> t2(t3.first->second.insert(make_pair(type2, map1())));
123 std::pair<map1::iterator, bool> t1(t2.first->second.insert(make_pair(type1, static_cast<T>(0))));
124 return t1.first->second;
125 };*/
126private: ////////////////////////////////////////////////////////////////////////
127 template<typename R, bool return_value, typename HHH, typename M00> struct filter00 {
128 static R trampoline(HHH& m00) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)()); };
129 };
130 template<typename R, typename HHH, typename M00> struct filter00<R, false, HHH, M00> {
131 static R trampoline(HHH& m00) { ArgumentTraits<HHH>::cast<M00&>(m00)(); return R(); };
132 };
133public:
134 template<typename R, typename HHH, typename M00>
135 static bool entry() {
136 struct Local {
137 static R trampoline(HHH& m00) {
138 return filter00<R, !(MemberFunctionChecker::is_call_possible<M00, void()>::value), HHH, M00>::trampoline(m00);
139 };
140 };
141 typedef R (*T00)(HHH&);
142 static bool t00((find<T00>(ArgumentTraits<HHH>::id<M00>()) = &Local::trampoline) != 0);
143 return true;
144 };
145 template<typename R, typename HHH>
146 static R apply(HHH& m00) {
147 typedef R (*T)(HHH&);
148 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
149 if (!t) throw BadMultimethod();
150 return t(m00);
151 };
152private: ////////////////////////////////////////////////////////////////////////
153 template<typename R, bool return_value, typename HHH, typename M00, typename A01> struct filter01 {
154 static R trampoline(HHH& m00, HHH& a01) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01))); };
155 static R trampoline(M00& m00, HHH& a01) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01))); };
156 static R trampoline(HHH& m00, A01& a01) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01)); };
157 };
158 template<typename R, typename HHH, typename M00, typename A01> struct filter01<R, false, HHH, M00, A01> {
159 static R trampoline(HHH& m00, HHH& a01) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01)); return R(); };
160 static R trampoline(M00& m00, HHH& a01) { m00(ArgumentTraits<HHH>::cast<A01&>(a01)); return R(); };
161 static R trampoline(HHH& m00, A01& a01) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01); return R(); };
162 };
163public:
164 template<typename R, typename HHH, typename M00, typename A01>
165 static bool entry() {
166 struct Local {
167 static R trampoline(HHH& m00, HHH& a01) {
168 return filter01<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01)>::value), HHH, M00, A01>::trampoline(m00, a01);
169 };
170 static R trampoline(M00& m00, HHH& a01) {
171 return filter01<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01)>::value), HHH, M00, A01>::trampoline(m00, a01);
172 };
173 static R trampoline(HHH& m00, A01& a01) {
174 return filter01<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01)>::value), HHH, M00, A01>::trampoline(m00, a01);
175 };
176 };
177 typedef R (*T00)(HHH&, HHH&);
178 static bool t00((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
179 typedef R (*T01)(M00&, HHH&);
180 static bool t01((find<T01>(ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
181 typedef R (*T02)(HHH&, A01&);
182 static bool t02((find<T02>(ArgumentTraits<HHH>::id<M00>()) = &Local::trampoline) != 0);
183 return true;
184 };
185 template<typename R, typename HHH>
186 static R apply(HHH& m00, HHH& a01) {
187 typedef R (*T)(HHH&, HHH&);
188 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
189 if (!t) throw BadMultimethod();
190 return t(m00, a01);
191 };
192 template<typename R, typename HHH, typename T00>
193 static R apply(T00& m00, HHH& a01, typename ArgumentTraits<HHH>::index_type* = 0) {
194 typedef R (*T)(T00&, HHH&);
195 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
196 if (!t) throw BadMultimethod();
197 return t(m00, a01);
198 };
199 template<typename R, typename HHH, typename T00>
200 static R apply(HHH& m00, T00& a01, typename ArgumentTraits<HHH>::index_type* = 0) {
201 typedef R (*T)(HHH&, T00&);
202 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
203 if (!t) throw BadMultimethod();
204 return t(m00, a01);
205 };
206 template<typename R, typename HHH, typename T00>
207 static R apply(const T00& m00, HHH& a01, typename ArgumentTraits<HHH>::index_type* = 0) {
208 typedef R (*T)(const T00&, HHH&);
209 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
210 if (!t) throw BadMultimethod();
211 return t(m00, a01);
212 };
213 template<typename R, typename HHH, typename T00>
214 static R apply(HHH& m00, const T00& a01, typename ArgumentTraits<HHH>::index_type* = 0) {
215 typedef R (*T)(HHH&, const T00&);
216 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
217 if (!t) throw BadMultimethod();
218 return t(m00, a01);
219 };
220private: ////////////////////////////////////////////////////////////////////////
221 template<typename R, bool return_value, typename HHH, typename M00, typename A01, typename A02> struct filter02 {
222 static R trampoline(HHH& m00, HHH& a01, HHH& a02) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02))); };
223 static R trampoline(M00& m00, HHH& a01, HHH& a02) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02))); };
224 static R trampoline(HHH& m00, A01& a01, HHH& a02) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02))); };
225 static R trampoline(HHH& m00, HHH& a01, A02& a02) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02)); };
226 static R trampoline(HHH& m00, A01& a01, A02& a02) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02)); };
227 static R trampoline(M00& m00, HHH& a01, A02& a02) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02)); };
228 static R trampoline(M00& m00, A01& a01, HHH& a02) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02))); };
229 };
230 template<typename R, typename HHH, typename M00, typename A01, typename A02> struct filter02<R, false, HHH, M00, A01, A02> {
231 static R trampoline(HHH& m00, HHH& a01, HHH& a02) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02)); return R(); };
232 static R trampoline(M00& m00, HHH& a01, HHH& a02) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02)); return R(); };
233 static R trampoline(HHH& m00, A01& a01, HHH& a02) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02)); return R(); };
234 static R trampoline(HHH& m00, HHH& a01, A02& a02) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02); return R(); };
235 static R trampoline(HHH& m00, A01& a01, A02& a02) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02); return R(); };
236 static R trampoline(M00& m00, HHH& a01, A02& a02) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02); return R(); };
237 static R trampoline(M00& m00, A01& a01, HHH& a02) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02)); return R(); };
238 };
239public:
240 template<typename R, typename HHH, typename M00, typename A01, typename A02>
241 static bool entry() {
242 struct Local {
243 static R trampoline(HHH& m00, HHH& a01, HHH& a02) {
244 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
245 };
246 static R trampoline(M00& m00, HHH& a01, HHH& a02) {
247 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
248 };
249 static R trampoline(HHH& m00, A01& a01, HHH& a02) {
250 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
251 };
252 static R trampoline(HHH& m00, HHH& a01, A02& a02) {
253 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
254 };
255 static R trampoline(HHH& m00, A01& a01, A02& a02) {
256 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
257 };
258 static R trampoline(M00& m00, HHH& a01, A02& a02) {
259 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
260 };
261 static R trampoline(M00& m00, A01& a01, HHH& a02) {
262 return filter02<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02)>::value), HHH, M00, A01, A02>::trampoline(m00, a01, a02);
263 };
264 };
265 typedef R (*T00)(HHH&, HHH&, HHH&);
266 static bool t00((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
267 typedef R (*T01)(M00&, HHH&, HHH&);
268 static bool t01((find<T01>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
269 typedef R (*T02)(HHH&, A01&, HHH&);
270 static bool t02((find<T02>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
271 typedef R (*T03)(HHH&, HHH&, A02&);
272 static bool t03((find<T02>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
273 typedef R (*T04)(HHH&, A01&, A02&);
274 static bool t04((find<T04>(ArgumentTraits<HHH>::id<M00>()) = &Local::trampoline) != 0);
275 typedef R (*T05)(M00&, HHH&, A02&);
276 static bool t05((find<T05>(ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
277 typedef R (*T06)(M00&, A01&, HHH&);
278 static bool t06((find<T06>(ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
279 return true;
280 };
281 template<typename R, typename HHH>
282 static R apply(HHH& m00, HHH& a01, HHH& a02) {
283 typedef R (*T)(HHH&, HHH&, HHH&);
284 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
285 if (!t) throw BadMultimethod();
286 return t(m00, a01, a02);
287 };
288 template<typename R, typename HHH, typename T00>
289 static R apply(T00& m00, HHH& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
290 typedef R (*T)(T00&, HHH&, HHH&);
291 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
292 if (!t) throw BadMultimethod();
293 return t(m00, a01, a02);
294 };
295 template<typename R, typename HHH, typename T00>
296 static R apply(HHH& m00, T00& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
297 typedef R (*T)(HHH&, T00&, HHH&);
298 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(ma02)));
299 if (!t) throw BadMultimethod();
300 return t(m00, a01, a02);
301 };
302 template<typename R, typename HHH, typename T00>
303 static R apply(HHH& m00, HHH& a01, T00& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
304 typedef R (*T)(const T00&, HHH&);
305 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
306 if (!t) throw BadMultimethod();
307 return t(m00, a01, a02);
308 };
309 template<typename R, typename HHH, typename T00, typename T01>
310 static R apply(HHH& m00, T00& a01, T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
311 typedef R (*T)(HHH&, T00&, T01&);
312 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
313 if (!t) throw BadMultimethod();
314 return t(m00, a01, a02);
315 };
316 template<typename R, typename HHH, typename T00, typename T01>
317 static R apply(T00& m00, HHH& a01, T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
318 typedef R (*T)(T00&, HHH&, T01&);
319 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
320 if (!t) throw BadMultimethod();
321 return t(m00, a01, a02);
322 };
323 template<typename R, typename HHH, typename T00, typename T01>
324 static R apply(T00& m00, T01& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
325 typedef R (*T)(T00&, T01&, HHH&);
326 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
327 if (!t) throw BadMultimethod();
328 return t(m00, a01, a02);
329 };
330 template<typename R, typename HHH, typename T00>
331 static R apply(const T00& m00, HHH& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
332 typedef R (*T)(const T00&, HHH&, HHH&);
333 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
334 if (!t) throw BadMultimethod();
335 return t(m00, a01, a02);
336 };
337 template<typename R, typename HHH, typename T00>
338 static R apply(HHH& m00, const T00& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
339 typedef R (*T)(HHH&, const T00&, HHH&);
340 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(ma02)));
341 if (!t) throw BadMultimethod();
342 return t(m00, a01, a02);
343 };
344 template<typename R, typename HHH, typename T00>
345 static R apply(HHH& m00, HHH& a01, const T00& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
346 typedef R (*T)(HHH&, HHH&, const T00);
347 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
348 if (!t) throw BadMultimethod();
349 return t(m00, a01, a02);
350 };
351 template<typename R, typename HHH, typename T00, typename T01>
352 static R apply(HHH& m00, const T00& a01, T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
353 typedef R (*T)(HHH&, const T00&, T01&);
354 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
355 if (!t) throw BadMultimethod();
356 return t(m00, a01, a02);
357 };
358 template<typename R, typename HHH, typename T00, typename T01>
359 static R apply(HHH& m00, T00& a01, const T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
360 typedef R (*T)(HHH&, T00&, const T01&);
361 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
362 if (!t) throw BadMultimethod();
363 return t(m00, a01, a02);
364 };
365 template<typename R, typename HHH, typename T00, typename T01>
366 static R apply(HHH& m00, const T00& a01, const T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
367 typedef R (*T)(HHH&, const T00&, const T01&);
368 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
369 if (!t) throw BadMultimethod();
370 return t(m00, a01, a02);
371 };
372 template<typename R, typename HHH, typename T00, typename T01>
373 static R apply(const T00& m00, HHH& a01, T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
374 typedef R (*T)(const T00&, HHH&, T01&);
375 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
376 if (!t) throw BadMultimethod();
377 return t(m00, a01, a02);
378 };
379 template<typename R, typename HHH, typename T00, typename T01>
380 static R apply(T00& m00, HHH& a01, const T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
381 typedef R (*T)(T00&, HHH&, const T01&);
382 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
383 if (!t) throw BadMultimethod();
384 return t(m00, a01, a02);
385 };
386 template<typename R, typename HHH, typename T00, typename T01>
387 static R apply(const T00& m00, HHH& a01, const T01& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
388 typedef R (*T)(const T00&, HHH&, const T01&);
389 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
390 if (!t) throw BadMultimethod();
391 return t(m00, a01, a02);
392 };
393 template<typename R, typename HHH, typename T00, typename T01>
394 static R apply(const T00& m00, T01& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
395 typedef R (*T)(const T00&, T01&, HHH&);
396 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
397 if (!t) throw BadMultimethod();
398 return t(m00, a01, a02);
399 };
400 template<typename R, typename HHH, typename T00, typename T01>
401 static R apply(T00& m00, const T01& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
402 typedef R (*T)(T00&, const T01&, HHH&);
403 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
404 if (!t) throw BadMultimethod();
405 return t(m00, a01, a02);
406 };
407 template<typename R, typename HHH, typename T00, typename T01>
408 static R apply(const T00& m00, const T01& a01, HHH& a02, typename ArgumentTraits<HHH>::index_type* = 0) {
409 typedef R (*T)(const T00&, const T01&, HHH&);
410 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
411 if (!t) throw BadMultimethod();
412 return t(m00, a01, a02);
413 };
414private: ////////////////////////////////////////////////////////////////////////
415 template<typename R, bool return_value, typename HHH, typename M00, typename A01, typename A02, typename A03> struct filter03 {
416 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03))); };
417 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03))); };
418 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03))); };
419 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03))); };
420 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03)); };
421 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03))); };
422 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03))); };
423 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03)); };
424 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A03&>(a03))); };
425 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03)); };
426 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03)); };
427 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03)); };
428 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03)); };
429 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A01&>(a02), a03)); };
430 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03) { return ReturnTraits<R>::result(m00(a01, a02, ArgumentTraits<HHH>::cast<A01&>(a03))); };
431 };
432 template<typename R, typename HHH, typename M00, typename A01, typename A02, typename A03> struct filter03<R, false, HHH, M00, A01, A02, A03> {
433 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
434 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
435 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
436 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
437 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03); return R(); };
438 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
439 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03)); return R(); };
440 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03); return R(); };
441 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A03&>(a03)); return R(); };
442 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03); return R(); };
443 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03); return R(); };
444 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03); return R(); };
445 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03); return R(); };
446 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03); return R(); };
447 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03) { m00(a01, a02, ArgumentTraits<HHH>::cast<A03&>(a03)); return R(); };
448 };
449public:
450 template<typename R, typename HHH, typename M00, typename A01, typename A02, typename A03>
451 static bool entry() {
452 struct Local {
453 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03) {
454 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
455 };
456 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03) {
457 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
458 };
459 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03) {
460 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
461 };
462 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03) {
463 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
464 };
465 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03) {
466 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
467 };
468 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03) {
469 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
470 };
471 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03) {
472 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
473 };
474 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03) {
475 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
476 };
477 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03) {
478 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
479 };
480 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03) {
481 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
482 };
483 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03) {
484 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
485 };
486 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03) {
487 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
488 };
489 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03) {
490 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
491 };
492 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03) {
493 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
494 };
495 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03) {
496 return filter03<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03)>::value), HHH, M00, A01, A02, A03>::trampoline(m00, a01, a02, a03);
497 };
498 };
499 typedef R (*T00)(HHH&, HHH&, HHH&, HHH&);
500 static bool t00((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
501 typedef R (*T01)(M00&, HHH&, HHH&, HHH&);
502 static bool t01((find<T01>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
503 typedef R (*T02)(HHH&, A01&, HHH&, HHH&);
504 static bool t02((find<T02>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
505 typedef R (*T03)(HHH&, HHH&, A02&, HHH&);
506 static bool t03((find<T03>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
507 typedef R (*T04)(HHH&, HHH&, HHH&, A03&);
508 static bool t04((find<T04>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
509 typedef R (*T05)(M00&, A01&, HHH&, HHH&);
510 static bool t05((find<T05>(ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
511 typedef R (*T06)(M00&, HHH&, A02&, HHH&);
512 static bool t06((find<T06>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
513 typedef R (*T07)(M00&, A01&, HHH&, HHH&);
514 static bool t07((find<T07>(ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
515 typedef R (*T08)(HHH&, A01&, A02&, A03&);
516 static bool t08((find<T08>(ArgumentTraits<HHH>::id<M00>()) = &Local::trampoline) != 0);
517 typedef R (*T09)(M00&, HHH&, A02&, A03&);
518 static bool t09((find<T09>(ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
519 typedef R (*T10)(M00&, A01&, HHH&, A03&);
520 static bool t10((find<T09>(ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
521 typedef R (*T11)(M00&, A01&, A02&, HHH&);
522 static bool t11((find<T09>(ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
523 return true;
524 };
525 template<typename R, typename HHH>
526 static R apply(HHH& m00, HHH& a01, HHH& a02, HHH& a03) {
527 typedef R (*T)(HHH&, HHH&, HHH&, HHH&);
528 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
529 if (!t) throw BadMultimethod();
530 return t(m00, a01, a02, a03);
531 };
532 template<typename R, typename HHH, typename T00>
533 static R apply(T00& m00, HHH& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
534 typedef R (*T)(T00&, HHH&, HHH&, HHH&);
535 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
536 if (!t) throw BadMultimethod();
537 return t(m00, a01, a02, a03);
538 };
539 template<typename R, typename HHH, typename T00>
540 static R apply(const T00& m00, HHH& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
541 typedef R (*T)(const T00&, HHH&, HHH&, HHH&);
542 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
543 if (!t) throw BadMultimethod();
544 return t(m00, a01, a02, a03);
545 };
546 template<typename R, typename HHH, typename T00>
547 static R apply(HHH& m00, T00& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
548 typedef R (*T)(HHH&, T00&, HHH&, HHH&);
549 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
550 if (!t) throw BadMultimethod();
551 return t(m00, a01, a02, a03);
552 };
553 template<typename R, typename HHH, typename T00>
554 static R apply(HHH& m00, const T00& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
555 typedef R (*T)(HHH&, const T00&, HHH&, HHH&);
556 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
557 if (!t) throw BadMultimethod();
558 return t(m00, a01, a02, a03);
559 };
560 template<typename R, typename HHH, typename T00>
561 static R apply(HHH& m00, HHH& a01, T00& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
562 typedef R (*T)(HHH&, HHH&, T00&, HHH&);
563 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
564 if (!t) throw BadMultimethod();
565 return t(m00, a01, a02, a03);
566 };
567 template<typename R, typename HHH, typename T00>
568 static R apply(HHH& m00, HHH& a01, const T00& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
569 typedef R (*T)(HHH&, HHH&, const T00&, HHH&);
570 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
571 if (!t) throw BadMultimethod();
572 return t(m00, a01, a02, a03);
573 };
574 template<typename R, typename HHH, typename T00>
575 static R apply(HHH& m00, HHH& a01, HHH& a02, T00& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
576 typedef R (*T)(HHH&, HHH&, HHH&, T00&);
577 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
578 if (!t) throw BadMultimethod();
579 return t(m00, a01, a02, a03);
580 };
581 template<typename R, typename HHH, typename T00>
582 static R apply(HHH& m00, HHH& a01, HHH& a02, const T00& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
583 typedef R (*T)(HHH&, HHH&, HHH&, const T00&);
584 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
585 if (!t) throw BadMultimethod();
586 return t(m00, a01, a02, a03);
587 };
588 template<typename R, typename HHH, typename T00, typename T01>
589 static R apply(T00& m00, T01& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
590 typedef R (*T)(T00&, T01&, HHH&, HHH&);
591 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
592 if (!t) throw BadMultimethod();
593 return t(m00, a01, a02, a03);
594 };
595 template<typename R, typename HHH, typename T00, typename T01>
596 static R apply(const T00& m00, T01& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
597 typedef R (*T)(const T00&, T01&, HHH&, HHH&);
598 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
599 if (!t) throw BadMultimethod();
600 return t(m00, a01, a02, a03);
601 };
602 template<typename R, typename HHH, typename T00, typename T01>
603 static R apply(T00& m00, const T01& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
604 typedef R (*T)(T00&, const T01&, HHH&, HHH&);
605 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
606 if (!t) throw BadMultimethod();
607 return t(m00, a01, a02, a03);
608 };
609 template<typename R, typename HHH, typename T00, typename T01>
610 static R apply(const T00& m00, const T01& a01, HHH& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
611 typedef R (*T)(const T00&, const T01&, HHH&, HHH&);
612 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
613 if (!t) throw BadMultimethod();
614 return t(m00, a01, a02, a03);
615 };
616 template<typename R, typename HHH, typename T00, typename T01>
617 static R apply(T00& m00, HHH& a01, T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
618 typedef R (*T)(T00&, HHH&, T01&, HHH&);
619 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
620 if (!t) throw BadMultimethod();
621 return t(m00, a01, a02, a03);
622 };
623 template<typename R, typename HHH, typename T00, typename T01>
624 static R apply(const T00& m00, HHH& a01, T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
625 typedef R (*T)(const T00&, HHH&, T01&, HHH&);
626 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
627 if (!t) throw BadMultimethod();
628 return t(m00, a01, a02, a03);
629 };
630 template<typename R, typename HHH, typename T00, typename T01>
631 static R apply(T00& m00, HHH& a01, const T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
632 typedef R (*T)(T00&, HHH&, const T01&, HHH&);
633 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
634 if (!t) throw BadMultimethod();
635 return t(m00, a01, a02, a03);
636 };
637 template<typename R, typename HHH, typename T00, typename T01>
638 static R apply(const T00& m00, HHH& a01, const T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
639 typedef R (*T)(const T00&, HHH&, const T01&, HHH&);
640 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03)));
641 if (!t) throw BadMultimethod();
642 return t(m00, a01, a02, a03);
643 };
644 template<typename R, typename HHH, typename T00, typename T01>
645 static R apply(T00& m00, HHH& a01, HHH& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
646 typedef R (*T)(T00&, HHH&, HHH&, T01&);
647 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
648 if (!t) throw BadMultimethod();
649 return t(m00, a01, a02, a03);
650 };
651 template<typename R, typename HHH, typename T00, typename T01>
652 static R apply(const T00& m00, HHH& a01, HHH& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
653 typedef R (*T)(const T00&, HHH&, HHH&, T01&);
654 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
655 if (!t) throw BadMultimethod();
656 return t(m00, a01, a02, a03);
657 };
658 template<typename R, typename HHH, typename T00, typename T01>
659 static R apply(T00& m00, HHH& a01, HHH& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
660 typedef R (*T)(T00&, HHH&, HHH&, const T01&);
661 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
662 if (!t) throw BadMultimethod();
663 return t(m00, a01, a02, a03);
664 };
665 template<typename R, typename HHH, typename T00, typename T01>
666 static R apply(const T00& m00, HHH& a01, HHH& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
667 typedef R (*T)(const T00&, HHH&, HHH&, const T01&);
668 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02)));
669 if (!t) throw BadMultimethod();
670 return t(m00, a01, a02, a03);
671 };
672 template<typename R, typename HHH, typename T00, typename T01>
673 static R apply(HHH& m00, T00& a01, T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
674 typedef R (*T)(HHH&, T00&, T01&, HHH&);
675 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a03)));
676 if (!t) throw BadMultimethod();
677 return t(m00, a01, a02, a03);
678 };
679 template<typename R, typename HHH, typename T00, typename T01>
680 static R apply(HHH& m00, const T00& a01, T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
681 typedef R (*T)(HHH&, const T00&, T01&, HHH&);
682 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a03)));
683 if (!t) throw BadMultimethod();
684 return t(m00, a01, a02, a03);
685 };
686 template<typename R, typename HHH, typename T00, typename T01>
687 static R apply(HHH& m00, T00& a01, const T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
688 typedef R (*T)(HHH&, T00&, const T01&, HHH&);
689 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a03)));
690 if (!t) throw BadMultimethod();
691 return t(m00, a01, a02, a03);
692 };
693 template<typename R, typename HHH, typename T00, typename T01>
694 static R apply(HHH& m00, const T00& a01, const T01& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
695 typedef R (*T)(HHH&, const T00&, const T01&, HHH&);
696 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a03)));
697 if (!t) throw BadMultimethod();
698 return t(m00, a01, a02, a03);
699 };
700 template<typename R, typename HHH, typename T00, typename T01>
701 static R apply(HHH& m00, T00& a01, HHH& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
702 typedef R (*T)(HHH&, T00&, HHH&, T01&);
703 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02)));
704 if (!t) throw BadMultimethod();
705 return t(m00, a01, a02, a03);
706 };
707 template<typename R, typename HHH, typename T00, typename T01>
708 static R apply(HHH& m00, const T00& a01, HHH& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
709 typedef R (*T)(HHH&, const T00&, HHH&, T01&);
710 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02)));
711 if (!t) throw BadMultimethod();
712 return t(m00, a01, a02, a03);
713 };
714 template<typename R, typename HHH, typename T00, typename T01>
715 static R apply(HHH& m00, T00& a01, HHH& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
716 typedef R (*T)(HHH&, T00&, HHH&, const T01&);
717 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02)));
718 if (!t) throw BadMultimethod();
719 return t(m00, a01, a02, a03);
720 };
721 template<typename R, typename HHH, typename T00, typename T01>
722 static R apply(HHH& m00, const T00& a01, HHH& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
723 typedef R (*T)(HHH&, const T00&, HHH&, const T01&);
724 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02)));
725 if (!t) throw BadMultimethod();
726 return t(m00, a01, a02, a03);
727 };
728 template<typename R, typename HHH, typename T00, typename T01>
729 static R apply(HHH& m00, HHH& a01, T00& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
730 typedef R (*T)(HHH&, HHH&, T00&, T01&);
731 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
732 if (!t) throw BadMultimethod();
733 return t(m00, a01, a02, a03);
734 };
735 template<typename R, typename HHH, typename T00, typename T01>
736 static R apply(HHH& m00, HHH& a01, const T00& a02, T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
737 typedef R (*T)(HHH&, HHH&, const T00&, T01&);
738 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
739 if (!t) throw BadMultimethod();
740 return t(m00, a01, a02, a03);
741 };
742 template<typename R, typename HHH, typename T00, typename T01>
743 static R apply(HHH& m00, HHH& a01, T00& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
744 typedef R (*T)(HHH&, HHH&, T00&, const T01&);
745 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
746 if (!t) throw BadMultimethod();
747 return t(m00, a01, a02, a03);
748 };
749 template<typename R, typename HHH, typename T00, typename T01>
750 static R apply(HHH& m00, HHH& a01, const T00& a02, const T01& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
751 typedef R (*T)(HHH&, HHH&, const T00&, const T01&);
752 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01)));
753 if (!t) throw BadMultimethod();
754 return t(m00, a01, a02, a03);
755 };
756 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
757 static R apply(HHH& m00, T00& a01, T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
758 typedef R (*T)(HHH&, T00&, T01&, T02&);
759 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
760 if (!t) throw BadMultimethod();
761 return t(m00, a01, a02, a03);
762 };
763 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
764 static R apply(HHH& m00, const T00& a01, T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
765 typedef R (*T)(HHH&, const T00&, T01&, T02&);
766 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
767 if (!t) throw BadMultimethod();
768 return t(m00, a01, a02, a03);
769 };
770 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
771 static R apply(HHH& m00, T00& a01, const T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
772 typedef R (*T)(HHH&, T00&, const T01&, T02&);
773 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
774 if (!t) throw BadMultimethod();
775 return t(m00, a01, a02, a03);
776 };
777 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
778 static R apply(HHH& m00, T00& a01, T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
779 typedef R (*T)(HHH&, T00&, T01&, const T02&);
780 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
781 if (!t) throw BadMultimethod();
782 return t(m00, a01, a02, a03);
783 };
784 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
785 static R apply(HHH& m00, const T00& a01, const T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
786 typedef R (*T)(HHH&, const T00&, const T01&, T02&);
787 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
788 if (!t) throw BadMultimethod();
789 return t(m00, a01, a02, a03);
790 };
791 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
792 static R apply(HHH& m00, const T00& a01, T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
793 typedef R (*T)(HHH&, const T00&, T01&, const T02&);
794 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
795 if (!t) throw BadMultimethod();
796 return t(m00, a01, a02, a03);
797 };
798 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
799 static R apply(HHH& m00, T00& a01, const T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
800 typedef R (*T)(HHH&, T00&, const T01&, const T02&);
801 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
802 if (!t) throw BadMultimethod();
803 return t(m00, a01, a02, a03);
804 };
805 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
806 static R apply(HHH& m00, const T00& a01, const T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
807 typedef R (*T)(HHH&, const T00&, const T01&, const T02&);
808 T t(find<T>(ArgumentTraits<HHH>::id(m00)));
809 if (!t) throw BadMultimethod();
810 return t(m00, a01, a02, a03);
811 };
812 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
813 static R apply(T00& m00, HHH& a01, T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
814 typedef R (*T)(T00&, HHH&, T01&, T02&);
815 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
816 if (!t) throw BadMultimethod();
817 return t(m00, a01, a02, a03);
818 };
819 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
820 static R apply(const T00& m00, HHH& a01, T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
821 typedef R (*T)(const T00&, HHH&, T01&, T02&);
822 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
823 if (!t) throw BadMultimethod();
824 return t(m00, a01, a02, a03);
825 };
826 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
827 static R apply(T00& m00, HHH& a01, const T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
828 typedef R (*T)(T00&, HHH&, const T01&, T02&);
829 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
830 if (!t) throw BadMultimethod();
831 return t(m00, a01, a02, a03);
832 };
833 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
834 static R apply(T00& m00, HHH& a01, T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
835 typedef R (*T)(T00&, HHH&, T01&, const T02&);
836 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
837 if (!t) throw BadMultimethod();
838 return t(m00, a01, a02, a03);
839 };
840 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
841 static R apply(const T00& m00, HHH& a01, const T01& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
842 typedef R (*T)(const T00&, HHH&, const T01&, T02&);
843 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
844 if (!t) throw BadMultimethod();
845 return t(m00, a01, a02, a03);
846 };
847 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
848 static R apply(const T00& m00, HHH& a01, T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
849 typedef R (*T)(const T00&, HHH&, T01&, const T02&);
850 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
851 if (!t) throw BadMultimethod();
852 return t(m00, a01, a02, a03);
853 };
854 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
855 static R apply(const T00& m00, HHH& a01, const T01& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
856 typedef R (*T)(const T00&, HHH&, const T01&, const T02&);
857 T t(find<T>(ArgumentTraits<HHH>::id(a01)));
858 if (!t) throw BadMultimethod();
859 return t(m00, a01, a02, a03);
860 };
861 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
862 static R apply(T00& m00, T01& a01, HHH& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
863 typedef R (*T)(T00&, T01&, HHH&, T02&);
864 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
865 if (!t) throw BadMultimethod();
866 return t(m00, a01, a02, a03);
867 };
868 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
869 static R apply(const T00& m00, T01& a01, HHH& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
870 typedef R (*T)(const T00&, T01&, HHH&, T02&);
871 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
872 if (!t) throw BadMultimethod();
873 return t(m00, a01, a02, a03);
874 };
875 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
876 static R apply(T00& m00, const T01& a01, HHH& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
877 typedef R (*T)(T00&, const T01&, HHH&, T02&);
878 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
879 if (!t) throw BadMultimethod();
880 return t(m00, a01, a02, a03);
881 };
882 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
883 static R apply(T00& m00, T01& a01, HHH& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
884 typedef R (*T)(T00&, T01&, HHH&, const T02&);
885 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
886 if (!t) throw BadMultimethod();
887 return t(m00, a01, a02, a03);
888 };
889 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
890 static R apply(const T00& m00, const T01& a01, HHH& a02, T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
891 typedef R (*T)(const T00&, const T01&, HHH&, T02&);
892 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
893 if (!t) throw BadMultimethod();
894 return t(m00, a01, a02, a03);
895 };
896 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
897 static R apply(const T00& m00, T01& a01, HHH& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
898 typedef R (*T)(const T00&, T01&, HHH&, const T02&);
899 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
900 if (!t) throw BadMultimethod();
901 return t(m00, a01, a02, a03);
902 };
903 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
904 static R apply(T00& m00, const T01& a01, HHH& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
905 typedef R (*T)(T00&, const T01&, HHH&, const T02&);
906 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
907 if (!t) throw BadMultimethod();
908 return t(m00, a01, a02, a03);
909 };
910 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
911 static R apply(const T00& m00, const T01& a01, HHH& a02, const T02& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
912 typedef R (*T)(const T00&, const T01&, HHH&, const T02&);
913 T t(find<T>(ArgumentTraits<HHH>::id(a02)));
914 if (!t) throw BadMultimethod();
915 return t(m00, a01, a02, a03);
916 };
917 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
918 static R apply(T00& m00, T01& a01, T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
919 typedef R (*T)(T00&, T01&, T02&, HHH&);
920 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
921 if (!t) throw BadMultimethod();
922 return t(m00, a01, a02, a03);
923 };
924 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
925 static R apply(const T00& m00, T01& a01, T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
926 typedef R (*T)(const T00&, T01&, T02&, HHH&);
927 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
928 if (!t) throw BadMultimethod();
929 return t(m00, a01, a02, a03);
930 };
931 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
932 static R apply(T00& m00, const T01& a01, T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
933 typedef R (*T)(T00&, const T01&, T02&, HHH&);
934 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
935 if (!t) throw BadMultimethod();
936 return t(m00, a01, a02, a03);
937 };
938 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
939 static R apply(T00& m00, T01& a01, const T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
940 typedef R (*T)(T00&, T01&, const T02&, HHH&);
941 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
942 if (!t) throw BadMultimethod();
943 return t(m00, a01, a02, a03);
944 };
945 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
946 static R apply(const T00& m00, const T01& a01, T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
947 typedef R (*T)(const T00&, const T01&, T02&, HHH&);
948 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
949 if (!t) throw BadMultimethod();
950 return t(m00, a01, a02, a03);
951 };
952 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
953 static R apply(const T00& m00, T01& a01, const T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
954 typedef R (*T)(const T00&, T01&, const T02&, HHH&);
955 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
956 if (!t) throw BadMultimethod();
957 return t(m00, a01, a02, a03);
958 };
959 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
960 static R apply(T00& m00, const T01& a01, const T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
961 typedef R (*T)(T00&, const T01&, const T02&, HHH&);
962 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
963 if (!t) throw BadMultimethod();
964 return t(m00, a01, a02, a03);
965 };
966 template<typename R, typename HHH, typename T00, typename T01, typename T02, typename T03>
967 static R apply(const T00& m00, const T01& a01, const T02& a02, HHH& a03, typename ArgumentTraits<HHH>::index_type* = 0) {
968 typedef R (*T)(const T00&, const T01&, const T02&, HHH&);
969 T t(find<T>(ArgumentTraits<HHH>::id(a03)));
970 if (!t) throw BadMultimethod();
971 return t(m00, a01, a02, a03);
972 };
973/*private: ////////////////////////////////////////////////////////////////////////
974 template<typename R, bool return_value, typename HHH, typename M00, typename A01, typename A02, typename A03, typename A04> struct filter04 {
975 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
976 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
977 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
978 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
979 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
980 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
981 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
982 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
983 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
984 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
985 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
986 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
987 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
988 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
989 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
990 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, a04)); };
991 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03, HHH& a04) { return ReturnTraits<R>::result(m00(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04))); };
992 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
993 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
994 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
995 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
996 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, a04)); };
997 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03, A04& a04) { return ReturnTraits<R>::result(ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03, a04)); };
998 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03, A04& a04) { return ReturnTraits<R>::result(m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, a04)); };
999 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03, A04& a04) { return ReturnTraits<R>::result(m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, a04)); };
1000 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03, A04& a04) { return ReturnTraits<R>::result(m00(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04)); };
1001 static R trampoline(M00& m00, A01& a01, A02& a02, A03& a03, HHH& a04) { return ReturnTraits<R>::result(m00(a01, a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04))); };
1002 };
1003 template<typename R, typename HHH, typename M00, typename A01, typename A02, typename A03, typename A04> struct filter04<R, false, HHH, M00, A01, A02, A03, A04> {
1004 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1005 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1006 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1007 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1008 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1009 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1010 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03, HHH& a04) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1011 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03, HHH& a04) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1012 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03, HHH& a04) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1013 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03, A04& a04) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1014 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1015 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1016 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1017 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1018 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1019 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), ArgumentTraits<HHH>::cast<A02&>(a02), a03, a04); return R(); };
1020 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03, HHH& a04) { m00(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1021 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03, HHH& a04) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1022 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03, A04& a04) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1023 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03, HHH& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1024 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1025 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, a04); return R(); };
1026 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03, A04& a04) { ArgumentTraits<HHH>::cast<M00&>(m00)(a01, a02, a03, a04); return R(); };
1027 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03, A04& a04) { m00(ArgumentTraits<HHH>::cast<A01&>(a01), a02, a03, a04); return R(); };
1028 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03, A04& a04) { m00(a01, ArgumentTraits<HHH>::cast<A02&>(a02), a03, a04); return R(); };
1029 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03, A04& a04) { m00(a01, a02, ArgumentTraits<HHH>::cast<A02&>(a03), a04); return R(); };
1030 static R trampoline(M00& m00, A01& a01, A02& a02, A03& a03, HHH& a04) { m00(a01, a02, a03, ArgumentTraits<HHH>::cast<A02&>(a04)); return R(); };
1031 };
1032public:
1033 template<typename R, typename HHH, typename M00, typename A01, typename A02, typename A03, typename A04>
1034 static bool entry() {
1035 struct Local {
1036 static R trampoline(HHH& m00, HHH& a01, HHH& a02, HHH& a03) {
1037 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1038 };
1039 static R trampoline(M00& m00, HHH& a01, HHH& a02, HHH& a03) {
1040 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1041 };
1042 static R trampoline(HHH& m00, A01& a01, HHH& a02, HHH& a03) {
1043 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1044 };
1045 static R trampoline(HHH& m00, HHH& a01, A02& a02, HHH& a03) {
1046 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1047 };
1048 static R trampoline(HHH& m00, HHH& a01, HHH& a02, A03& a03) {
1049 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1050 };
1051 static R trampoline(M00& m00, A01& a01, HHH& a02, HHH& a03) {
1052 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1053 };
1054 static R trampoline(M00& m00, HHH& a01, A02& a02, HHH& a03) {
1055 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1056 };
1057 static R trampoline(M00& m00, HHH& a01, HHH& a02, A03& a03) {
1058 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1059 };
1060 static R trampoline(HHH& m00, A01& a01, A02& a02, HHH& a03) {
1061 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1062 };
1063 static R trampoline(HHH& m00, A01& a01, HHH& a02, A03& a03) {
1064 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1065 };
1066 static R trampoline(HHH& m00, HHH& a01, A02& a02, A03& a03) {
1067 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1068 };
1069 static R trampoline(HHH& m00, A01& a01, A02& a02, A03& a03) {
1070 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1071 };
1072 static R trampoline(M00& m00, HHH& a01, A02& a02, A03& a03) {
1073 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1074 };
1075 static R trampoline(M00& m00, A01& a01, HHH& a02, A03& a03) {
1076 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1077 };
1078 static R trampoline(M00& m00, A01& a01, A02& a02, HHH& a03) {
1079 return filter04<R, !(MemberFunctionChecker::is_call_possible<M00, void(A01, A02, A03, A04)>::value), HHH, M00, A01, A02, A03, A04>::trampoline(m00, a01, a02, a03, a04);
1080 };
1081 };
1082 typedef R (*T00)(HHH&, HHH&, HHH&, HHH&, HHH&); static bool t00((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1083 typedef R (*T01)(M00&, HHH&, HHH&, HHH&, HHH&); static bool t01((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1084 typedef R (*T02)(HHH&, A01&, HHH&, HHH&, HHH&); static bool t02((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1085 typedef R (*T03)(HHH&, HHH&, A02&, HHH&, HHH&); static bool t03((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1086 typedef R (*T04)(HHH&, HHH&, HHH&, A03&, HHH&); static bool t04((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1087 typedef R (*T05)(HHH&, HHH&, HHH&, HHH&, A04&); static bool t05((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1088 typedef R (*T06)(M00&, A01&, HHH&, HHH&, HHH&); static bool t06((find<T00>(ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1089 typedef R (*T07)(M00&, HHH&, A02&, HHH&, HHH&); static bool t07((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1090 typedef R (*T08)(M00&, HHH&, HHH&, A03&, HHH&); static bool t08((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1091 typedef R (*T09)(M00&, HHH&, HHH&, HHH&, A04&); static bool t09((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1092 typedef R (*T0a)(HHH&, A01&, A02&, HHH&, HHH&); static bool t0a((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1093 typedef R (*T0b)(HHH&, A01&, HHH&, A03&, HHH&); static bool t0b((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1094 typedef R (*T0c)(HHH&, A01&, HHH&, HHH&, A04&); static bool t0c((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1095 typedef R (*T0d)(HHH&, HHH&, A02&, A03&, HHH&); static bool t0d((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1096 typedef R (*T0e)(HHH&, HHH&, A02&, HHH&, A04&); static bool t0e((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1097 typedef R (*T0f)(HHH&, HHH&, HHH&, A03&, A04&); static bool t0f((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
1098 typedef R (*T0g)(M00&, A01&, A02&, HHH&, HHH&); static bool t0g((find<T00>(ArgumentTraits<HHH>::id<A03>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1099 typedef R (*T0h)(M00&, A01&, HHH&, A03&, HHH&); static bool t0h((find<T00>(ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1100 typedef R (*T0i)(M00&, A01&, HHH&, HHH&, A04&); static bool t0i((find<T00>(ArgumentTraits<HHH>::id<A02>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1101 typedef R (*T0j)(M00&, HHH&, A02&, A03&, HHH&); static bool t0j((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1102 typedef R (*T0k)(M00&, HHH&, A02&, HHH&, A04&); static bool t0k((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1103 typedef R (*T0l)(M00&, HHH&, HHH&, A03&, A04&); static bool t0l((find<T00>(ArgumentTraits<HHH>::id<A01>(), ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
1104 typedef R (*T0m)(HHH&, A01&, A02&, A03&, HHH&); static bool t0m((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1105 typedef R (*T0n)(HHH&, A01&, A02&, HHH&, A04&); static bool t0n((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1106 typedef R (*T0o)(HHH&, HHH&, A02&, A03&, A04&); static bool t0o((find<T00>(ArgumentTraits<HHH>::id<M00>(), ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
1107 typedef R (*T0p)(M00&, A01&, A02&, A03&, HHH&); static bool t0p((find<T00>(ArgumentTraits<HHH>::id<A04>()) = &Local::trampoline) != 0);
1108 typedef R (*T0q)(M00&, A01&, A02&, HHH&, A04&); static bool t0q((find<T00>(ArgumentTraits<HHH>::id<A03>()) = &Local::trampoline) != 0);
1109 typedef R (*T0r)(M00&, A01&, HHH&, A03&, A04&); static bool t0r((find<T00>(ArgumentTraits<HHH>::id<A02>()) = &Local::trampoline) != 0);
1110 typedef R (*T0s)(M00&, HHH&, A02&, A03&, A04&); static bool t0s((find<T00>(ArgumentTraits<HHH>::id<A01>()) = &Local::trampoline) != 0);
1111 typedef R (*T0t)(HHH&, A01&, A02&, A03&, A04&); static bool t0t((find<T00>(ArgumentTraits<HHH>::id<M00>()) = &Local::trampoline) != 0);
1112 return true;
1113 };
1114 template<typename R, typename HHH>
1115 static R apply(HHH& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) {
1116 typedef R (*T)(HHH&, HHH&, HHH&, HHH&, HHH&);
1117 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1118 if (!t) throw BadMultimethod();
1119 return t(m00, a01, a02, a03, a04);
1120 };
1121 template<typename R, typename HHH, typename T00>
1122 static R apply(T00& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) {
1123 typedef R (*T)(T00&, HHH&, HHH&, HHH&, HHH&);
1124 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1125 if (!t) throw BadMultimethod();
1126 return t(m00, a01, a02, a03, a04);
1127 };
1128 template<typename R, typename HHH, typename T00>
1129 static R apply(const T00& m00, HHH& a01, HHH& a02, HHH& a03, HHH& a04) {
1130 typedef R (*T)(const T00&, HHH&, HHH&, HHH&, HHH&);
1131 T t(find<T>(ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1132 if (!t) throw BadMultimethod();
1133 return t(m00, a01, a02, a03, a04);
1134 };
1135 template<typename R, typename HHH, typename T00>
1136 static R apply(HHH& m00, T00& a01, HHH& a02, HHH& a03, HHH& a04) {
1137 typedef R (*T)(HHH&, T00&, HHH&, HHH&, HHH&);
1138 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1139 if (!t) throw BadMultimethod();
1140 return t(m00, a01, a02, a03, a04);
1141 };
1142 template<typename R, typename HHH, typename T00>
1143 static R apply(HHH& m00, const T00& a01, HHH& a02, HHH& a03, HHH& a04) {
1144 typedef R (*T)(HHH&, const T00&, HHH&, HHH&, HHH&);
1145 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1146 if (!t) throw BadMultimethod();
1147 return t(m00, a01, a02, a03, a04);
1148 };
1149
1150 template<typename R, typename HHH, typename T00>
1151 static R apply(HHH& m00, HHH& a01, T00& a02, HHH& a03, HHH& a04) {
1152 typedef R (*T)(HHH&, HHH&, T00&, HHH&, HHH&);
1153 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1154 if (!t) throw BadMultimethod();
1155 return t(m00, a01, a02, a03, a04);
1156 };
1157 template<typename R, typename HHH, typename T00>
1158 static R apply(HHH& m00, HHH& a01, const T00& a02, HHH& a03, HHH& a04) {
1159 typedef R (*T)(HHH&, HHH&, const T00&, HHH&, HHH&);
1160 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1161 if (!t) throw BadMultimethod();
1162 return t(m00, a01, a02, a03, a04);
1163 };
1164
1165 template<typename R, typename HHH, typename T00>
1166 static R apply(HHH& m00, HHH& a01, HHH& a02, T00& a03, HHH& a04) {
1167 typedef R (*T)(HHH&, HHH&, HHH&, T00&, HHH&);
1168 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a04)));
1169 if (!t) throw BadMultimethod();
1170 return t(m00, a01, a02, a03, a04);
1171 };
1172 template<typename R, typename HHH, typename T00>
1173 static R apply(HHH& m00, HHH& a01, HHH& a02, const T00& a03, HHH& a04) {
1174 typedef R (*T)(HHH&, HHH&, HHH&, const T00&, HHH&);
1175 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a04)));
1176 if (!t) throw BadMultimethod();
1177 return t(m00, a01, a02, a03, a04);
1178 };
1179
1180 template<typename R, typename HHH, typename T00>
1181 static R apply(HHH& m00, HHH& a01, HHH& a02, HHH& a03, T00& a04) {
1182 typedef R (*T)(HHH&, HHH&, HHH&, HHH&, T00&);
1183 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
1184 if (!t) throw BadMultimethod();
1185 return t(m00, a01, a02, a03, a04);
1186 };
1187 template<typename R, typename HHH, typename T00>
1188 static R apply(HHH& m00, HHH& a01, HHH& a02, HHH& a03, const T00& a04) {
1189 typedef R (*T)(HHH&, HHH&, HHH&, HHH&, const T00&);
1190 T t(find<T>(ArgumentTraits<HHH>::id(m00), ArgumentTraits<HHH>::id(a01), ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03)));
1191 if (!t) throw BadMultimethod();
1192 return t(m00, a01, a02, a03, a04);
1193 };
1194 template<typename R, typename HHH, typename T00, typename T01>
1195 static R apply(T00& m00, T01& a01, HHH& a02, HHH& a03, HHH& a04) {
1196 typedef R (*T)(T00&, T01&, HHH&, HHH&, HHH&);
1197 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1198 if (!t) throw BadMultimethod();
1199 return t(m00, a01, a02, a03, a04);
1200 };
1201 template<typename R, typename HHH, typename T00, typename T01>
1202 static R apply(const T00& m00, T01& a01, HHH& a02, HHH& a03, HHH& a04) {
1203 typedef R (*T)(const T00&, T01&, HHH&, HHH&, HHH&);
1204 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1205 if (!t) throw BadMultimethod();
1206 return t(m00, a01, a02, a03, a04);
1207 };
1208 template<typename R, typename HHH, typename T00, typename T01>
1209 static R apply(T00& m00, const T01& a01, HHH& a02, HHH& a03, HHH& a04) {
1210 typedef R (*T)(T00&, const T01&, HHH&, HHH&, HHH&);
1211 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1212 if (!t) throw BadMultimethod();
1213 return t(m00, a01, a02, a03, a04);
1214 };
1215 template<typename R, typename HHH, typename T00, typename T01>
1216 static R apply(const T00& m00, const T01& a01, HHH& a02, HHH& a03, HHH& a04) {
1217 typedef R (*T)(const T00&, const T01&, HHH&, HHH&, HHH&);
1218 T t(find<T>(ArgumentTraits<HHH>::id(a02), ArgumentTraits<HHH>::id(a03), ArgumentTraits<HHH>::id(a04)));
1219 if (!t) throw BadMultimethod();
1220 return t(m00, a01, a02, a03, a04);
1221 };
1222*/
1223
1224
1225
1226
1227
1228
1229};
1230
1231
1232///////////////////////////////////////////////////////////////////////////
1233template<> struct Multimethod::ArgumentTraits<boost::any> {
1234 typedef Loki::TypeInfo index_type;
1235 static Loki::TypeInfo id(boost::any& target) { return Loki::TypeInfo(target.type()); };
1236 template<typename target_t>
1237 static Loki::TypeInfo id() { return Loki::TypeInfo(typeid(target_t)); };
1238 template<typename type_t>
1239 static type_t cast(boost::any& operand) { return boost::any_cast<remove_reference<type_t>::type&>(operand); };
1240};
1241
1242#endif