chxavcommand.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:7k
源码类别:

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavcommand.h
  3.  * --------------
  4.  *
  5.  * Synopsis:
  6.  * Abstract interface for command objects.
  7.  * Concrete wrappers for calls to class member function:
  8.  * no-arg class member function object 
  9.  * one-arg class member function object
  10.  *   
  11.  * Example:
  12.  *
  13.  *  class Music
  14.  *  {
  15.  *  public:
  16.  * void SetEventAction(EventType type, const CHXAvCommand& cmd);
  17.  * ...
  18.  *   };
  19.  *
  20.  *   class Dancer
  21.  *   { ... };
  22.  *
  23.  *   void DoBreakDance() {...} // no args
  24.  *   void Bow(TInt count) {...} // one arg
  25.  *
  26.  *   void Dancer::Init(Music* pMusic)
  27.  *  {
  28.  * //
  29.  * // start break dancing when music begins,
  30.  * // bow three times when music ends
  31.  * //
  32.  * const CHXAvCommand& cmdStart = MakeCommand(this, &Dancer::DoBreakDance);
  33.  * const CHXAvCommand& cmdEnd = MakeCommand(this, &Dancer::Bow, 3);
  34.  * pMusic->SetEventAction(Music::OnBegin, cmdStart);
  35.  * pMusic->SetEventAction(Music::OnEnd, cmdEnd);
  36.  *  }
  37.  * 
  38.  *
  39.  *
  40.  * Target:
  41.  * Symbian OS
  42.  *
  43.  *
  44.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  45.  *
  46.  ************************************************************************/
  47.  
  48. #ifndef _chxavcommand_h_
  49. #define _chxavcommand_h_
  50. // Includes from this project...
  51. #include "chxavrefptr.h"
  52. //
  53. // class CHXAvCommand_
  54. //
  55. // command base class
  56. template<typename ReturnType>
  57. class CHXAvCommand_ 
  58. {
  59. public:
  60.     virtual ReturnType Execute() = 0;
  61.     virtual CHXAvCommand_* CloneL() const = 0;
  62.     virtual ~CHXAvCommand_() {};
  63. };
  64. // class CHXAvCommand
  65. typedef CHXAvCommand_<void> CHXAvCommand;
  66. typedef refptr<CHXAvCommand> CHXAvCommandPtr;
  67. // class CHXAvBoolCommand
  68. typedef CHXAvCommand_<bool> CHXAvBoolCommand;
  69. typedef refptr<CHXAvBoolCommand> CHXAvBoolCommandPtr;
  70. //
  71. // class CHXAvCommand0_
  72. //
  73. // call to member func that takes no args, has a return val
  74. template< typename ClassType, typename ReturnType >
  75. class CHXAvCommand0_ : public CHXAvCommand_<ReturnType>
  76. {
  77. public:
  78.     typedef ReturnType (ClassType::*PCMFN)();
  79.     CHXAvCommand0_(ClassType* pObject, PCMFN pMethod) : m_pObject(pObject), m_pMethod(pMethod) {}
  80.     ReturnType Execute()
  81.     {
  82.         return (m_pObject->*m_pMethod)();
  83.     }
  84.     CHXAvCommand_<ReturnType>* CloneL() const 
  85.     {
  86.         return new (ELeave) CHXAvCommand0_(*this);
  87.     }
  88. private:
  89.     ClassType* m_pObject;
  90.     PCMFN m_pMethod;
  91. };
  92. //
  93. // class CHXAvCommand1_
  94. //
  95. // call to member func that takes one arg, has a return val
  96. template< typename ClassType, typename ReturnType, typename ArgType >
  97. class CHXAvCommand1_ : public CHXAvCommand_<ReturnType>
  98. {
  99. public:
  100.     typedef ReturnType (ClassType::*PCMFN)(ArgType arg);
  101.     CHXAvCommand1_(ClassType* pObject, PCMFN pMethod, ArgType arg) 
  102.     : m_pObject(pObject), m_pMethod(pMethod), m_arg(arg) {}
  103.     ReturnType Execute()
  104.     {
  105.         return (m_pObject->*m_pMethod)(m_arg);
  106.     }
  107.     CHXAvCommand_<ReturnType>* CloneL() const
  108.     {
  109.         return new (ELeave) CHXAvCommand1_(*this);
  110.     }
  111. private:
  112.     ClassType* m_pObject;
  113.     PCMFN m_pMethod;
  114.     ArgType m_arg;
  115. };
  116. //
  117. // class CHXAvCommand0
  118. //
  119. // call to member func that takes no args, no return val
  120. template< typename ClassType>
  121. class CHXAvCommand0 : public CHXAvCommand
  122. {
  123. public:
  124.     typedef void (ClassType::*PCMFN)();
  125.     CHXAvCommand0(ClassType* pObject, PCMFN pMethod) 
  126.         : m_pObject(pObject), m_pMethod(pMethod) {}
  127.     void Execute()
  128.     {
  129.         (m_pObject->*m_pMethod)();
  130.     }
  131.     CHXAvCommand* CloneL() const 
  132.     {
  133.         return new (ELeave) CHXAvCommand0(*this);
  134.     }
  135. private:
  136.     ClassType* m_pObject;
  137.     PCMFN m_pMethod;
  138. };
  139. //
  140. // class CHXAvCommand1
  141. //
  142. // call to member func that takes one arg, no return val
  143. template< typename ClassType, typename ArgType >
  144. class CHXAvCommand1 : public CHXAvCommand
  145. {
  146. public:
  147.     typedef void (ClassType::*PCMFN)(ArgType arg);
  148.     CHXAvCommand1(ClassType* pObject, PCMFN pMethod, ArgType arg) 
  149.     : m_pObject(pObject), m_pMethod(pMethod), m_arg(arg) {}
  150.     void Execute()
  151.     {
  152.         (m_pObject->*m_pMethod)(m_arg);
  153.     }
  154.     CHXAvCommand* CloneL() const
  155.     {
  156.         return new (ELeave) CHXAvCommand1(*this);
  157.     }
  158. private:
  159.     ClassType* m_pObject;
  160.     PCMFN m_pMethod;
  161.     ArgType m_arg;
  162. };
  163. //
  164. // convenience helpers
  165. //
  166. // these save a few keystrokes (so you don't have to explicity
  167. // type out template args) and enhance readability
  168. //
  169. // MakeCommand(pMyClass, &MyClass::Dance, value)
  170. //
  171. // vs.
  172. //
  173. // CHXAvCommand0<MyClass, int>(pMyClass, &MyClass::Dance, value);
  174. //
  175. // *** note use of long-hand for handling void return; we assume recent C++ 
  176. // features (partial specializations, member fun templates, return void) 
  177. // not likely to be supported
  178. //
  179. // *** with return value ***
  180. //
  181. template< typename ClassType, typename ReturnType >
  182. inline
  183. CHXAvCommand0_ <ClassType, ReturnType> 
  184. MakeCommand_(  ClassType* pClass, ReturnType (ClassType::*pcmfn)() )
  185. {
  186.     return CHXAvCommand0_<ClassType, ReturnType>(pClass, pcmfn);
  187. }
  188. template< typename ClassType, typename ReturnType, typename ArgType>
  189. inline
  190. CHXAvCommand1_<ClassType, ReturnType, ArgType> 
  191. MakeCommand_(  ClassType* pClass, ReturnType (ClassType::*pcmfn)(ArgType), ArgType arg )
  192. {
  193.     return CHXAvCommand1_<ClassType, ReturnType, ArgType>(pClass, pcmfn, arg);
  194. }
  195. template< typename ClassType, typename ReturnType >
  196. inline
  197. CHXAvCommand0_ <ClassType, ReturnType> *
  198. AllocCommandL_(  ClassType* pClass, ReturnType (ClassType::*pcmfn)() )
  199. {
  200.     return new CHXAvCommand0_<ClassType, ReturnType>(pClass, pcmfn);
  201. }
  202. template< typename ClassType, typename ReturnType, typename ArgType>
  203. inline
  204. CHXAvCommand1_<ClassType, ReturnType, ArgType> *
  205. AllocCommandL_(  ClassType* pClass, ReturnType (ClassType::*pcmfn)(ArgType), ArgType arg )
  206. {
  207.     return new CHXAvCommand1_<ClassType, ReturnType, ArgType>(pClass, pcmfn, arg);
  208. }
  209. //
  210. // *** no return (void) ***
  211. //
  212. template< typename ClassType>
  213. inline
  214. CHXAvCommand0 <ClassType> 
  215. MakeCommand(  ClassType* pClass, void (ClassType::*pcmfn)() )
  216. {
  217.     return CHXAvCommand0<ClassType>(pClass, pcmfn);
  218. }
  219. template< typename ClassType,  typename ArgType>
  220. inline
  221. CHXAvCommand1<ClassType, ArgType> 
  222. MakeCommand(  ClassType* pClass, void (ClassType::*pcmfn)(ArgType), ArgType arg )
  223. {
  224.     return CHXAvCommand1<ClassType, ArgType>(pClass, pcmfn, arg);
  225. }
  226. template< typename ClassType>
  227. inline
  228. CHXAvCommand0 <ClassType> *
  229. AllocCommandL(  ClassType* pClass, void (ClassType::*pcmfn)() )
  230. {
  231.     return new (ELeave) CHXAvCommand0<ClassType>(pClass, pcmfn);
  232. }
  233. template< typename ClassType,  typename ArgType>
  234. inline
  235. CHXAvCommand1<ClassType, ArgType> *
  236. AllocCommandL(  ClassType* pClass, void (ClassType::*pcmfn)(ArgType), ArgType arg )
  237. {
  238.     return new (ELeave) CHXAvCommand1<ClassType, ArgType>(pClass, pcmfn, arg);
  239. }
  240. #endif // _chxavcommand_h_