fork(4) download
  1. #pragma once
  2. #include <functional>
  3. #include <memory>
  4.  
  5. namespace mezutils
  6. {
  7. template<typename Method>
  8. struct Delegated;
  9.  
  10. template< typename Return, typename ... Args >
  11. struct MethodInterface
  12. {
  13. virtual ~MethodInterface(){}
  14.  
  15. Return operator()( Args ... args )
  16. {
  17. return execute( args... );
  18. }
  19.  
  20. virtual Return execute( Args ... args ) = 0;
  21. };
  22.  
  23. template< typename Return, typename ... Args >
  24. struct SimpleMethod
  25. : public MethodInterface< Return, Args ... >
  26. {
  27. typedef Return (*Method)(Args ...);
  28. SimpleMethod( Return (*call)(Args ...) )
  29. : method( call )
  30. {}
  31.  
  32. Return execute( Args ... args )
  33. {
  34. return method( args ... );
  35. }
  36.  
  37. private:
  38. Method method;
  39. };
  40.  
  41. template<typename Owner, typename Return, typename ... Args >
  42. struct MemberMethod
  43. : public MethodInterface< Return, Args ... >
  44. {
  45. typedef Return (Owner::*Method)(Args ...);
  46. MemberMethod( Owner * object, Method call )
  47. : owner( object ), method( call )
  48. {}
  49.  
  50. Return execute( Args ... args )
  51. {
  52. return (owner->*method)( args ... );
  53. }
  54. private:
  55. Method method;
  56. Owner * owner;
  57. };
  58.  
  59. template<typename Owner, typename Return, typename ... Args >
  60. struct ConstMemberMethod
  61. : public MethodInterface< Return, Args ... >
  62. {
  63. typedef Return (Owner::*Method)(Args ...) const;
  64. ConstMemberMethod( Owner * object, Method call )
  65. : owner( object ), method( call )
  66. {}
  67.  
  68. Return execute( Args ... args )
  69. {
  70. return (owner->*method)( args ... );
  71. }
  72. private:
  73. Method method;
  74. Owner * owner;
  75. };
  76.  
  77. template<typename Owner, typename Return, typename ... Args >
  78. struct VolatileMemberMethod
  79. : public MethodInterface< Return, Args ... >
  80. {
  81. typedef Return (Owner::*Method)(Args ...) volatile;
  82. VolatileMemberMethod( Owner * object, Method call )
  83. : owner( object ), method( call )
  84. {}
  85.  
  86. Return execute( Args ... args )
  87. {
  88. return (owner->*method)( args ... );
  89. }
  90. private:
  91. Method method;
  92. Owner * owner;
  93. };
  94.  
  95. template< typename Return, typename ... Args >
  96. struct MethodExecutor
  97. {
  98. typedef MethodInterface< Return, Args ... > Interface;
  99. typedef std::shared_ptr<Interface> InterfacePtr;
  100.  
  101. MethodExecutor() throw ()
  102. {}
  103.  
  104. MethodExecutor( Return (*call)(Args ...) ) throw ()
  105. {
  106. executor = InterfacePtr(new SimpleMethod< Return, Args ... >( call ));
  107. }
  108.  
  109. template< typename Owner >
  110. MethodExecutor( Owner & owner, Return (Owner::*Member)( Args ... ) ) throw ()
  111. {
  112. executor = InterfacePtr(new MemberMethod< Owner, Return, Args ... >( &owner, Member ));
  113. }
  114.  
  115. template< typename Owner >
  116. MethodExecutor( Owner * owner, Return (Owner::*Member)( Args ... ) ) throw ()
  117. {
  118. executor = InterfacePtr(new MemberMethod< Owner, Return, Args ... >( owner, Member ));
  119. }
  120.  
  121. template< typename Owner >
  122. MethodExecutor( Owner & owner, Return (Owner::*Member)( Args ... ) const ) throw ()
  123. {
  124. executor = InterfacePtr(new ConstMemberMethod< Owner, Return, Args ... >( &owner, Member ));
  125. }
  126.  
  127. template< typename Owner >
  128. MethodExecutor( Owner * owner, Return (Owner::*Member)( Args ... ) const ) throw ()
  129. {
  130. executor = InterfacePtr(new ConstMemberMethod< Owner, Return, Args ... >( owner, Member ));
  131. }
  132.  
  133. template< typename Owner >
  134. MethodExecutor( Owner & owner, Return (Owner::*Member)( Args ... ) volatile ) throw ()
  135. {
  136. executor = InterfacePtr(new VolatileMemberMethod< Owner, Return, Args ... >( &owner, Member ));
  137. }
  138.  
  139. template< typename Owner >
  140. MethodExecutor( Owner * owner, Return (Owner::*Member)( Args ... ) volatile ) throw ()
  141. {
  142. executor = InterfacePtr(new VolatileMemberMethod< Owner, Return, Args ... >( owner, Member ));
  143. }
  144.  
  145. virtual ~MethodExecutor(){}
  146.  
  147. Return operator()( Args ... args )
  148. {
  149. return executor->execute( args ... );
  150. }
  151.  
  152. MethodExecutor & operator = ( Return (*Method)(Args...) )
  153. {
  154. executor = InterfacePtr(new SimpleMethod< Return, Args ... >( Method ));
  155. return *this;
  156. }
  157.  
  158. private:
  159. InterfacePtr executor;
  160. };
  161.  
  162. #define MEZ_CLASS_GET_FUNCTION_IMPL( \
  163. TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, CALL_OPT, X2, X3, X4) \
  164. template<class _Ret COMMA LIST(_CLASS_TYPE)> \
  165. struct Delegated<_Ret CALL_OPT (LIST(_TYPE))> \
  166. { \
  167. typedef MethodExecutor<_Ret COMMA LIST(_TYPE)> type; \
  168. };
  169.  
  170. #define MEZ_CLASS_GET_FUNCTION_IMPL_CALLS( \
  171. TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, CALL_OPT, X2, X3, X4) \
  172. _VARIADIC_CALL_OPT_X1(MEZ_CLASS_GET_FUNCTION_IMPL, \
  173. TEMPLATE_LIST, PADDING_LIST, LIST, COMMA, __cdecl, X2, X3, X4)
  174.  
  175. _VARIADIC_EXPAND_0X(MEZ_CLASS_GET_FUNCTION_IMPL_CALLS, , , , )
  176.  
  177. #undef MEZ_CLASS_GET_FUNCTION_IMPL_CALLS
  178. #undef MEZ_CLASS_GET_FUNCTION_IMPL
  179.  
  180. template< typename Function >
  181. class Delegate
  182. : public Delegated< Function >::type
  183. {
  184. typedef typename Delegated< Function >::type Base;
  185. public:
  186. Delegate()
  187. {
  188. }
  189.  
  190. Delegate( Function call )
  191. : Base( call )
  192. {
  193. }
  194.  
  195. template< typename Return, typename ... Args >
  196. Delegate( Return (*call)(Args ...) )
  197. : Base( call )
  198. {
  199. }
  200.  
  201. template< typename Owner, typename Return, typename ... Args >
  202. Delegate( Owner & owner, Return (Owner::*Member)( Args ... ) ) throw ()
  203. : Base( owner, Member )
  204. {
  205. }
  206.  
  207. template< typename Owner, typename Return, typename ... Args >
  208. Delegate( Owner * owner, Return (Owner::*Member)( Args ... ) ) throw ()
  209. : Base( owner, Member )
  210. {
  211. }
  212.  
  213. template< typename Owner, typename Return, typename ... Args >
  214. Delegate( Owner & owner, Return (Owner::*Member)( Args ... ) const ) throw ()
  215. : Base( owner, Member )
  216. {
  217. }
  218.  
  219. template< typename Owner, typename Return, typename ... Args >
  220. Delegate( Owner * owner, Return (Owner::*Member)( Args ... ) const ) throw ()
  221. : Base( owner, Member )
  222. {
  223. }
  224.  
  225. template< typename Owner, typename Return, typename ... Args >
  226. Delegate( Owner & owner, Return (Owner::*Member)( Args ... ) volatile ) throw ()
  227. : Base( owner, Member )
  228. {
  229. }
  230.  
  231. template< typename Owner, typename Return, typename ... Args >
  232. Delegate( Owner * owner, Return (Owner::*Member)( Args ... ) volatile ) throw ()
  233. : Base( owner, Member )
  234. {
  235. }
  236.  
  237. ~Delegate(){}
  238.  
  239. template< typename Return, typename ... Args >
  240. Delegate & operator = ( Return (*Method)(Args...) )
  241. {
  242. Base::operator = ( Method );
  243. return *this;
  244. }
  245.  
  246. Delegate & operator = ( Function call )
  247. {
  248. Base::operator = ( call );
  249. return *this;
  250. }
  251. };
  252. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:1:9: warning: #pragma once in main file [enabled by default]
 #pragma once
         ^
prog.cpp:175:21: error: expected constructor, destructor, or type conversion before ‘(’ token
  _VARIADIC_EXPAND_0X(MEZ_CLASS_GET_FUNCTION_IMPL_CALLS, , , , )
                     ^
prog.cpp:252:1: error: expected ‘}’ at end of input
 }
 ^
stdout
Standard output is empty