libpsynth 0.2.1
/home/raskolnikov/dev/psynth/trunk/src/psynth/old/FastDelegateBind.hpp
Go to the documentation of this file.
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