lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] odd/any_member-opt 7e47a9c 2/5: Make any_member<> mo


From: Greg Chicares
Subject: [lmi-commits] [lmi] odd/any_member-opt 7e47a9c 2/5: Make any_member<> movable
Date: Sun, 28 Mar 2021 13:53:15 -0400 (EDT)

branch: odd/any_member-opt
commit 7e47a9c3a8ffc83cd0f214e7eead774e7f0073a8
Author: Ilya Sinitsyn <the_siv@mail.ru>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>

    Make any_member<> movable
    
    This will notably allow storing objects of this type in std::vector<>,
    which was impossible before, as they were neither copyable nor movable.
---
 any_member.hpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/any_member.hpp b/any_member.hpp
index e747ec3..94c0951 100644
--- a/any_member.hpp
+++ b/any_member.hpp
@@ -246,6 +246,7 @@ class any_member final
   public:
     any_member();
     any_member(any_member const&);
+    any_member(any_member&&);
     ~any_member() override;
 
     template<typename ValueType>
@@ -254,6 +255,7 @@ class any_member final
     any_member& swap(any_member&);
     any_member& operator=(any_member const&);
     any_member& operator=(std::string const&);
+    any_member& operator=(any_member&&);
     bool operator==(any_member const&) const;
     bool operator!=(any_member const&) const;
 
@@ -285,6 +287,12 @@ any_member<ClassType>::any_member(any_member const& other)
 {}
 
 template<typename ClassType>
+any_member<ClassType>::any_member(any_member&& other)
+    :any_entity {std::move(other)}
+    ,content_   {std::exchange(other.content_, nullptr)}
+{}
+
+template<typename ClassType>
 any_member<ClassType>::~any_member()
 {
     delete content_;
@@ -326,6 +334,16 @@ any_member<ClassType>& 
any_member<ClassType>::operator=(std::string const& s)
 }
 
 template<typename ClassType>
+any_member<ClassType>& any_member<ClassType>::operator=
+    (any_member<ClassType>&& other
+    )
+{
+    delete content_;
+    content_ = std::exchange(other.content_, nullptr);
+    return *this;
+}
+
+template<typename ClassType>
 bool any_member<ClassType>::operator==
     (any_member<ClassType> const& other
     ) const



reply via email to

[Prev in Thread] Current Thread [Next in Thread]