[wpiutil] Add wpi::scope_exit (#4432)

This is based on std::scope_exit in the C++ library fundamentals TS v3.
This commit is contained in:
Tyler Veness
2022-09-23 14:48:59 -07:00
committed by GitHub
parent 5ac658c8f0
commit 773198537c
3 changed files with 74 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
// 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 <utility>
namespace wpi {
template <typename F>
class scope_exit {
public:
explicit scope_exit(F&& f) noexcept : m_f{std::forward<F>(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