diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2016-08-19 08:35:03 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2016-08-19 08:35:03 +0200 |
commit | 9bc591fa1e3723cee508e1484ad422fdef956d7d (patch) | |
tree | 247a03d1adecb0da730bdc603594fd9eba997551 | |
parent | 178153e8220aa3bf29078f6df4ed6acd0b2f61e4 (diff) |
cid#1371307: Move semantics for BinaryAny
Change-Id: I30b8bb71f8a9e093183ee85484ccd694f3e1e10d
-rw-r--r-- | binaryurp/source/binaryany.cxx | 31 | ||||
-rw-r--r-- | binaryurp/source/binaryany.hxx | 4 |
2 files changed, 35 insertions, 0 deletions
diff --git a/binaryurp/source/binaryany.cxx b/binaryurp/source/binaryany.cxx index f6fffc063541..a4163767ec3c 100644 --- a/binaryurp/source/binaryany.cxx +++ b/binaryurp/source/binaryany.cxx @@ -20,6 +20,7 @@ #include "sal/config.h" #include <cassert> +#include <utility> #include "typelib/typeclass.h" #include "typelib/typedescription.hxx" @@ -29,6 +30,26 @@ namespace binaryurp { +namespace { + +// Cf. com::sun::star::uno::detail::moveAnyInternals in +// include/com/sun/star/uno/Any.hxx: +void moveInternals(uno_Any & from, uno_Any & to) { + uno_any_construct(&to, nullptr, nullptr, nullptr); + 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"). +} + +} + BinaryAny::BinaryAny() throw () { uno_any_construct(&data_, nullptr, nullptr, nullptr); } @@ -52,6 +73,10 @@ BinaryAny::BinaryAny(BinaryAny const & other) throw () { uno_type_any_construct(&data_, other.data_.pData, other.data_.pType, nullptr); } +BinaryAny::BinaryAny(BinaryAny && other) throw () { + moveInternals(other.data_, data_); +} + BinaryAny::~BinaryAny() throw () { uno_any_destruct(&data_, nullptr); } @@ -63,6 +88,12 @@ BinaryAny & BinaryAny::operator =(BinaryAny const & other) throw () { return *this; } +BinaryAny & BinaryAny::operator =(BinaryAny && other) throw () { + uno_any_destruct(&data_, nullptr); + moveInternals(other.data_, data_); + return *this; +} + css::uno::TypeDescription BinaryAny::getType() const throw () { return css::uno::TypeDescription(data_.pType); } diff --git a/binaryurp/source/binaryany.hxx b/binaryurp/source/binaryany.hxx index 717216ae5473..1faf4841b79b 100644 --- a/binaryurp/source/binaryany.hxx +++ b/binaryurp/source/binaryany.hxx @@ -43,10 +43,14 @@ public: BinaryAny(BinaryAny const & other) throw (); + BinaryAny(BinaryAny && other) throw (); + ~BinaryAny() throw (); BinaryAny & operator =(BinaryAny const & other) throw (); + BinaryAny & operator =(BinaryAny && other) throw (); + uno_Any& get() throw () { return data_; } com::sun::star::uno::TypeDescription getType() const throw (); |