#include <iostream>
#include <memory>
namespace gsl
{
//
// GSL.util: utilities
//
// index type for all container indexes/subscripts/sizes
using index = std::ptrdiff_t;
// final_action allows you to ensure something gets run at the end of a scope
template <class F>
class final_action
{
public:
explicit final_action(F f) noexcept : f_(std::move(f)) {}
final_action(final_action&& other) noexcept : f_(std::move(other.f_)), invoke_(other.invoke_)
{
other.invoke_ = false;
}
final_action(const final_action&) = delete;
final_action& operator=(const final_action&) = delete;
final_action& operator=(final_action&&) = delete;
~final_action() noexcept
{
if (invoke_) f_();
}
private:
F f_;
bool invoke_{true};
};
// finally() - convenience function to generate a final_action
template <class F>
final_action<F> finally(const F& f) noexcept
{
return final_action<F>(f);
}
template <class F>
final_action<F> finally(F&& f) noexcept
{
return final_action<F>(std::forward<F>(f));
}
}
using namespace std;
void foo(bool & currState, bool newState)
{
auto revertState = gsl::finally([prevState = currState, &currState]{
currState = prevState;
});
currState = newState;
cout << "currState: " << currState << endl;
}
int main() {
bool state = false;
foo(state, true);
cout << "state: " << state << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKbmFtZXNwYWNlIGdzbAp7Ci8vCi8vIEdTTC51dGlsOiB1dGlsaXRpZXMKLy8KCi8vIGluZGV4IHR5cGUgZm9yIGFsbCBjb250YWluZXIgaW5kZXhlcy9zdWJzY3JpcHRzL3NpemVzCnVzaW5nIGluZGV4ID0gc3RkOjpwdHJkaWZmX3Q7CgovLyBmaW5hbF9hY3Rpb24gYWxsb3dzIHlvdSB0byBlbnN1cmUgc29tZXRoaW5nIGdldHMgcnVuIGF0IHRoZSBlbmQgb2YgYSBzY29wZQp0ZW1wbGF0ZSA8Y2xhc3MgRj4KY2xhc3MgZmluYWxfYWN0aW9uCnsKcHVibGljOgogICAgZXhwbGljaXQgZmluYWxfYWN0aW9uKEYgZikgbm9leGNlcHQgOiBmXyhzdGQ6Om1vdmUoZikpIHt9CgogICAgZmluYWxfYWN0aW9uKGZpbmFsX2FjdGlvbiYmIG90aGVyKSBub2V4Y2VwdCA6IGZfKHN0ZDo6bW92ZShvdGhlci5mXykpLCBpbnZva2VfKG90aGVyLmludm9rZV8pCiAgICB7CiAgICAgICAgb3RoZXIuaW52b2tlXyA9IGZhbHNlOwogICAgfQoKICAgIGZpbmFsX2FjdGlvbihjb25zdCBmaW5hbF9hY3Rpb24mKSA9IGRlbGV0ZTsKICAgIGZpbmFsX2FjdGlvbiYgb3BlcmF0b3I9KGNvbnN0IGZpbmFsX2FjdGlvbiYpID0gZGVsZXRlOwogICAgZmluYWxfYWN0aW9uJiBvcGVyYXRvcj0oZmluYWxfYWN0aW9uJiYpID0gZGVsZXRlOwoKICAgIH5maW5hbF9hY3Rpb24oKSBub2V4Y2VwdAogICAgewogICAgICAgIGlmIChpbnZva2VfKSBmXygpOwogICAgfQoKcHJpdmF0ZToKICAgIEYgZl87CiAgICBib29sIGludm9rZV97dHJ1ZX07Cn07CgovLyBmaW5hbGx5KCkgLSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIGZpbmFsX2FjdGlvbgp0ZW1wbGF0ZSA8Y2xhc3MgRj4KZmluYWxfYWN0aW9uPEY+IGZpbmFsbHkoY29uc3QgRiYgZikgbm9leGNlcHQKewogICAgcmV0dXJuIGZpbmFsX2FjdGlvbjxGPihmKTsKfQoKdGVtcGxhdGUgPGNsYXNzIEY+CmZpbmFsX2FjdGlvbjxGPiBmaW5hbGx5KEYmJiBmKSBub2V4Y2VwdAp7CiAgICByZXR1cm4gZmluYWxfYWN0aW9uPEY+KHN0ZDo6Zm9yd2FyZDxGPihmKSk7Cn0KCn0KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIGZvbyhib29sICYgY3VyclN0YXRlLCBib29sIG5ld1N0YXRlKQp7CiAgICBhdXRvIHJldmVydFN0YXRlID0gZ3NsOjpmaW5hbGx5KFtwcmV2U3RhdGUgPSBjdXJyU3RhdGUsICZjdXJyU3RhdGVdewogICAgICAgIGN1cnJTdGF0ZSA9IHByZXZTdGF0ZTsKICAgIH0pOwogICAgY3VyclN0YXRlICAgICAgPSBuZXdTdGF0ZTsgICAgCQogICAgY291dCA8PCAiY3VyclN0YXRlOiAiIDw8IGN1cnJTdGF0ZSA8PCBlbmRsOwp9CgoKaW50IG1haW4oKSB7CiAgICBib29sIHN0YXRlID0gZmFsc2U7CiAgICBmb28oc3RhdGUsIHRydWUpOwogICAgY291dCA8PCAic3RhdGU6ICIgPDwgc3RhdGUgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9