1 // Copyright 2024 The ChromiumOS Authors
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 TPM_GENERATED_CALLBACK_H_
6 #define TPM_GENERATED_CALLBACK_H_
7
8 // tpm_generated was designed to use libchrome, but we can't use libchrome in
9 // AOSP. This implements just enough of libchrome's callback functionality to
10 // make tpm_generated work.
11
12 #include <functional>
13
14 namespace trunks {
15
16 template <typename Signature>
17 class OnceCallback;
18
19 template <typename R, typename... Args>
20 class OnceCallback<R(Args...)> {
21 public:
OnceCallback(std::function<R (Args...)> function)22 OnceCallback(std::function<R(Args...)> function) : inner_(function) {}
23
Run(Args...args)24 R Run(Args... args) && { return inner_(args...); }
25
26 private:
27 std::function<R(Args...)> inner_;
28 };
29
30 template <typename R, typename Arg1, typename... Remaining>
BindOnce(R (* callback)(Arg1,Remaining...),Arg1 arg1)31 OnceCallback<R(Remaining...)> BindOnce(R (*callback)(Arg1, Remaining...),
32 Arg1 arg1) {
33 return OnceCallback<R(Remaining...)>(
34 [callback, arg1](Remaining... remaining) {
35 return callback(arg1, remaining...);
36 });
37 }
38
39 template <typename R, typename Arg1, typename Arg2, typename... Remaining>
BindOnce(R (* callback)(Arg1,Arg2,Remaining...),Arg1 arg1,Arg2 arg2)40 OnceCallback<R(Remaining...)> BindOnce(R (*callback)(Arg1, Arg2, Remaining...),
41 Arg1 arg1, Arg2 arg2) {
42 return OnceCallback<R(Remaining...)>(
43 [callback, arg1, arg2](Remaining... remaining) {
44 return callback(arg1, arg2, remaining...);
45 });
46 }
47
48 } // namespace trunks
49
50 #endif // TPM_GENERATED_CALLBACK_H_
51