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