Add type_conversion helper and failing unit test
This commit is contained in:
parent
dd12785b72
commit
20c0e6016e
@ -394,6 +394,19 @@ namespace chaiscript
|
|||||||
return std::make_shared<detail::Type_Conversion_Impl<decltype(func)>>(user_type<From>(), user_type<To>(), func);
|
return std::make_shared<detail::Type_Conversion_Impl<decltype(func)>>(user_type<From>(), user_type<To>(), func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename From, typename To>
|
||||||
|
Type_Conversion type_conversion()
|
||||||
|
{
|
||||||
|
static_assert(std::is_convertible<From, To>::value, "Types are not automatically convertible");
|
||||||
|
auto func = [](const Boxed_Value &t_bv) -> Boxed_Value {
|
||||||
|
// not even attempting to call boxed_cast so that we don't get caught in some call recursion
|
||||||
|
auto to = To{detail::Cast_Helper<const From &>::cast(t_bv, nullptr)};
|
||||||
|
return chaiscript::Boxed_Value(std::move(to));
|
||||||
|
};
|
||||||
|
|
||||||
|
return std::make_shared<detail::Type_Conversion_Impl<decltype(func)>>(user_type<From>(), user_type<To>(), func);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ class Type2
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Type2(TestBaseType t_bt)
|
Type2(TestBaseType t_bt)
|
||||||
: m_bt(std::move(t_bt))
|
: m_bt(std::move(t_bt)),
|
||||||
|
m_str("Hello World")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,8 +38,14 @@ class Type2
|
|||||||
return m_bt.val;
|
return m_bt.val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *get_str() const
|
||||||
|
{
|
||||||
|
return m_str.c_str();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TestBaseType m_bt;
|
TestBaseType m_bt;
|
||||||
|
std::string m_str;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TestEnum
|
enum TestEnum
|
||||||
@ -158,6 +165,9 @@ CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_test_mo
|
|||||||
m->add(chaiscript::type_conversion<TestBaseType, Type2>([](const TestBaseType &t_bt) { return Type2(t_bt); }));
|
m->add(chaiscript::type_conversion<TestBaseType, Type2>([](const TestBaseType &t_bt) { return Type2(t_bt); }));
|
||||||
|
|
||||||
m->add(chaiscript::fun(&Type2::get_val), "get_val");
|
m->add(chaiscript::fun(&Type2::get_val), "get_val");
|
||||||
|
m->add(chaiscript::fun(&Type2::get_str), "get_str");
|
||||||
|
m->add(chaiscript::type_conversion<const char *, std::string>());
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,3 +7,4 @@ auto t := TestBaseType();
|
|||||||
// "get_val()" which exists on the Type2 type
|
// "get_val()" which exists on the Type2 type
|
||||||
assert_equal(t.get_val(), 10);
|
assert_equal(t.get_val(), 10);
|
||||||
|
|
||||||
|
assert_equal(t.get_str().size(), 11);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user