From 27a7f7b73b707acc720f0df06cb8a94e8fa22a1c Mon Sep 17 00:00:00 2001 From: Gerhard Raven <gerhard.raven@nikhef.nl> Date: Mon, 25 Apr 2022 21:14:28 +0200 Subject: [PATCH] add move constructor to SynchronizedValue --- .../include/Kernel/SynchronizedValue.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Kernel/LHCbKernel/include/Kernel/SynchronizedValue.h b/Kernel/LHCbKernel/include/Kernel/SynchronizedValue.h index 1d052b0d662..8f1252a3bdc 100644 --- a/Kernel/LHCbKernel/include/Kernel/SynchronizedValue.h +++ b/Kernel/LHCbKernel/include/Kernel/SynchronizedValue.h @@ -59,6 +59,24 @@ namespace LHCb::cxx { return *this; } + SynchronizedValue( SynchronizedValue&& rhs ) { + static_assert( std::is_default_constructible_v<Value> ); // bound to hold, as otherwise we wouldn't get this + // far... so for 'documnentation purpose' really (C++20: + // turn into a `requires` clause )... + static_assert( std::is_move_assignable_v<Value> ); + auto lock = std::scoped_lock{rhs.m_mtx, m_mtx}; + m_obj = std::move( rhs.m_obj ); + } + + SynchronizedValue& operator=( SynchronizedValue&& rhs ) { + static_assert( std::is_move_assignable_v<Value> ); + if ( this != &rhs ) { + auto lock = std::scoped_lock{rhs.m_mtx, m_mtx}; + m_obj = std::move( rhs.m_obj ); + } + return *this; + } + template <typename F, typename... Args, typename = std::enable_if_t<std::is_invocable_v<F, Value&, Args...> && !std::is_invocable_v<F, const Value&, Args...>>> -- GitLab