#pragma once #include #include #define JVALIDATE_CONCAT2(A, B) A##B #define JVALIDATE_CONCAT(A, B) JVALIDATE_CONCAT2(A, B) #define scoped_state(prop, value) \ auto JVALIDATE_CONCAT(scoped_state_, __LINE__) = detail::ScopedState(prop, value) namespace jvalidate::detail { class ScopedState { private: std::function reset_; public: template requires(std::is_constructible_v) ScopedState(T & prop, S value) : reset_([reset = prop, &prop]() { prop = reset; }) { prop = std::move(value); } ~ScopedState() { reset_(); } explicit operator bool() const { return true; } }; }