[Libreoffice-commits] core.git: include/com

Stephan Bergmann sbergman at redhat.com
Mon Jun 6 13:06:00 UTC 2016


 include/com/sun/star/uno/Any.h   |    5 +++++
 include/com/sun/star/uno/Any.hxx |   33 +++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

New commits:
commit 0fbe22a77289a624e1346ab457734c2f64f8e6fb
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Mon Jun 6 15:05:16 2016 +0200

    css::uno::Any move semantics (for LIBO_INTERNAL_ONLY)
    
    Change-Id: Ib582a744321e0f209395651ac2edffe30152ffba

diff --git a/include/com/sun/star/uno/Any.h b/include/com/sun/star/uno/Any.h
index 26127f4..d6c7477 100644
--- a/include/com/sun/star/uno/Any.h
+++ b/include/com/sun/star/uno/Any.h
@@ -135,6 +135,11 @@ public:
     */
     inline Any & SAL_CALL operator = ( const Any & rAny );
 
+#if defined LIBO_INTERNAL_ONLY
+    inline Any(Any && other);
+    inline Any & operator =(Any && other);
+#endif
+
     /** Gets the type of the set value.
 
         @return a Type object of the set value
diff --git a/include/com/sun/star/uno/Any.hxx b/include/com/sun/star/uno/Any.hxx
index 8859fa7..1e1f24e 100644
--- a/include/com/sun/star/uno/Any.hxx
+++ b/include/com/sun/star/uno/Any.hxx
@@ -21,6 +21,7 @@
 
 #include <sal/config.h>
 
+#include <algorithm>
 #include <cassert>
 #include <cstddef>
 #include <iomanip>
@@ -120,6 +121,38 @@ inline Any & Any::operator = ( const Any & rAny )
     return *this;
 }
 
+#if defined LIBO_INTERNAL_ONLY
+
+namespace detail {
+
+inline void moveAnyInternals(Any & from, Any & to) {
+    uno_any_construct(&to, nullptr, nullptr, &cpp_acquire);
+    std::swap(from.pType, to.pType);
+    std::swap(from.pData, to.pData);
+    std::swap(from.pReserved, to.pReserved);
+    if (to.pData == &from.pReserved) {
+        to.pData = &to.pReserved;
+    }
+    // This leaves to.pData (where "to" is now VOID) dangling to somewhere (cf.
+    // CONSTRUCT_EMPTY_ANY, cppu/source/uno/prim.hxx), but what's relevant is
+    // only that it isn't a nullptr (as e.g. >>= -> uno_type_assignData ->
+    // _assignData takes a null pSource to mean "construct a default value").
+}
+
+}
+
+Any::Any(Any && other) {
+    detail::moveAnyInternals(other, *this);
+}
+
+Any & Any::operator =(Any && other) {
+    uno_any_destruct(this, &cpp_release);
+    detail::moveAnyInternals(other, *this);
+    return *this;
+}
+
+#endif
+
 inline ::rtl::OUString Any::getValueTypeName() const
 {
     return ::rtl::OUString( pType->pTypeName );


More information about the Libreoffice-commits mailing list