|
|
| version 1.18, 2024/10/17 22:24:44 | version 1.26, 2024/10/26 18:53:36 |
|---|---|
| Line 38 const char* const PARAM_INDEX = "index m | Line 38 const char* const PARAM_INDEX = "index m |
| // methods | // methods |
| static void _create_or_add(Request& r, MethodParams& params) { | static void _copy_or_add(Request& r, MethodParams& params) { |
| if(params.count()) { | if(params.count()) { |
| Value& vsrc=params.as_no_junction(0, PARAM_ARRAY_OR_HASH); | Value& vsrc=params.as_no_junction(0, PARAM_ARRAY_OR_HASH); |
| VArray& self=GET_SELF(r, VArray); | VArray& self=GET_SELF(r, VArray); |
| Line 63 static void _create_or_add(Request& r, M | Line 63 static void _create_or_add(Request& r, M |
| self_array.put(VArray::index(i.key()), i.value()); | self_array.put(VArray::index(i.key()), i.value()); |
| } | } |
| } | } |
| self.invalidate(); | self_array.invalidate(); |
| } | } |
| } | } |
| Line 145 static void _join(Request& r, MethodPara | Line 145 static void _join(Request& r, MethodPara |
| } | } |
| } | } |
| } | } |
| self.invalidate(); | self_array.invalidate(); |
| } | } |
| #ifndef DOXYGEN | #ifndef DOXYGEN |
| Line 494 static void _sql(Request& r, MethodParam | Line 494 static void _sql(Request& r, MethodParam |
| VArray& self=GET_SELF(r, VArray); | VArray& self=GET_SELF(r, VArray); |
| ArrayValue& array=self.array(); | ArrayValue& array=self.array(); |
| array.clear(); self.invalidate(); // just in case if called as method | if(array.count()){ |
| array.clear(); array.invalidate(); // just in case if called as method | |
| } | |
| if(sparse){ | if(sparse){ |
| SparseArray_sql_event_handlers handlers(distinct, array, value_type); | SparseArray_sql_event_handlers handlers(distinct, array, value_type); |
| Line 544 static void _right(Request& r, MethodPar | Line 546 static void _right(Request& r, MethodPar |
| if(sn>0){ | if(sn>0){ |
| size_t used=GET_SELF(r, VArray).array().used(); | size_t used=GET_SELF(r, VArray).array().used(); |
| if(sn<used){ | if((size_t)sn<used){ |
| mid(r, used-sn, sn); | mid(r, used-sn, sn); |
| } else { | } else { |
| mid(r); | mid(r); |
| Line 555 static void _right(Request& r, MethodPar | Line 557 static void _right(Request& r, MethodPar |
| } | } |
| static void _mid(Request& r, MethodParams& params) { | static void _mid(Request& r, MethodParams& params) { |
| const String& string=GET_SELF(r, VString).string(); | |
| int begin=params.as_int(0, "p must be int", r); | int begin=params.as_int(0, "p must be int", r); |
| if(begin<0) | if(begin<0) |
| throw Exception(PARSER_RUNTIME, 0, "p(%d) must be >=0", begin); | throw Exception(PARSER_RUNTIME, 0, "p(%d) must be >=0", begin); |
| size_t end; | |
| size_t length=0; | |
| if(params.count()>1) { | if(params.count()>1) { |
| int n=params.as_int(1, "n must be int", r); | int n=params.as_int(1, "n must be int", r); |
| if(n<0) | if(n<0) |
| Line 610 static void _count(Request& r, MethodPar | Line 608 static void _count(Request& r, MethodPar |
| r.write(*new VInt(array.used())); | r.write(*new VInt(array.used())); |
| } | } |
| static void _append(Request& r, MethodParams& params) { | static void _create_or_append(Request& r, MethodParams& params) { |
| VArray& self=GET_SELF(r, VArray); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| ArrayValue& array=self.array(); | |
| int count=params.count(); | int count=params.count(); |
| for(int i=0; i<count; i++){ | if(array.count()){ |
| array+=&r.process(params[i]); | for(int i=0; i<count; i++) |
| array+=&r.process(params[i]); | |
| array.invalidate(); | |
| } else { | |
| for(int i=0; i<count; i++) | |
| array+=&r.process(params[i]); | |
| array.confirm_all_used(); | |
| } | } |
| self.invalidate(); | |
| } | } |
| static void _insert(Request& r, MethodParams& params) { | static void _insert(Request& r, MethodParams& params) { |
| VArray& self=GET_SELF(r, VArray); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| ArrayValue& array=self.array(); | |
| int count=params.count(); | int count=params.count(); |
| size_t index=VArray::index(params.as_int(0, PARAM_INDEX, r)); | size_t index=VArray::index(params.as_int(0, PARAM_INDEX, r)); |
| Line 632 static void _insert(Request& r, MethodPa | Line 633 static void _insert(Request& r, MethodPa |
| for(int i=1; i<count; i++){ | for(int i=1; i<count; i++){ |
| array.insert(index++, &r.process(params[i])); | array.insert(index++, &r.process(params[i])); |
| } | } |
| self.invalidate(); | array.invalidate(); |
| } | } |
| static void _delete(Request& r, MethodParams& params) { | static void _delete(Request& r, MethodParams& params) { |
| VArray& self=GET_SELF(r, VArray); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| if(params.count()>0) | if(params.count()>0) |
| self.array().clear(VArray::index(params.as_int(0, PARAM_INDEX, r))); | array.clear(VArray::index(params.as_int(0, PARAM_INDEX, r))); |
| else | else |
| self.array().clear(); | array.clear(); |
| self.invalidate(); | array.invalidate(); |
| } | } |
| static void _remove(Request& r, MethodParams& params) { | static void _remove(Request& r, MethodParams& params) { |
| VArray& self=GET_SELF(r, VArray); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| self.array().remove(VArray::index(params.as_int(0, PARAM_INDEX, r))); | array.remove(VArray::index(params.as_int(0, PARAM_INDEX, r))); |
| self.invalidate(); | array.invalidate(); |
| } | } |
| static void _contains(Request& r, MethodParams& params) { | static void _contains(Request& r, MethodParams& params) { |
| Line 860 static void _sort(Request& r, MethodPara | Line 861 static void _sort(Request& r, MethodPara |
| for(pos=0; pos<count; pos++) | for(pos=0; pos<count; pos++) |
| array+=seq[pos].array_data; | array+=seq[pos].array_data; |
| self.invalidate(); | array.confirm_all_used(); |
| delete[] seq; | delete[] seq; |
| } | } |
| Line 877 static Value& SingleElementHash(String:: | Line 878 static Value& SingleElementHash(String:: |
| } | } |
| static void _at(Request& r, MethodParams& params) { | static void _at(Request& r, MethodParams& params) { |
| VArray& self=GET_SELF(r, VArray); | ArrayValue& array=GET_SELF(r, VArray).array(); |
| ArrayValue& array=self.array(); | |
| size_t count=array.used(); // not array.count() | size_t count=array.used(); // not array.count() |
| int pos=0; | int pos=0; |
| Line 908 static void _at(Request& r, MethodParams | Line 908 static void _at(Request& r, MethodParams |
| } | } |
| if(count && pos >= 0 && (size_t)pos < count){ | if(count && pos >= 0 && (size_t)pos < count){ |
| switch(result_type) { | if(count == array.count()){ |
| case AtResultTypeKey: | switch(result_type) { |
| { | case AtResultTypeKey: |
| for(ArrayValue::Iterator i(array); i; i.next() ){ | r.write(*new VString(*new String(pa_uitoa(pos), String::L_TAINTED))); |
| if(i.value() && !(pos--)){ | break; |
| case AtResultTypeValue: | |
| r.write(*array.get(pos)); | |
| break; | |
| case AtResultTypeHash: | |
| r.write(SingleElementHash(pa_uitoa(pos), array.get(pos))); | |
| break; | |
| } | |
| } else { | |
| for(ArrayValue::Iterator i(array); i; i.next() ){ | |
| if(i.value() && !(pos--)){ | |
| switch(result_type) { | |
| case AtResultTypeKey: | |
| r.write(*new VString(*new String(i.key(), String::L_TAINTED))); | r.write(*new VString(*new String(i.key(), String::L_TAINTED))); |
| break; | break; |
| } | case AtResultTypeValue: |
| } | |
| break; | |
| } | |
| case AtResultTypeValue: | |
| { | |
| for(ArrayValue::Iterator i(array); i; i.next() ) | |
| if(i.value() &&!(pos--)){ | |
| r.write(*i.value()); | r.write(*i.value()); |
| break; | break; |
| } | case AtResultTypeHash: |
| break; | |
| } | |
| case AtResultTypeHash: | |
| { | |
| for(ArrayValue::Iterator i(array); i; i.next() ) | |
| if(i.value() &&!(pos--)){ | |
| r.write(SingleElementHash(i.key(), i.value())); | r.write(SingleElementHash(i.key(), i.value())); |
| break; | break; |
| } | } |
| break; | break; |
| } | } |
| } | |
| } | } |
| } | } |
| } | } |
| Line 1025 static void _select(Request& r, MethodPa | Line 1025 static void _select(Request& r, MethodPa |
| r.write(*result); | r.write(*result); |
| } | } |
| static void _reverse(Request& r, MethodParams& params) { | static void _reverse(Request& r, MethodParams&) { |
| ArrayValue& source_array=GET_SELF(r, VArray).array(); | ArrayValue& source_array=GET_SELF(r, VArray).array(); |
| VArray& result=*new VArray(source_array.count()); | VArray& result=*new VArray(source_array.count()); |
| Line 1038 static void _reverse(Request& r, MethodP | Line 1038 static void _reverse(Request& r, MethodP |
| r.write(result); | r.write(result); |
| } | } |
| static void _compact(Request& r, MethodParams& params) { | |
| bool compact_undef=false; | |
| if(params.count()>0){ | |
| const String& what=params.as_string(0, PARAMETER_MUST_BE_STRING); | |
| if(!what.is_empty()){ | |
| if(what != "undef") | |
| throw Exception(PARSER_RUNTIME, &what, "param must be empty or 'undef'"); | |
| compact_undef=true; | |
| } | |
| } | |
| ArrayValue& array=GET_SELF(r, VArray).array(); | |
| array.compact(compact_undef); | |
| array.confirm_all_used(); | |
| } | |
| // constructor | // constructor |
| MArray::MArray(): Methoded(VARRAY_TYPE) { | MArray::MArray(): Methoded(VARRAY_TYPE) { |
| // ^array::copy[[copy_from]] | // ^array::copy[[copy_from]] |
| add_native_method("copy", Method::CT_DYNAMIC, _create_or_add, 0, 1); | add_native_method("copy", Method::CT_DYNAMIC, _copy_or_add, 0, 1); |
| // ^array.add[add_from] | // ^array.add[add_from] |
| add_native_method("add", Method::CT_DYNAMIC, _create_or_add, 1, 1); | add_native_method("add", Method::CT_DYNAMIC, _copy_or_add, 1, 1); |
| // ^array.join[join_from[;options]] | // ^array.join[join_from[;options]] |
| add_native_method("join", Method::CT_DYNAMIC, _join, 1, 2); | add_native_method("join", Method::CT_DYNAMIC, _join, 1, 2); |
| // ^array::create[value;value] | // ^array::create[value;value] |
| add_native_method("create", Method::CT_DYNAMIC, _append, 0, 10000); | add_native_method("create", Method::CT_DYNAMIC, _create_or_append, 0, 10000); |
| // ^array.append[value;value] | // ^array.append[value;value] |
| add_native_method("append", Method::CT_DYNAMIC, _append, 1, 10000); | add_native_method("append", Method::CT_DYNAMIC, _create_or_append, 1, 10000); |
| // ^array.insert[index;value...] | // ^array.insert[index;value...] |
| add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000); | add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000); |
| Line 1097 MArray::MArray(): Methoded(VARRAY_TYPE) | Line 1112 MArray::MArray(): Methoded(VARRAY_TYPE) |
| // ^array.reverse[] | // ^array.reverse[] |
| add_native_method("reverse", Method::CT_DYNAMIC, _reverse, 0, 0); | add_native_method("reverse", Method::CT_DYNAMIC, _reverse, 0, 0); |
| // ^array.compact[[undef]] | |
| add_native_method("compact", Method::CT_DYNAMIC, _compact, 0, 1); | |
| // ^array._at[first|last[;'key'|'value'|'hash']] | // ^array._at[first|last[;'key'|'value'|'hash']] |
| // ^array._at([-+]offset)[['key'|'value'|'hash']] | // ^array._at([-+]offset)[['key'|'value'|'hash']] |
| add_native_method("_at", Method::CT_DYNAMIC, _at, 1, 2); | add_native_method("_at", Method::CT_DYNAMIC, _at, 1, 2); |