/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). */ #pragma once #include namespace pzstd { /** * Dismissable scope guard. * `Function` must be callable and take no parameters. * Unless `dismiss()` is called, the callable is executed upon destruction of * `ScopeGuard`. * * Example: * * auto guard = makeScopeGuard([&] { cleanup(); }); */ template class ScopeGuard { Function function; bool dismissed; public: explicit ScopeGuard(Function&& function) : function(std::move(function)), dismissed(false) {} void dismiss() { dismissed = true; } ~ScopeGuard() noexcept { if (!dismissed) { function(); } } }; /// Creates a scope guard from `function`. template ScopeGuard makeScopeGuard(Function&& function) { return ScopeGuard(std::forward(function)); } }