Ticket #2749: Multimethod.hpp

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

Multi method for boost::any

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