defer.h 997 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma once
  2. #include <functional>
  3. class defer_t final {
  4. public:
  5. template <typename F>
  6. explicit defer_t(F&& f) noexcept
  7. : f_ {
  8. std::forward<F>(f)
  9. }
  10. {
  11. }
  12. ~defer_t()
  13. {
  14. if (f_) {
  15. f_();
  16. }
  17. }
  18. defer_t(const defer_t&) = delete;
  19. defer_t& operator=(const defer_t&) = delete;
  20. defer_t(defer_t&& rhs) noexcept
  21. : f_ {
  22. std::move(rhs.f_)
  23. }
  24. {
  25. }
  26. defer_t& operator=(defer_t&& rhs) noexcept
  27. {
  28. f_ = std::move(rhs.f_);
  29. return *this;
  30. }
  31. private:
  32. std::function<void()> f_;
  33. };
  34. class defer_maker final {
  35. public:
  36. template <typename F>
  37. defer_t operator+(F&& f)
  38. {
  39. return defer_t {
  40. std::forward<F>(f)
  41. };
  42. }
  43. };
  44. #define DEFER_CONCAT_NAME(l, r) l##r
  45. #define DEFER_CREATE_NAME(l, r) DEFER_CONCAT_NAME(l, r)
  46. #define defer auto DEFER_CREATE_NAME(defer_, __COUNTER__) = defer_maker {} +
  47. #define defer_scope defer[&]