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