Use perfect forwarding in templates where possible

This commit is contained in:
Robbert van der Helm
2021-05-17 01:02:45 +02:00
parent 883b6b7700
commit e974d1d2b1
5 changed files with 31 additions and 31 deletions
+2 -2
View File
@@ -382,7 +382,7 @@ class Vst3Sockets : public Sockets {
void add_audio_processor_and_listen( void add_audio_processor_and_listen(
size_t instance_id, size_t instance_id,
std::promise<void>& socket_listening_latch, std::promise<void>& socket_listening_latch,
F cb) { F&& cb) {
{ {
std::lock_guard lock(audio_processor_sockets_mutex); std::lock_guard lock(audio_processor_sockets_mutex);
audio_processor_sockets.try_emplace( audio_processor_sockets.try_emplace(
@@ -400,7 +400,7 @@ class Vst3Sockets : public Sockets {
// receiving buffers for all calls. This slightly reduces the amount of // receiving buffers for all calls. This slightly reduces the amount of
// allocations in the audio processing loop. // allocations in the audio processing loop.
audio_processor_sockets.at(instance_id) audio_processor_sockets.at(instance_id)
.template receive_messages<true>(std::nullopt, cb); .template receive_messages<true>(std::nullopt, std::forward<F>(cb));
} }
/** /**
@@ -138,8 +138,8 @@ class Vst3PlugViewProxyImpl : public Vst3PlugViewProxy {
* @see Vst3HostBridge::send_mutually_recursive_message * @see Vst3HostBridge::send_mutually_recursive_message
*/ */
template <typename T, typename F> template <typename T, typename F>
T run_gui_task(F f) { T run_gui_task(F fn) {
std::packaged_task<T()> do_call(std::move(f)); std::packaged_task<T()> do_call(std::move(fn));
std::future<T> do_call_response = do_call.get_future(); std::future<T> do_call_response = do_call.get_future();
// If `Vst3Bridge::send_mutually_recursive_message()` is currently being // If `Vst3Bridge::send_mutually_recursive_message()` is currently being
+2 -2
View File
@@ -210,13 +210,13 @@ class Vst3PluginBridge : PluginBridge<Vst3Sockets<std::jthread>> {
* @see Vst3PlugViewProxyImpl::run_gui_task * @see Vst3PlugViewProxyImpl::run_gui_task
*/ */
template <typename F> template <typename F>
bool maybe_run_on_mutual_recursion_thread(F& cb) { bool maybe_run_on_mutual_recursion_thread(F& fn) {
// We're handling an `F&` here because we cannot copy a // We're handling an `F&` here because we cannot copy a
// `packged_task()`, and we need to be able to move that actual task // `packged_task()`, and we need to be able to move that actual task
std::unique_lock mutual_recursion_lock(mutual_recursion_contexts_mutex); std::unique_lock mutual_recursion_lock(mutual_recursion_contexts_mutex);
if (!mutual_recursion_contexts.empty()) { if (!mutual_recursion_contexts.empty()) {
boost::asio::dispatch(*mutual_recursion_contexts.back(), boost::asio::dispatch(*mutual_recursion_contexts.back(),
std::move(cb)); std::move(fn));
return true; return true;
} else { } else {
return false; return false;
+4 -4
View File
@@ -333,8 +333,8 @@ class Vst3Bridge : public HostBridge {
* @see Vst3Bridge::send_mutually_recursive_message * @see Vst3Bridge::send_mutually_recursive_message
*/ */
template <typename T, typename F> template <typename T, typename F>
T do_mutual_recursion_on_gui_thread(F f) { T do_mutual_recursion_on_gui_thread(F fn) {
std::packaged_task<T()> do_call(std::move(f)); std::packaged_task<T()> do_call(std::move(fn));
std::future<T> do_call_response = do_call.get_future(); std::future<T> do_call_response = do_call.get_future();
// If the above function is currently being called from some thread, // If the above function is currently being called from some thread,
@@ -366,8 +366,8 @@ class Vst3Bridge : public HostBridge {
* @see Vst3Bridge::do_mutual_recursion_on_gui_thread * @see Vst3Bridge::do_mutual_recursion_on_gui_thread
*/ */
template <typename T, typename F> template <typename T, typename F>
T do_mutual_recursion_on_off_thread(F f) { T do_mutual_recursion_on_off_thread(F fn) {
std::packaged_task<T()> do_call(std::move(f)); std::packaged_task<T()> do_call(std::move(fn));
std::future<T> do_call_response = do_call.get_future(); std::future<T> do_call_response = do_call.get_future();
std::unique_lock lock(mutual_recursion_contexts_mutex); std::unique_lock lock(mutual_recursion_contexts_mutex);
+21 -21
View File
@@ -80,25 +80,25 @@ class Win32Thread {
* @param parameter The parameter passed to the entry point function. * @param parameter The parameter passed to the entry point function.
*/ */
template <typename Function, typename... Args> template <typename Function, typename... Args>
Win32Thread(Function&& f, Args&&... args) Win32Thread(Function&& fn, Args&&... args)
: handle( : handle(CreateThread(
CreateThread( nullptr,
nullptr, 0,
0, reinterpret_cast<LPTHREAD_START_ROUTINE>(
reinterpret_cast<LPTHREAD_START_ROUTINE>( win32_thread_trampoline),
win32_thread_trampoline), // `std::function` does not support functions with move
// `std::function` does not support functions with move // captures the function has to be copy-constructable.
// captures the function has to be copy-constructable. // Function2's unique_function lets us capture and move our
// Function2's unique_function lets us capture and move our // arguments to the lambda so we don't end up with dangling
// arguments to the lambda so we don't end up with dangling // references.
// references. new fu2::unique_function<void()>(
new fu2::unique_function<void()>( [f = std::forward<Function>(fn),
[f = std::move(f), ... args = std::move(args)]() mutable { ... args = std::forward<Args>(args)]() mutable {
f(std::move(args)...); f(std::forward<Args>(args)...);
}), }),
0, 0,
nullptr), nullptr),
CloseHandle) {} CloseHandle) {}
/** /**
* Join (or wait on, since this is WIn32) the thread on shutdown, just like * Join (or wait on, since this is WIn32) the thread on shutdown, just like
@@ -254,8 +254,8 @@ class MainContext {
* soon as possible, and thus we also won't return a future. * soon as possible, and thus we also won't return a future.
*/ */
template <typename F> template <typename F>
void schedule_task(F fn) { void schedule_task(F&& fn) {
boost::asio::post(context, std::move(fn)); boost::asio::post(context, std::forward<F>(fn));
} }
/** /**