RioEngine  0.1
My first attempt to create a 3D WYSIWYG Game Engine
FastDelegateBind.h
Go to the documentation of this file.
1 // FastDelegateBind.h
2 // Helper file for FastDelegates. Provides bind() function, enabling
3 // FastDelegates to be rapidly compared to programs using boost::function and boost::bind.
4 //
5 // Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp
6 //
7 // Original author: Jody Hagins.
8 // Minor changes by Don Clugston.
9 //
10 // Warning: The arguments to 'bind' are ignored! No actual binding is performed.
11 // The behaviour is equivalent to boost::bind only when the basic placeholder
12 // arguments _1, _2, _3, etc are used in order.
13 //
14 // HISTORY:
15 // 1.4 Dec 2004. Initial release as part of FastDelegate 1.4.
16 
17 
18 #ifndef FASTDELEGATEBIND_H
19 #define FASTDELEGATEBIND_H
20 #if _MSC_VER > 1000
21 #pragma once
22 #endif // _MSC_VER > 1000
23 
25 // FastDelegate bind()
26 //
27 // bind() helper function for boost compatibility.
28 // (Original author: Jody Hagins).
29 //
30 // Add another helper, so FastDelegate can be a dropin replacement
31 // for boost::bind (in a fair number of cases).
32 // Note the elipses, because boost::bind() takes place holders
33 // but FastDelegate does not care about them. Getting the place holder
34 // mechanism to work, and play well with boost is a bit tricky, so
35 // we do the "easy" thing...
36 // Assume we have the following code...
37 // using boost::bind;
38 // bind(&Foo:func, &foo, _1, _2);
39 // we should be able to replace the "using" with...
40 // using fastdelegate::bind;
41 // and everything should work fine...
43 
44 #ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX
45 
46 namespace fastdelegate {
47 
48 //N=0
49 template <class X, class Y, class RetType>
50 FastDelegate< RetType ( ) >
51 bind(
52  RetType (X::*func)( ),
53  Y * y,
54  ...)
55 {
56  return FastDelegate< RetType ( ) >(y, func);
57 }
58 
59 template <class X, class Y, class RetType>
60 FastDelegate< RetType ( ) >
61 bind(
62  RetType (X::*func)( ) const,
63  Y * y,
64  ...)
65 {
66  return FastDelegate< RetType ( ) >(y, func);
67 }
68 
69 //N=1
70 template <class X, class Y, class RetType, class Param1>
71 FastDelegate< RetType ( Param1 p1 ) >
72 bind(
73  RetType (X::*func)( Param1 p1 ),
74  Y * y,
75  ...)
76 {
77  return FastDelegate< RetType ( Param1 p1 ) >(y, func);
78 }
79 
80 template <class X, class Y, class RetType, class Param1>
81 FastDelegate< RetType ( Param1 p1 ) >
82 bind(
83  RetType (X::*func)( Param1 p1 ) const,
84  Y * y,
85  ...)
86 {
87  return FastDelegate< RetType ( Param1 p1 ) >(y, func);
88 }
89 
90 //N=2
91 template <class X, class Y, class RetType, class Param1, class Param2>
92 FastDelegate< RetType ( Param1 p1, Param2 p2 ) >
93 bind(
94  RetType (X::*func)( Param1 p1, Param2 p2 ),
95  Y * y,
96  ...)
97 {
98  return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func);
99 }
100 
101 template <class X, class Y, class RetType, class Param1, class Param2>
102 FastDelegate< RetType ( Param1 p1, Param2 p2 ) >
103 bind(
104  RetType (X::*func)( Param1 p1, Param2 p2 ) const,
105  Y * y,
106  ...)
107 {
108  return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func);
109 }
110 
111 //N=3
112 template <class X, class Y, class RetType, class Param1, class Param2, class Param3>
113 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >
114 bind(
115  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ),
116  Y * y,
117  ...)
118 {
119  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func);
120 }
121 
122 template <class X, class Y, class RetType, class Param1, class Param2, class Param3>
123 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >
124 bind(
125  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ) const,
126  Y * y,
127  ...)
128 {
129  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func);
130 }
131 
132 //N=4
133 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4>
134 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >
135 bind(
136  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ),
137  Y * y,
138  ...)
139 {
140  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func);
141 }
142 
143 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4>
144 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >
145 bind(
146  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const,
147  Y * y,
148  ...)
149 {
150  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func);
151 }
152 
153 //N=5
154 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5>
155 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >
156 bind(
157  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ),
158  Y * y,
159  ...)
160 {
161  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func);
162 }
163 
164 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5>
165 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >
166 bind(
167  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const,
168  Y * y,
169  ...)
170 {
171  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func);
172 }
173 
174 //N=6
175 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
176 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >
177 bind(
178  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ),
179  Y * y,
180  ...)
181 {
182  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func);
183 }
184 
185 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6>
186 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >
187 bind(
188  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const,
189  Y * y,
190  ...)
191 {
192  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func);
193 }
194 
195 //N=7
196 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7>
197 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >
198 bind(
199  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ),
200  Y * y,
201  ...)
202 {
203  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func);
204 }
205 
206 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7>
207 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >
208 bind(
209  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const,
210  Y * y,
211  ...)
212 {
213  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func);
214 }
215 
216 //N=8
217 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8>
218 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >
219 bind(
220  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ),
221  Y * y,
222  ...)
223 {
224  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func);
225 }
226 
227 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8>
228 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >
229 bind(
230  RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const,
231  Y * y,
232  ...)
233 {
234  return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func);
235 }
236 
237 
238 #endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX
239 
240 } // namespace fastdelegate
241 
242 #endif // !defined(FASTDELEGATEBIND_H)
243