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

Symbian

开发平台:

C/C++

  1. /************************************************************************
  2.  * chxavcleanupstack.h
  3.  * -------------------
  4.  *
  5.  * Synopsis:
  6.  * Helpers for simplifying use of Symbian cleanup stack. Uses automatic objects
  7.  * to facilitate push/pop/destroy of cleanup stack objects. Use macros only.
  8.  *
  9.  * Target:
  10.  * Symbian OS
  11.  *
  12.  *
  13.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  14.  *
  15.  ************************************************************************/
  16. #ifndef _chxavcleanupstack_h_
  17. #define _chxavcleanupstack_h_
  18. // Symbian includes...
  19. #include <e32std.h>
  20. #include <eikenv.h>
  21. // Forward declarations...
  22. class CSPushPopDelL;
  23. class CSPushPopL;
  24. class CSPopDelL;
  25. class CSPopL;
  26. // make variable name something like "csvar1424"
  27. #define makevar_(var, line) csvar ## line
  28. #define makevar__(line) makevar_(var, line)
  29. //
  30. // AUTO_PUSH_POP_DEL
  31. //
  32. // Use when an object needs to be pushed, then later popped and deleted on exit from a given scope.
  33. //
  34. #define AUTO_PUSH_POP_DEL(p) CSPushPopDelL makevar__(__LINE__) (p);
  35. //
  36. // AUTO_PUSH_POP
  37. //
  38. // Use when an object needs to be pushed, then later popped on exit from a given scope. Typical
  39. // use case is when you are you intend to transfer ownership of a pointer (e.g., return value 
  40. // from function), in which case you do not want to delete the pointer.
  41. //
  42. #define AUTO_PUSH_POP(p)     CSPushPopL makevar__(__LINE__) (p);
  43. //
  44. // AUTO_POP_DEL
  45. //
  46. // Use when an object needs to be popped and deleted on exit from a given scope. Typical use case
  47. // is when you get a pointer that has already been pushed on the cleanup stack for you (e.g., after
  48. // receiving a pointer from a function ending in LC()).
  49. //
  50. #define AUTO_POP_DEL(p)      CSPopDelL makevar__(__LINE__) (p);
  51. //
  52. // AUTO_POP
  53. //
  54. // Use when an object needs to be popped from the cleanup stack on exit from a given scope.
  55. //
  56. #define AUTO_POP(p)          CSPopL makevar__(__LINE__) (p);
  57. //
  58. // AUTO_PUSH_POP_CLOSE_DEL
  59. //
  60. // Use when an object needs to be auto-closed on exit from a given scope (typically use with R objects).
  61. //
  62. #define AUTO_PUSH_POP_CLOSE(item)  CSPushPopCloseL makevar__(__LINE__) (item);
  63. #include <stdlib.h>
  64. // CSPushPopDelL, Use the macro only.
  65. class CSPushPopDelL
  66. {
  67. public:
  68.     explicit CSPushPopDelL(CBase* p) { CleanupStack::PushL(p); }
  69.     CSPushPopDelL(TAny* p){ CleanupStack::PushL(p); };
  70.    
  71.      ~CSPushPopDelL() { CleanupStack::PopAndDestroy(); }
  72. private:
  73.     
  74.     void * operator new(size_t size);
  75. };
  76. // CSPushPopL, Use the macro only.
  77. class CSPushPopL
  78. {
  79. public:
  80.     explicit CSPushPopL(CBase* p) { CleanupStack::PushL(p); }
  81.     CSPushPopL(TAny* p){ CleanupStack::PushL(p); }; 
  82.     ~CSPushPopL() { CleanupStack::Pop(); }
  83. private:
  84.     void * operator new(size_t size);
  85. };
  86. // class CSPopDelL - use macro
  87. class CSPopDelL
  88. {
  89. public:
  90.     CSPopDelL(CBase* /*p*/) {/*no push*/}
  91.     CSPopDelL(TAny* /*p*/) {/*no push*/}
  92.     ~CSPopDelL() { CleanupStack::PopAndDestroy();}
  93. private:
  94.     void * operator new(size_t size); // stack only
  95. };
  96. // class CSPopL - use macro
  97. class CSPopL
  98. {
  99. public:
  100.     CSPopL(CBase* /*p*/) {/*no push*/}
  101.     CSPopL(TAny* /*p*/) {/*no push*/}
  102.     ~CSPopL() { CleanupStack::Pop(); /*no destroy*/}
  103. private:
  104.     void * operator new(size_t size); // stack only
  105. };
  106. // CSPushPopCloseL, Use the macro only.
  107. class CSPushPopCloseL
  108. {
  109. public:
  110.     explicit CSPushPopCloseL(RHandleBase& handle) { CleanupClosePushL(handle); }
  111.     
  112.      ~CSPushPopCloseL() { CleanupStack::PopAndDestroy(); /*calls Close()*/}
  113. private:
  114.     
  115.     void * operator new(size_t size);
  116. };
  117. #endif // _chxavcleanupstack_h_