scoped_state.h 727 B

12345678910111213141516171819202122232425262728
  1. #pragma once
  2. #include <functional>
  3. #include <type_traits>
  4. #define JVALIDATE_CONCAT2(A, B) A##B
  5. #define JVALIDATE_CONCAT(A, B) JVALIDATE_CONCAT2(A, B)
  6. #define scoped_state(prop, value) \
  7. auto JVALIDATE_CONCAT(scoped_state_, __LINE__) = detail::ScopedState(prop, value)
  8. namespace jvalidate::detail {
  9. class ScopedState {
  10. private:
  11. std::function<void()> reset_;
  12. public:
  13. template <typename T, typename S>
  14. requires(std::is_constructible_v<T, S>)
  15. ScopedState(T & prop, S value) : reset_([reset = prop, &prop]() { prop = reset; }) {
  16. prop = std::move(value);
  17. }
  18. ~ScopedState() { reset_(); }
  19. explicit operator bool() const { return true; }
  20. };
  21. }