Add array type support #167

This commit is contained in:
Jason Turner 2015-04-17 20:02:09 -06:00
parent f3090c3857
commit 71245aa703
6 changed files with 64 additions and 4 deletions

View File

@ -52,6 +52,43 @@ namespace chaiscript
}
}
template<typename T, typename = typename std::enable_if<std::is_array<T>::value>::type >
ModulePtr array(const std::string &type, ModulePtr m = ModulePtr(new Module()))
{
typedef typename std::remove_extent<T>::type ReturnType;
const auto extent = std::extent<T>::value;
m->add(user_type<T>(), type);
m->add(fun<ReturnType& (T &, size_t)>(
[extent](T& t, size_t index)->ReturnType &{
if (extent > 0 && index >= extent) {
throw std::range_error("Array index out of range. Received: " + std::to_string(index) + " expected < " + std::to_string(extent));
} else {
return t[index];
}
}
), "[]"
);
m->add(fun<const ReturnType& (const T &, size_t)>(
[extent](const T &t, size_t index)->const ReturnType &{
if (extent > 0 && index >= extent) {
throw std::range_error("Array index out of range. Received: " + std::to_string(index) + " expected < " + std::to_string(extent));
} else {
return t[index];
}
}
), "[]"
);
m->add(fun<size_t (const T &)>(
[extent](const T &) {
return extent;
}), "size");
return m;
}
/// \brief Adds a copy constructor for the given type to the given Model
/// \param[in] type The name of the type. The copy constructor will be named "type".
/// \param[in,out] m The Module to add the copy constructor to

View File

@ -40,7 +40,8 @@ namespace chaiscript
{
if (ob.get_type_info().bare_equal_type_info(typeid(Result)))
{
return *(static_cast<const Result *>(throw_if_null(ob.get_const_ptr())));
auto p = throw_if_null(ob.get_const_ptr());
return std::cref(*static_cast<const Result *>(p));
} else {
throw chaiscript::detail::exception::bad_any_cast();
}

View File

@ -712,7 +712,7 @@ namespace chaiscript
fpp.save_params(params);
std::string fun_name = [&](){
std::string fun_name = [&]()->std::string{
if ((this->children[i]->identifier == AST_Node_Type::Fun_Call) || (this->children[i]->identifier == AST_Node_Type::Array_Call)) {
return this->children[i]->children[0]->text;
}

View File

@ -617,7 +617,7 @@ namespace chaiscript
}
const size_t size = [&](){
const size_t size = [&]()->size_t{
if (longlong_)
{
return sizeof(int64_t) * 8;
@ -800,7 +800,7 @@ namespace chaiscript
const auto prev_line = m_line;
if (Id_()) {
m_match_stack.push_back(std::make_shared<eval::Id_AST_Node>(
[&](){
[&]()->std::string{
if (*start == '`') {
//Id Literal
return std::string(start+1, m_input_pos-1);

View File

@ -1,5 +1,6 @@
#include <chaiscript/chaiscript.hpp>
#include <chaiscript/dispatchkit/bootstrap.hpp>
#include <string>
@ -21,6 +22,8 @@ class TestBaseType
int val;
const int const_val;
int mdarray[2][3][5];
private:
TestBaseType &operator=(const TestBaseType &);
};
@ -159,6 +162,13 @@ CHAISCRIPT_MODULE_EXPORT chaiscript::ModulePtr create_chaiscript_module_test_mo
m->add(chaiscript::fun(&TestBaseType::const_val), "const_val");
m->add(chaiscript::fun(&TestBaseType::base_only_func), "base_only_func");
// Array types
m->add(chaiscript::fun(&TestBaseType::mdarray), "mdarray");
m->add(chaiscript::bootstrap::array<int[2][3][5]>("IntArray_2_3_5"));
m->add(chaiscript::bootstrap::array<int[3][5]>("IntArray_3_5"));
m->add(chaiscript::bootstrap::array<int[5]>("IntArray_5"));
// end array types
m->add(chaiscript::fun(&get_new_int), "get_new_int");

View File

@ -0,0 +1,12 @@
load_module("test_module")
auto t0 = TestBaseType()
assert_true(t0.mdarray.size() == 2)
assert_true(t0.mdarray[0].size() == 3)
assert_true(t0.mdarray[0][0].size() == 5)
t0.mdarray[1][2][4] = 15;
assert_true(t0.mdarray[1][2][4] == 15)