1*01826a49SYabin Cui /* 2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates. 3*01826a49SYabin Cui * All rights reserved. 4*01826a49SYabin Cui * 5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the 6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found 7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree). 8*01826a49SYabin Cui */ 9*01826a49SYabin Cui #pragma once 10*01826a49SYabin Cui 11*01826a49SYabin Cui #include <utility> 12*01826a49SYabin Cui 13*01826a49SYabin Cui namespace pzstd { 14*01826a49SYabin Cui 15*01826a49SYabin Cui /** 16*01826a49SYabin Cui * Dismissable scope guard. 17*01826a49SYabin Cui * `Function` must be callable and take no parameters. 18*01826a49SYabin Cui * Unless `dismiss()` is called, the callable is executed upon destruction of 19*01826a49SYabin Cui * `ScopeGuard`. 20*01826a49SYabin Cui * 21*01826a49SYabin Cui * Example: 22*01826a49SYabin Cui * 23*01826a49SYabin Cui * auto guard = makeScopeGuard([&] { cleanup(); }); 24*01826a49SYabin Cui */ 25*01826a49SYabin Cui template <typename Function> 26*01826a49SYabin Cui class ScopeGuard { 27*01826a49SYabin Cui Function function; 28*01826a49SYabin Cui bool dismissed; 29*01826a49SYabin Cui 30*01826a49SYabin Cui public: ScopeGuard(Function && function)31*01826a49SYabin Cui explicit ScopeGuard(Function&& function) 32*01826a49SYabin Cui : function(std::move(function)), dismissed(false) {} 33*01826a49SYabin Cui dismiss()34*01826a49SYabin Cui void dismiss() { 35*01826a49SYabin Cui dismissed = true; 36*01826a49SYabin Cui } 37*01826a49SYabin Cui ~ScopeGuard()38*01826a49SYabin Cui ~ScopeGuard() noexcept { 39*01826a49SYabin Cui if (!dismissed) { 40*01826a49SYabin Cui function(); 41*01826a49SYabin Cui } 42*01826a49SYabin Cui } 43*01826a49SYabin Cui }; 44*01826a49SYabin Cui 45*01826a49SYabin Cui /// Creates a scope guard from `function`. 46*01826a49SYabin Cui template <typename Function> makeScopeGuard(Function && function)47*01826a49SYabin CuiScopeGuard<Function> makeScopeGuard(Function&& function) { 48*01826a49SYabin Cui return ScopeGuard<Function>(std::forward<Function>(function)); 49*01826a49SYabin Cui } 50*01826a49SYabin Cui } 51