felipealmeida pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=37041730170a0f4e99b501379b52e7c72e3f581a
commit 37041730170a0f4e99b501379b52e7c72e3f581a Author: Felipe Magno de Almeida <fel...@expertisesolutions.com.br> Date: Tue Dec 20 15:26:35 2016 -0300 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 fb92954..df24aea 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 <typename T> + void operator()(T& other) const + { + typedef typename std::remove_cv<typename std::remove_reference<T>::type>::type type; + type* assigned = static_cast<type*>(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<void*>(&buffer)}); + } + variant& operator=(variant&& other) + { + if(type == other.type && type != -1) + { + other.visit(move_assign_visitor{static_cast<void*>(&buffer)}); + } + else if(type != other.type) + { + if(type != -1) + destroy_unsafe(); + type = other.type; + other.visit(move_visitor{static_cast<void*>(&buffer)}); + } + return *this; + } ~variant() { if(type != -1) --