diff --git a/alib2std/src/extensions/clone.hpp b/alib2std/src/extensions/clone.hpp index ac15a1db52647d8aee8e3f919e5f50b4e7c4c66d..c5d5af8d2dfe9518521dcac20632af7e2eb55532 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 41ab3e6de408bac9167532d0c49db39b7367938a..2c28df6133dfa40edfcb38fc9a8f626038fe9e97 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; }