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

@@ -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<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)
{
}
@@ -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<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>
static std::shared_ptr<Data> get(T *t)
{
@@ -120,11 +135,12 @@ namespace chaiscript
static std::shared_ptr<Data> get(const T& t)
{
auto p = std::make_shared<T>(t);
auto ptr = p.get();
return std::make_shared<Data>(
detail::Get_Type_Info<T>::get(),
chaiscript::detail::Any(p),
chaiscript::detail::Any(std::move(p)),
false,
p.get()
ptr
);
}