#ifndef ELECTRON_SHELL_COMMON_CALLBACK_UTIL_H_
#define ELECTRON_SHELL_COMMON_CALLBACK_UTIL_H_
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback.h"
namespace electron {
namespace internal {
template <typename... Args>
class OnceCallbackHolder {
public:
explicit OnceCallbackHolder(base::OnceCallback<void(Args...)> cb)
: cb_(std::move(cb)) {}
void Run(Args... args) {
if (cb_)
std::move(cb_).Run(std::forward<Args>(args)...);
}
private:
base::OnceCallback<void(Args...)> cb_;
};
}
template <typename... Args>
base::RepeatingCallback<void(Args...)> AdaptCallbackForRepeating(
base::OnceCallback<void(Args...)> cb) {
using Holder = internal::OnceCallbackHolder<Args...>;
return base::BindRepeating(&Holder::Run,
std::make_unique<Holder>(std::move(cb)));
}
}
#endif