--- parser3/src/classes/array.C 2024/09/10 19:15:48 1.1 +++ parser3/src/classes/array.C 2024/09/13 04:01:22 1.3 @@ -17,7 +17,7 @@ #include "pa_vbool.h" #include "pa_vmethod_frame.h" -volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.1 2024/09/10 19:15:48 moko Exp $"; +volatile const char * IDENT_ARRAY_C="$Id: array.C,v 1.3 2024/09/13 04:01:22 moko Exp $"; // class @@ -41,7 +41,7 @@ static void _create_or_add(Request& r, M VArray& self=GET_SELF(r, VArray); ArrayValue& self_array=self.array(); - if(VArray* src=static_cast(vsrc.as(VARRAY_TYPE))) { + if(VArray* src=dynamic_cast(&vsrc)) { ArrayValue& src_array =src->array(); if(&src_array==&self_array) // same: doing nothing return; @@ -92,6 +92,31 @@ static void _count(Request& r, MethodPar r.write(*new VInt(GET_SELF(r, VArray).count())); } +static void _append(Request& r, MethodParams& params) { + VArray& self=GET_SELF(r, VArray); + ArrayValue& array=self.array(); + + int count=params.count(); + + for(int i=0; i0) GET_SELF(r, VArray).clear(VArray::index(params.as_int(0, "index must be integer", r))); @@ -448,20 +473,24 @@ MArray::MArray(): Methoded(VARRAY_TYPE) // ^array.sub[sub_from] add_native_method("sub", Method::CT_DYNAMIC, _sub, 1, 1); - // ^a.union[b] = array + // ^array.union[b] = array add_native_method("union", Method::CT_DYNAMIC, _union, 1, 1); - // ^a.intersection[b][options array] = array + // ^array.intersection[b][options array] = array add_native_method("intersection", Method::CT_DYNAMIC, _intersection, 1, 2); - // ^a.intersects[b] = bool + // ^array.intersects[b] = bool add_native_method("intersects", Method::CT_DYNAMIC, _intersects, 1, 1); - // ^a.delete[key] + // ^array.append[value;value] + add_native_method("append", Method::CT_DYNAMIC, _append, 1, 10000); + + // ^array.insert[index;value...] + add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000); + + // ^array.delete[index] add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1); - // ^a.contains[key] + // ^array.contains[index] add_native_method("contains", Method::CT_DYNAMIC, _contains, 1, 1); - // backward - add_native_method("contain", Method::CT_DYNAMIC, _contains, 1, 1); // ^array::sql[query][options array] add_native_method("sql", Method::CT_DYNAMIC, _sql, 1, 2); @@ -472,21 +501,21 @@ MArray::MArray(): Methoded(VARRAY_TYPE) // ^array._count[] add_native_method("_count", Method::CT_DYNAMIC, _count, 0, 0); - // ^array.foreach[key;value]{code}[delim] + // ^array.foreach[index;value]{code}[delim] add_native_method("foreach", Method::CT_DYNAMIC, _foreach, 2+1, 2+1+1); - // ^array.sort[key;value]{string-key-maker}[[asc|desc]] - // ^array.sort[key;value](numeric-key-maker)[[asc|desc]] + // ^array.sort[index;value]{string-key-maker}[[asc|desc]] + // ^array.sort[index;value](numeric-key-maker)[[asc|desc]] add_native_method("sort", Method::CT_DYNAMIC, _sort, 3, 4); - // ^array.select[key;value](bool-condition)[options array] + // ^array.select[index;value](bool-condition)[options hash] add_native_method("select", Method::CT_DYNAMIC, _select, 3, 4); // ^array.reverse[] add_native_method("reverse", Method::CT_DYNAMIC, _reverse, 0, 0); - // ^array._at[first|last[;'key'|'value'|'array']] - // ^array._at([-+]offset)[['key'|'value'|'array']] + // ^array._at[first|last[;'key'|'value'|'hash']] + // ^array._at([-+]offset)[['key'|'value'|'hash']] add_native_method("_at", Method::CT_DYNAMIC, _at, 1, 2); // ^array.rename[from;to]