| 12345678910111213141516171819202122232425262728 |
- #pragma once
- #include <functional>
- #include <type_traits>
- #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<void()> reset_;
- public:
- template <typename T, typename S>
- requires(std::is_constructible_v<T, S>)
- ScopedState(T & prop, S value) : reset_([reset = prop, &prop]() { prop = reset; }) {
- prop = std::move(value);
- }
- ~ScopedState() { reset_(); }
- explicit operator bool() const { return true; }
- };
- }
|