|  | // Copyright 2018 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef SRC_LIB_CALLBACK_CAPTURE_H_ | 
|  | #define SRC_LIB_CALLBACK_CAPTURE_H_ | 
|  |  | 
|  | #include <functional> | 
|  | #include <tuple> | 
|  | #include <utility> | 
|  |  | 
|  | namespace callback { | 
|  |  | 
|  | // Takes a callback, and a list of pointers. Returns a lambda that takes a list | 
|  | // of objects, saves these in the pointed variables and runs the callback. | 
|  | // If one wants to ignore one of the captured value, one can pass &std::ignore. | 
|  | template <typename C, typename... T> | 
|  | auto Capture(C callback, T*... ptrs) { | 
|  | return [callback = std::move(callback), ptrs...](auto&&... values) mutable { | 
|  | std::tie(*ptrs...) = std::make_tuple(std::forward<decltype(values)>(values)...); | 
|  | callback(); | 
|  | }; | 
|  | } | 
|  |  | 
|  | }  // namespace callback | 
|  |  | 
|  | #endif  // SRC_LIB_CALLBACK_CAPTURE_H_ |