hscope.h 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #ifndef HW_SCOPE_H_
  2. #define HW_SCOPE_H_
  3. #include <functional>
  4. #include "hdef.h"
  5. class ScopeCleanup {
  6. public:
  7. typedef std::function<void()> FT;
  8. template<typename Fn, typename... Args>
  9. ScopeCleanup(Fn&& fn, Args&&... args) {
  10. cleanup_ = std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...);
  11. }
  12. ~ScopeCleanup() {
  13. cleanup_();
  14. }
  15. private:
  16. FT cleanup_;
  17. };
  18. template<typename T>
  19. class ScopeFree {
  20. public:
  21. ScopeFree(T* p) : _p(p) {}
  22. ~ScopeFree() {SAFE_FREE(_p);}
  23. private:
  24. T* _p;
  25. };
  26. template<typename T>
  27. class ScopeDelete {
  28. public:
  29. ScopeDelete(T* p) : _p(p) {}
  30. ~ScopeDelete() {SAFE_DELETE(_p);}
  31. private:
  32. T* _p;
  33. };
  34. template<typename T>
  35. class ScopeDeleteArray {
  36. public:
  37. ScopeDeleteArray(T* p) : _p(p) {}
  38. ~ScopeDeleteArray() {SAFE_DELETE_ARRAY(_p);}
  39. private:
  40. T* _p;
  41. };
  42. template<typename T>
  43. class ScopeRelease {
  44. public:
  45. ScopeRelease(T* p) : _p(p) {}
  46. ~ScopeRelease() {SAFE_RELEASE(_p);}
  47. private:
  48. T* _p;
  49. };
  50. template<typename T>
  51. class ScopeLock {
  52. public:
  53. ScopeLock(T& mutex) : _mutex(mutex) {_mutex.lock();}
  54. ~ScopeLock() {_mutex.unlock();}
  55. private:
  56. T& _mutex;
  57. };
  58. #endif // HW_SCOPE_H_