Add array type support #167
This commit is contained in:
parent
f3090c3857
commit
71245aa703
@ -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
|
/// \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] 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
|
/// \param[in,out] m The Module to add the copy constructor to
|
||||||
|
@ -40,7 +40,8 @@ namespace chaiscript
|
|||||||
{
|
{
|
||||||
if (ob.get_type_info().bare_equal_type_info(typeid(Result)))
|
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 {
|
} else {
|
||||||
throw chaiscript::detail::exception::bad_any_cast();
|
throw chaiscript::detail::exception::bad_any_cast();
|
||||||
}
|
}
|
||||||
|
@ -712,7 +712,7 @@ namespace chaiscript
|
|||||||
|
|
||||||
fpp.save_params(params);
|
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)) {
|
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;
|
return this->children[i]->children[0]->text;
|
||||||
}
|
}
|
||||||
|
@ -617,7 +617,7 @@ namespace chaiscript
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const size_t size = [&](){
|
const size_t size = [&]()->size_t{
|
||||||
if (longlong_)
|
if (longlong_)
|
||||||
{
|
{
|
||||||
return sizeof(int64_t) * 8;
|
return sizeof(int64_t) * 8;
|
||||||
@ -800,7 +800,7 @@ namespace chaiscript
|
|||||||
const auto prev_line = m_line;
|
const auto prev_line = m_line;
|
||||||
if (Id_()) {
|
if (Id_()) {
|
||||||
m_match_stack.push_back(std::make_shared<eval::Id_AST_Node>(
|
m_match_stack.push_back(std::make_shared<eval::Id_AST_Node>(
|
||||||
[&](){
|
[&]()->std::string{
|
||||||
if (*start == '`') {
|
if (*start == '`') {
|
||||||
//Id Literal
|
//Id Literal
|
||||||
return std::string(start+1, m_input_pos-1);
|
return std::string(start+1, m_input_pos-1);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
#include <chaiscript/chaiscript.hpp>
|
#include <chaiscript/chaiscript.hpp>
|
||||||
|
#include <chaiscript/dispatchkit/bootstrap.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
@ -21,6 +22,8 @@ class TestBaseType
|
|||||||
int val;
|
int val;
|
||||||
const int const_val;
|
const int const_val;
|
||||||
|
|
||||||
|
int mdarray[2][3][5];
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TestBaseType &operator=(const TestBaseType &);
|
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::const_val), "const_val");
|
||||||
m->add(chaiscript::fun(&TestBaseType::base_only_func), "base_only_func");
|
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");
|
m->add(chaiscript::fun(&get_new_int), "get_new_int");
|
||||||
|
|
||||||
|
|
||||||
|
12
unittests/array_types.chai
Normal file
12
unittests/array_types.chai
Normal 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)
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user