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