1
0

hscope.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #ifndef HV_SCOPE_H_
  2. #define HV_SCOPE_H_
  3. #include <functional>
  4. typedef std::function<void()> Function;
  5. #include "hdef.h"
  6. // same as golang defer
  7. class Defer {
  8. public:
  9. Defer(Function&& fn) : _fn(std::move(fn)) {}
  10. ~Defer() { if(_fn) _fn();}
  11. private:
  12. Function _fn;
  13. };
  14. #define defer(code) Defer STRINGCAT(_defer_, __LINE__)([&](){code});
  15. class ScopeCleanup {
  16. public:
  17. template<typename Fn, typename... Args>
  18. ScopeCleanup(Fn&& fn, Args&&... args) {
  19. _cleanup = std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...);
  20. }
  21. ~ScopeCleanup() {
  22. _cleanup();
  23. }
  24. private:
  25. Function _cleanup;
  26. };
  27. template<typename T>
  28. class ScopeFree {
  29. public:
  30. ScopeFree(T* p) : _p(p) {}
  31. ~ScopeFree() {SAFE_FREE(_p);}
  32. private:
  33. T* _p;
  34. };
  35. template<typename T>
  36. class ScopeDelete {
  37. public:
  38. ScopeDelete(T* p) : _p(p) {}
  39. ~ScopeDelete() {SAFE_DELETE(_p);}
  40. private:
  41. T* _p;
  42. };
  43. template<typename T>
  44. class ScopeDeleteArray {
  45. public:
  46. ScopeDeleteArray(T* p) : _p(p) {}
  47. ~ScopeDeleteArray() {SAFE_DELETE_ARRAY(_p);}
  48. private:
  49. T* _p;
  50. };
  51. template<typename T>
  52. class ScopeRelease {
  53. public:
  54. ScopeRelease(T* p) : _p(p) {}
  55. ~ScopeRelease() {SAFE_RELEASE(_p);}
  56. private:
  57. T* _p;
  58. };
  59. template<typename T>
  60. class ScopeLock {
  61. public:
  62. ScopeLock(T& mutex) : _mutex(mutex) {_mutex.lock();}
  63. ~ScopeLock() {_mutex.unlock();}
  64. private:
  65. T& _mutex;
  66. };
  67. #endif // HV_SCOPE_H_