Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
closure.h
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef FLUTTER_FML_CLOSURE_H_
6#define FLUTTER_FML_CLOSURE_H_
7
8#include <functional>
9
10#include "flutter/fml/macros.h"
11
12namespace fml {
13
14using closure = std::function<void()>;
15
16//------------------------------------------------------------------------------
17/// @brief Wraps a closure that is invoked in the destructor unless
18/// released by the caller.
19///
20/// This is especially useful in dealing with APIs that return a
21/// resource by accepting ownership of a sub-resource and a closure
22/// that releases that resource. When such APIs are chained, each
23/// link in the chain must check that the next member in the chain
24/// has accepted the resource. If not, it must invoke the closure
25/// eagerly. Not doing this results in a resource leak in the
26/// erroneous case. Using this wrapper, the closure can be released
27/// once the next call in the chain has successfully accepted
28/// ownership of the resource. If not, the closure gets invoked
29/// automatically at the end of the scope. This covers the cases
30/// where there are early returns as well.
31///
33 public:
35
37 closure_ = other.Release();
38 }
39
41 closure_ = other.Release();
42 return *this;
43 }
44
46 : closure_(closure) {}
47
49 if (closure_) {
50 closure_();
51 }
52 }
53
55 auto old_closure = closure_;
56 closure_ = closure;
57 return old_closure;
58 }
59
61 fml::closure closure = closure_;
62 closure_ = nullptr;
63 return closure;
64 }
65
66 private:
67 fml::closure closure_;
68
70};
71
72} // namespace fml
73
74#endif // FLUTTER_FML_CLOSURE_H_
Wraps a closure that is invoked in the destructor unless released by the caller.
Definition closure.h:32
fml::closure SetClosure(const fml::closure &closure)
Definition closure.h:54
ScopedCleanupClosure(ScopedCleanupClosure &&other)
Definition closure.h:36
ScopedCleanupClosure(const fml::closure &closure)
Definition closure.h:45
fml::closure Release()
Definition closure.h:60
ScopedCleanupClosure & operator=(ScopedCleanupClosure &&other)
Definition closure.h:40
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
std::function< void()> closure
Definition closure.h:14