Enable moving of Any objects
This commit is contained in:
@@ -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
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user