hscope.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef H_SCOPE_H
  2. #define H_SCOPE_H
  3. #include "hdef.h"
  4. #include <functional>
  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 // H_SCOPE_H