|
libpsynth 0.2.1
|
00001 // FastDelegateBind.h 00002 // Helper file for FastDelegates. Provides bind() function, enabling 00003 // FastDelegates to be rapidly compared to programs using boost::function and boost::bind. 00004 // 00005 // Documentation is found at http://www.codeproject.com/cpp/FastDelegate.asp 00006 // 00007 // Original author: Jody Hagins. 00008 // Minor changes by Don Clugston. 00009 // 00010 // Warning: The arguments to 'bind' are ignored! No actual binding is performed. 00011 // The behaviour is equivalent to boost::bind only when the basic placeholder 00012 // arguments _1, _2, _3, etc are used in order. 00013 // 00014 // HISTORY: 00015 // 1.4 Dec 2004. Initial release as part of FastDelegate 1.4. 00016 00017 00018 #ifndef FASTDELEGATEBIND_H 00019 #define FASTDELEGATEBIND_H 00020 #if _MSC_VER > 1000 00021 #pragma once 00022 #endif // _MSC_VER > 1000 00023 00025 // FastDelegate bind() 00026 // 00027 // bind() helper function for boost compatibility. 00028 // (Original author: Jody Hagins). 00029 // 00030 // Add another helper, so FastDelegate can be a dropin replacement 00031 // for boost::bind (in a fair number of cases). 00032 // Note the elipses, because boost::bind() takes place holders 00033 // but FastDelegate does not care about them. Getting the place holder 00034 // mechanism to work, and play well with boost is a bit tricky, so 00035 // we do the "easy" thing... 00036 // Assume we have the following code... 00037 // using boost::bind; 00038 // bind(&Foo:func, &foo, _1, _2); 00039 // we should be able to replace the "using" with... 00040 // using fastdelegate::bind; 00041 // and everything should work fine... 00043 00044 #ifdef FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX 00045 00046 namespace fastdelegate { 00047 00048 //N=0 00049 template <class X, class Y, class RetType> 00050 FastDelegate< RetType ( ) > 00051 bind( 00052 RetType (X::*func)( ), 00053 Y * y, 00054 ...) 00055 { 00056 return FastDelegate< RetType ( ) >(y, func); 00057 } 00058 00059 template <class X, class Y, class RetType> 00060 FastDelegate< RetType ( ) > 00061 bind( 00062 RetType (X::*func)( ) const, 00063 Y * y, 00064 ...) 00065 { 00066 return FastDelegate< RetType ( ) >(y, func); 00067 } 00068 00069 //N=1 00070 template <class X, class Y, class RetType, class Param1> 00071 FastDelegate< RetType ( Param1 p1 ) > 00072 bind( 00073 RetType (X::*func)( Param1 p1 ), 00074 Y * y, 00075 ...) 00076 { 00077 return FastDelegate< RetType ( Param1 p1 ) >(y, func); 00078 } 00079 00080 template <class X, class Y, class RetType, class Param1> 00081 FastDelegate< RetType ( Param1 p1 ) > 00082 bind( 00083 RetType (X::*func)( Param1 p1 ) const, 00084 Y * y, 00085 ...) 00086 { 00087 return FastDelegate< RetType ( Param1 p1 ) >(y, func); 00088 } 00089 00090 //N=2 00091 template <class X, class Y, class RetType, class Param1, class Param2> 00092 FastDelegate< RetType ( Param1 p1, Param2 p2 ) > 00093 bind( 00094 RetType (X::*func)( Param1 p1, Param2 p2 ), 00095 Y * y, 00096 ...) 00097 { 00098 return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func); 00099 } 00100 00101 template <class X, class Y, class RetType, class Param1, class Param2> 00102 FastDelegate< RetType ( Param1 p1, Param2 p2 ) > 00103 bind( 00104 RetType (X::*func)( Param1 p1, Param2 p2 ) const, 00105 Y * y, 00106 ...) 00107 { 00108 return FastDelegate< RetType ( Param1 p1, Param2 p2 ) >(y, func); 00109 } 00110 00111 //N=3 00112 template <class X, class Y, class RetType, class Param1, class Param2, class Param3> 00113 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) > 00114 bind( 00115 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ), 00116 Y * y, 00117 ...) 00118 { 00119 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func); 00120 } 00121 00122 template <class X, class Y, class RetType, class Param1, class Param2, class Param3> 00123 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) > 00124 bind( 00125 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3 ) const, 00126 Y * y, 00127 ...) 00128 { 00129 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3 ) >(y, func); 00130 } 00131 00132 //N=4 00133 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4> 00134 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) > 00135 bind( 00136 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ), 00137 Y * y, 00138 ...) 00139 { 00140 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func); 00141 } 00142 00143 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4> 00144 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) > 00145 bind( 00146 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) const, 00147 Y * y, 00148 ...) 00149 { 00150 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4 ) >(y, func); 00151 } 00152 00153 //N=5 00154 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5> 00155 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) > 00156 bind( 00157 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ), 00158 Y * y, 00159 ...) 00160 { 00161 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func); 00162 } 00163 00164 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5> 00165 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) > 00166 bind( 00167 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) const, 00168 Y * y, 00169 ...) 00170 { 00171 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5 ) >(y, func); 00172 } 00173 00174 //N=6 00175 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> 00176 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) > 00177 bind( 00178 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ), 00179 Y * y, 00180 ...) 00181 { 00182 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func); 00183 } 00184 00185 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> 00186 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) > 00187 bind( 00188 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) const, 00189 Y * y, 00190 ...) 00191 { 00192 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6 ) >(y, func); 00193 } 00194 00195 //N=7 00196 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7> 00197 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) > 00198 bind( 00199 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ), 00200 Y * y, 00201 ...) 00202 { 00203 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func); 00204 } 00205 00206 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7> 00207 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) > 00208 bind( 00209 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) const, 00210 Y * y, 00211 ...) 00212 { 00213 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7 ) >(y, func); 00214 } 00215 00216 //N=8 00217 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8> 00218 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) > 00219 bind( 00220 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ), 00221 Y * y, 00222 ...) 00223 { 00224 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func); 00225 } 00226 00227 template <class X, class Y, class RetType, class Param1, class Param2, class Param3, class Param4, class Param5, class Param6, class Param7, class Param8> 00228 FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) > 00229 bind( 00230 RetType (X::*func)( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) const, 00231 Y * y, 00232 ...) 00233 { 00234 return FastDelegate< RetType ( Param1 p1, Param2 p2, Param3 p3, Param4 p4, Param5 p5, Param6 p6, Param7 p7, Param8 p8 ) >(y, func); 00235 } 00236 00237 00238 #endif //FASTDELEGATE_ALLOW_FUNCTION_TYPE_SYNTAX 00239 00240 } // namespace fastdelegate 00241 00242 #endif // !defined(FASTDELEGATEBIND_H) 00243
1.7.4