From 37041730170a0f4e99b501379b52e7c72e3f581a Mon Sep 17 00:00:00 2001 From: Felipe Magno de Almeida Date: Tue, 20 Dec 2016 15:26:35 -0300 Subject: [PATCH] eina-cxx: Add move constructor and move assignment operator for eina::variant CID 1362797 --- src/bindings/cxx/eina_cxx/eina_variant.hh | 38 +++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/bindings/cxx/eina_cxx/eina_variant.hh b/src/bindings/cxx/eina_cxx/eina_variant.hh index fb92954c65..df24aea433 100644 --- a/src/bindings/cxx/eina_cxx/eina_variant.hh +++ b/src/bindings/cxx/eina_cxx/eina_variant.hh @@ -99,7 +99,7 @@ struct copy_visitor new (buffer) T(other); } }; - + struct move_visitor { typedef void result_type; @@ -111,7 +111,7 @@ struct move_visitor new (buffer) type(std::move(other)); } }; - + struct assign_visitor { typedef void result_type; @@ -125,6 +125,19 @@ struct assign_visitor } }; +struct move_assign_visitor +{ + typedef void result_type; + void* buffer; + template + void operator()(T& other) const + { + typedef typename std::remove_cv::type>::type type; + type* assigned = static_cast(buffer); + *assigned = std::move(other); + } +}; + struct destroy_visitor { typedef void result_type; @@ -187,6 +200,27 @@ struct variant } return *this; } + variant(variant&& other) + : type(other.type) + { + if(other.type != -1) + other.visit(move_visitor{static_cast(&buffer)}); + } + variant& operator=(variant&& other) + { + if(type == other.type && type != -1) + { + other.visit(move_assign_visitor{static_cast(&buffer)}); + } + else if(type != other.type) + { + if(type != -1) + destroy_unsafe(); + type = other.type; + other.visit(move_visitor{static_cast(&buffer)}); + } + return *this; + } ~variant() { if(type != -1)