xref: /aosp_15_r20/external/gsc-utils/tpm_generated/callback.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
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