From 1039a784305261cf9b8e7afd997e03b2ef201799 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 18 Apr 2018 22:18:38 +0200
Subject: [PATCH] redesign clone helper template function

---
 alib2std/src/extensions/clone.hpp  | 12 ++++++------
 alib2std/src/extensions/memory.hpp |  8 ++++----
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/alib2std/src/extensions/clone.hpp b/alib2std/src/extensions/clone.hpp
index ac15a1db52..c5d5af8d2d 100644
--- a/alib2std/src/extensions/clone.hpp
+++ b/alib2std/src/extensions/clone.hpp
@@ -12,14 +12,14 @@
 
 namespace ext {
 
-template<class T, typename std::enable_if< ! ext::has_clone<T>::value >::type* = nullptr>
-T* clone(const T * const tmp) {
-	return new T(*tmp);
+template < class T, typename std::enable_if < ! ext::has_clone < T >::value >::type * = nullptr >
+auto clone ( T && tmp ) {
+	return new typename std::decay < T >::type ( std::forward < T > ( tmp ) );
 }
 
-template<class T, typename std::enable_if< ext::has_clone<T>::value >::type* = nullptr>
-T* clone(const T * const tmp) {
-	return tmp->clone();
+template < class T, typename std::enable_if < ext::has_clone < T >::value >::type * = nullptr >
+auto clone ( T && tmp ) {
+	return std::forward < T > ( tmp ).clone ( );
 }
 
 } /* namespace ext */
diff --git a/alib2std/src/extensions/memory.hpp b/alib2std/src/extensions/memory.hpp
index 41ab3e6de4..2c28df6133 100644
--- a/alib2std/src/extensions/memory.hpp
+++ b/alib2std/src/extensions/memory.hpp
@@ -130,7 +130,7 @@ private:
 
 		T * tmp = m_Data;
 		detach ( );
-		tmp = ext::clone ( tmp );
+		tmp = ext::clone ( * tmp );
 		tmp->m_UseCount = 0;
 		attach ( tmp );
 	}
@@ -253,7 +253,7 @@ private:
 
 		typename cow_shared_ptr < T >::cow_shared_ptr_data * tmp = m_Data;
 		detach ( );
-		attach ( new cow_shared_ptr_data ( ext::clone ( tmp->m_Data ) ) );
+		attach ( new cow_shared_ptr_data ( ext::clone ( * tmp->m_Data ) ) );
 	}
 
 	cow_shared_ptr_data * m_Data;
@@ -281,7 +281,7 @@ public:
 	smart_ptr ( smart_ptr < R > other ) : m_Data ( other.release ( ) ) {
 	}
 
-	smart_ptr ( const smart_ptr & other ) : m_Data ( ext::clone ( other.m_Data ) ) {
+	smart_ptr ( const smart_ptr & other ) : m_Data ( ext::clone ( * other.m_Data ) ) {
 	}
 
 	smart_ptr ( smart_ptr && other ) noexcept : m_Data ( other.release ( ) ) {
@@ -295,7 +295,7 @@ public:
 		if ( this == & other ) return * this;
 
 		delete m_Data;
-		m_Data = ext::clone ( other.m_Data );
+		m_Data = ext::clone ( * other.m_Data );
 
 		return * this;
 	}
-- 
GitLab