xref: /aosp_15_r20/external/gsc-utils/tpm_generated/callback.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker // Copyright 2024 The ChromiumOS Authors
2*4f2df630SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*4f2df630SAndroid Build Coastguard Worker // found in the LICENSE file.
4*4f2df630SAndroid Build Coastguard Worker 
5*4f2df630SAndroid Build Coastguard Worker #ifndef TPM_GENERATED_CALLBACK_H_
6*4f2df630SAndroid Build Coastguard Worker #define TPM_GENERATED_CALLBACK_H_
7*4f2df630SAndroid Build Coastguard Worker 
8*4f2df630SAndroid Build Coastguard Worker // tpm_generated was designed to use libchrome, but we can't use libchrome in
9*4f2df630SAndroid Build Coastguard Worker // AOSP. This implements just enough of libchrome's callback functionality to
10*4f2df630SAndroid Build Coastguard Worker // make tpm_generated work.
11*4f2df630SAndroid Build Coastguard Worker 
12*4f2df630SAndroid Build Coastguard Worker #include <functional>
13*4f2df630SAndroid Build Coastguard Worker 
14*4f2df630SAndroid Build Coastguard Worker namespace trunks {
15*4f2df630SAndroid Build Coastguard Worker 
16*4f2df630SAndroid Build Coastguard Worker template <typename Signature>
17*4f2df630SAndroid Build Coastguard Worker class OnceCallback;
18*4f2df630SAndroid Build Coastguard Worker 
19*4f2df630SAndroid Build Coastguard Worker template <typename R, typename... Args>
20*4f2df630SAndroid Build Coastguard Worker class OnceCallback<R(Args...)> {
21*4f2df630SAndroid Build Coastguard Worker  public:
OnceCallback(std::function<R (Args...)> function)22*4f2df630SAndroid Build Coastguard Worker   OnceCallback(std::function<R(Args...)> function) : inner_(function) {}
23*4f2df630SAndroid Build Coastguard Worker 
Run(Args...args)24*4f2df630SAndroid Build Coastguard Worker   R Run(Args... args) && { return inner_(args...); }
25*4f2df630SAndroid Build Coastguard Worker 
26*4f2df630SAndroid Build Coastguard Worker  private:
27*4f2df630SAndroid Build Coastguard Worker   std::function<R(Args...)> inner_;
28*4f2df630SAndroid Build Coastguard Worker };
29*4f2df630SAndroid Build Coastguard Worker 
30*4f2df630SAndroid Build Coastguard Worker template <typename R, typename Arg1, typename... Remaining>
BindOnce(R (* callback)(Arg1,Remaining...),Arg1 arg1)31*4f2df630SAndroid Build Coastguard Worker OnceCallback<R(Remaining...)> BindOnce(R (*callback)(Arg1, Remaining...),
32*4f2df630SAndroid Build Coastguard Worker                                        Arg1 arg1) {
33*4f2df630SAndroid Build Coastguard Worker   return OnceCallback<R(Remaining...)>(
34*4f2df630SAndroid Build Coastguard Worker       [callback, arg1](Remaining... remaining) {
35*4f2df630SAndroid Build Coastguard Worker         return callback(arg1, remaining...);
36*4f2df630SAndroid Build Coastguard Worker       });
37*4f2df630SAndroid Build Coastguard Worker }
38*4f2df630SAndroid Build Coastguard Worker 
39*4f2df630SAndroid Build Coastguard Worker template <typename R, typename Arg1, typename Arg2, typename... Remaining>
BindOnce(R (* callback)(Arg1,Arg2,Remaining...),Arg1 arg1,Arg2 arg2)40*4f2df630SAndroid Build Coastguard Worker OnceCallback<R(Remaining...)> BindOnce(R (*callback)(Arg1, Arg2, Remaining...),
41*4f2df630SAndroid Build Coastguard Worker                                        Arg1 arg1, Arg2 arg2) {
42*4f2df630SAndroid Build Coastguard Worker   return OnceCallback<R(Remaining...)>(
43*4f2df630SAndroid Build Coastguard Worker       [callback, arg1, arg2](Remaining... remaining) {
44*4f2df630SAndroid Build Coastguard Worker         return callback(arg1, arg2, remaining...);
45*4f2df630SAndroid Build Coastguard Worker       });
46*4f2df630SAndroid Build Coastguard Worker }
47*4f2df630SAndroid Build Coastguard Worker 
48*4f2df630SAndroid Build Coastguard Worker }  // namespace trunks
49*4f2df630SAndroid Build Coastguard Worker 
50*4f2df630SAndroid Build Coastguard Worker #endif  // TPM_GENERATED_CALLBACK_H_
51