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)

-- 


Reply via email to