From 87e40237d3f63c3821fa09d725a0eade13130e0e Mon Sep 17 00:00:00 2001 From: Jason Turner Date: Sun, 5 Oct 2014 11:47:50 -0600 Subject: [PATCH] Enable moving of Any objects --- include/chaiscript/dispatchkit/any.hpp | 25 +++++++++---------- .../chaiscript/dispatchkit/boxed_value.hpp | 24 +++++++++++++++--- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/include/chaiscript/dispatchkit/any.hpp b/include/chaiscript/dispatchkit/any.hpp index 39ff2fa..89d8d8a 100644 --- a/include/chaiscript/dispatchkit/any.hpp +++ b/include/chaiscript/dispatchkit/any.hpp @@ -51,7 +51,8 @@ namespace chaiscript { Data &operator=(const Data &) = delete; - virtual ~Data() {} + virtual ~Data() = default; + virtual void *data() = 0; const std::type_info &type() const { @@ -65,13 +66,13 @@ namespace chaiscript { template struct Data_Impl : Data { - Data_Impl(T t_type) + explicit Data_Impl(T t_type) : Data(typeid(T)), m_data(std::move(t_type)) { } - virtual ~Data_Impl() {} + virtual ~Data_Impl() = default; virtual void *data() CHAISCRIPT_OVERRIDE { @@ -104,12 +105,17 @@ namespace chaiscript { } } - template - Any(const ValueType &t_value) - : m_data(std::unique_ptr(new Data_Impl(t_value))) + Any(Any &&) = default; + Any &operator=(Any &&t_any) = default; + + template::type>::value>::type> + explicit Any(ValueType &&t_value) + : m_data(std::unique_ptr(new Data_Impl::type>(std::forward(t_value)))) { } + Any & operator=(const Any &t_any) { Any copy(t_any); @@ -117,13 +123,6 @@ namespace chaiscript { return *this; } - template - Any & operator=(const ValueType &t_value) - { - m_data = std::unique_ptr(new Data_Impl(t_value)); - return *this; - } - template ToType &cast() const { diff --git a/include/chaiscript/dispatchkit/boxed_value.hpp b/include/chaiscript/dispatchkit/boxed_value.hpp index 374036b..8d272cb 100644 --- a/include/chaiscript/dispatchkit/boxed_value.hpp +++ b/include/chaiscript/dispatchkit/boxed_value.hpp @@ -35,10 +35,10 @@ namespace chaiscript struct Data { Data(const Type_Info &ti, - const chaiscript::detail::Any &to, + chaiscript::detail::Any to, bool tr, const void *t_void_ptr) - : m_type_info(ti), m_obj(to), m_data_ptr(ti.is_const()?nullptr:const_cast(t_void_ptr)), m_const_data_ptr(t_void_ptr), + : m_type_info(ti), m_obj(std::move(to)), m_data_ptr(ti.is_const()?nullptr:const_cast(t_void_ptr)), m_const_data_ptr(t_void_ptr), m_is_ref(tr) { } @@ -61,6 +61,9 @@ namespace chaiscript Data(const Data &) = delete; + Data(Data &&) = default; + Data &operator=(Data &&rhs) = default; + Type_Info m_type_info; chaiscript::detail::Any m_obj; @@ -99,6 +102,18 @@ namespace chaiscript ); } + template + static std::shared_ptr get(std::shared_ptr &&obj) + { + auto ptr = obj.get(); + return std::make_shared( + detail::Get_Type_Info::get(), + chaiscript::detail::Any(std::move(obj)), + false, + ptr + ); + } + template static std::shared_ptr get(T *t) { @@ -120,11 +135,12 @@ namespace chaiscript static std::shared_ptr get(const T& t) { auto p = std::make_shared(t); + auto ptr = p.get(); return std::make_shared( detail::Get_Type_Info::get(), - chaiscript::detail::Any(p), + chaiscript::detail::Any(std::move(p)), false, - p.get() + ptr ); }