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