// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #include namespace wpi { template class scope_exit { public: explicit scope_exit(F&& f) noexcept : m_f{std::forward(f)} {} ~scope_exit() { if (m_active) { m_f(); } } scope_exit(scope_exit&& rhs) noexcept : m_f{std::move(rhs.m_f)}, m_active{rhs.m_active} { rhs.release(); } scope_exit(const scope_exit&) = delete; scope_exit& operator=(const scope_exit&) = delete; void release() noexcept { m_active = false; } private: F m_f; bool m_active = true; }; } // namespace wpi