Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
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 : closure_(std::move(closure)) {}
50
52
53 explicit operator bool() const { return static_cast<bool>(closure_); }
54
56 auto old_closure = closure_;
57 closure_ = closure;
58 return old_closure;
59 }
60
62 fml::closure closure = closure_;
63 closure_ = nullptr;
64 return closure;
65 }
66
67 void Reset() {
68 if (closure_) {
69 closure_();
70 closure_ = nullptr;
71 }
72 }
73
74 private:
75 fml::closure closure_;
76
78};
79
80} // namespace fml
81
82#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:55
ScopedCleanupClosure(ScopedCleanupClosure &&other)
Definition closure.h:36
ScopedCleanupClosure(const fml::closure &closure)
Definition closure.h:45
fml::closure Release()
Definition closure.h:61
ScopedCleanupClosure(fml::closure &&closure)
Definition closure.h:48
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
Definition ref_ptr.h:261