#pragma once

template <typename Callback> class ScopeGuard
{
  public:
    ScopeGuard(const Callback& callback) : m_callback(callback)
    {
    }

    void deactivate()
    {
        m_activated = false;
    }

    ~ScopeGuard()
    {
        if (m_activated) m_callback();
    }

  private:
    bool m_activated { true };
    Callback m_callback;
};

template <typename Callback> [[nodiscard]] ScopeGuard<Callback> make_scope_guard(const Callback& callback)
{
    return { callback };
}