Enable moving of Any objects

This commit is contained in:
Jason Turner
2014-10-05 11:47:50 -06:00
parent 5619f2602d
commit 87e40237d3
2 changed files with 32 additions and 17 deletions

View File

@@ -51,7 +51,8 @@ namespace chaiscript {
Data &operator=(const Data &) = delete; Data &operator=(const Data &) = delete;
virtual ~Data() {} virtual ~Data() = default;
virtual void *data() = 0; virtual void *data() = 0;
const std::type_info &type() const const std::type_info &type() const
{ {
@@ -65,13 +66,13 @@ namespace chaiscript {
template<typename T> template<typename T>
struct Data_Impl : Data struct Data_Impl : Data
{ {
Data_Impl(T t_type) explicit Data_Impl(T t_type)
: Data(typeid(T)), : Data(typeid(T)),
m_data(std::move(t_type)) m_data(std::move(t_type))
{ {
} }
virtual ~Data_Impl() {} virtual ~Data_Impl() = default;
virtual void *data() CHAISCRIPT_OVERRIDE virtual void *data() CHAISCRIPT_OVERRIDE
{ {
@@ -104,12 +105,17 @@ namespace chaiscript {
} }
} }
template<typename ValueType> Any(Any &&) = default;
Any(const ValueType &t_value) Any &operator=(Any &&t_any) = default;
: m_data(std::unique_ptr<Data>(new Data_Impl<ValueType>(t_value)))
template<typename ValueType,
typename = typename std::enable_if<!std::is_same<Any, typename std::decay<ValueType>::type>::value>::type>
explicit Any(ValueType &&t_value)
: m_data(std::unique_ptr<Data>(new Data_Impl<typename std::decay<ValueType>::type>(std::forward<ValueType>(t_value))))
{ {
} }
Any & operator=(const Any &t_any) Any & operator=(const Any &t_any)
{ {
Any copy(t_any); Any copy(t_any);
@@ -117,13 +123,6 @@ namespace chaiscript {
return *this; return *this;
} }
template<typename ValueType>
Any & operator=(const ValueType &t_value)
{
m_data = std::unique_ptr<Data>(new Data_Impl<ValueType>(t_value));
return *this;
}
template<typename ToType> template<typename ToType>
ToType &cast() const ToType &cast() const
{ {

View File

@@ -35,10 +35,10 @@ namespace chaiscript
struct Data struct Data
{ {
Data(const Type_Info &ti, Data(const Type_Info &ti,
const chaiscript::detail::Any &to, chaiscript::detail::Any to,
bool tr, bool tr,
const void *t_void_ptr) const void *t_void_ptr)
: m_type_info(ti), m_obj(to), m_data_ptr(ti.is_const()?nullptr:const_cast<void *>(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<void *>(t_void_ptr)), m_const_data_ptr(t_void_ptr),
m_is_ref(tr) m_is_ref(tr)
{ {
} }
@@ -61,6 +61,9 @@ namespace chaiscript
Data(const Data &) = delete; Data(const Data &) = delete;
Data(Data &&) = default;
Data &operator=(Data &&rhs) = default;
Type_Info m_type_info; Type_Info m_type_info;
chaiscript::detail::Any m_obj; chaiscript::detail::Any m_obj;
@@ -99,6 +102,18 @@ namespace chaiscript
); );
} }
template<typename T>
static std::shared_ptr<Data> get(std::shared_ptr<T> &&obj)
{
auto ptr = obj.get();
return std::make_shared<Data>(
detail::Get_Type_Info<T>::get(),
chaiscript::detail::Any(std::move(obj)),
false,
ptr
);
}
template<typename T> template<typename T>
static std::shared_ptr<Data> get(T *t) static std::shared_ptr<Data> get(T *t)
{ {
@@ -120,11 +135,12 @@ namespace chaiscript
static std::shared_ptr<Data> get(const T& t) static std::shared_ptr<Data> get(const T& t)
{ {
auto p = std::make_shared<T>(t); auto p = std::make_shared<T>(t);
auto ptr = p.get();
return std::make_shared<Data>( return std::make_shared<Data>(
detail::Get_Type_Info<T>::get(), detail::Get_Type_Info<T>::get(),
chaiscript::detail::Any(p), chaiscript::detail::Any(std::move(p)),
false, false,
p.get() ptr
); );
} }