Diff for /parser3/src/classes/array.C between versions 1.22 and 1.30

version 1.22, 2024/10/23 16:41:11 version 1.30, 2024/10/27 17:50:59
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 606  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_or_push(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.change_used(+1); // after each element, since an exception can occur
                   }
           } 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));
   
         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]));
                   array.change_used(+1); // after each element, since an exception can occur
         }          }
         self.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)));                  if(params[0].is_string()) {
         else                          array.clear(VArray::index(*params[0].get_string()));
                 self.array().clear();                  } else {
         self.invalidate();                          array.clear(VArray::index(params.as_int(0, PARAM_INDEX, r)));
                   }
           } else
                   array.clear();
           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 _pop(Request& r, MethodParams& params) {
           ArrayValue& array=GET_SELF(r, VArray).array();
           Value *result=array.pop();
           if(result){
                   r.write(*result);
                   array.change_used(-1);
           } else {
                   r.write(*VVoid::get());
           }
 }  }
   
 static void _contains(Request& r, MethodParams& params) {  static void _contains(Request& r, MethodParams& params) {
Line 856  static void _sort(Request& r, MethodPara Line 877  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 873  static Value& SingleElementHash(String:: Line 894  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;  
   
         AtResultType result_type=AtResultTypeValue;          AtResultType result_type=AtResultTypeValue;
         if(params.count() > 1) {          if(params.count() > 1) {
                 const String& stype=params.as_string(1, "type must be string");                  const String& stype=params.as_string(1, "type must be string");
Line 890  static void _at(Request& r, MethodParams Line 908  static void _at(Request& r, MethodParams
                         throw Exception(PARSER_RUNTIME, &stype, "type must be 'key', 'value' or 'hash'");                          throw Exception(PARSER_RUNTIME, &stype, "type must be 'key', 'value' or 'hash'");
         }          }
   
         Value& vwhence=params[0];          int pos=params.as_index(0, count, r);
         if(vwhence.is_string()) {  
                 const String& swhence=*vwhence.get_string();  
                 if(swhence == "last")  
                         pos=count-1;  
                 else if(swhence != "first")  
                         throw Exception(PARSER_RUNTIME, &swhence, "whence must be 'first', 'last' or expression");  
         } else {  
                 pos=r.process(vwhence).as_int();  
                 if(pos < 0)  
                         pos+=count;  
         }  
   
         if(count && pos >= 0 && (size_t)pos < count){          if(count && pos >= 0 && (size_t)pos < count){
                 if(count == array.count()){                  if(count == array.count()){
Line 910  static void _at(Request& r, MethodParams Line 917  static void _at(Request& r, MethodParams
                                         r.write(*new VString(*new String(pa_uitoa(pos), String::L_TAINTED)));                                          r.write(*new VString(*new String(pa_uitoa(pos), String::L_TAINTED)));
                                         break;                                          break;
                                 case AtResultTypeValue:                                  case AtResultTypeValue:
                                         r.write(*array[pos]);                                          r.write(*array.get(pos));
                                         break;                                          break;
                                 case AtResultTypeHash:                                  case AtResultTypeHash:
                                         r.write(SingleElementHash(pa_uitoa(pos), array[pos]));                                          r.write(SingleElementHash(pa_uitoa(pos), array.get(pos)));
                                         break;                                          break;
                         }                          }
                 } else {                  } else {
Line 1034  static void _reverse(Request& r, MethodP Line 1041  static void _reverse(Request& r, MethodP
         r.write(result);          r.write(result);
 }  }
   
 static void _compact(Request& r, MethodParams&) {  static void _compact(Request& r, MethodParams& params) {
         GET_SELF(r, VArray).array().compact();          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();
 }  }
   
   
Line 1044  static void _compact(Request& r, MethodP Line 1062  static void _compact(Request& r, MethodP
 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_or_push, 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_or_push, 1, 10000);
         // ^array.insert[index;value...]          // ^array.push[value[;value...]]
           add_native_method("push", Method::CT_DYNAMIC, _create_or_append_or_push, 1, 10000);
           // ^array.insert[index;value[;value...]]
         add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000);          add_native_method("insert", Method::CT_DYNAMIC, _insert, 2, 10000);
   
         // ^array.left(n)          // ^array.left(n)
Line 1065  MArray::MArray(): Methoded(VARRAY_TYPE) Line 1085  MArray::MArray(): Methoded(VARRAY_TYPE)
         // ^array.mid(p;n)          // ^array.mid(p;n)
         add_native_method("mid", Method::CT_DYNAMIC, _mid, 1, 2);          add_native_method("mid", Method::CT_DYNAMIC, _mid, 1, 2);
   
         // ^array.delete[index]          // ^array.delete(index) or ^array.delete[index]
         add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1);          add_native_method("delete", Method::CT_DYNAMIC, _delete, 0, 1);
         // ^array.remove[index]          // ^array.remove(index)
         add_native_method("remove", Method::CT_DYNAMIC, _remove, 1, 1);          add_native_method("remove", Method::CT_DYNAMIC, _remove, 1, 1);
           // ^array.pop[]
           add_native_method("pop", Method::CT_DYNAMIC, _pop, 0, 0);
   
         // ^array.contains[index]          // ^array.contains[index]
         add_native_method("contains", Method::CT_DYNAMIC, _contains, 1, 1);          add_native_method("contains", Method::CT_DYNAMIC, _contains, 1, 1);
Line 1097  MArray::MArray(): Methoded(VARRAY_TYPE) Line 1119  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[]          // ^array.compact[[undef]]
         add_native_method("compact", Method::CT_DYNAMIC, _compact, 0, 0);          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']]

Removed from v.1.22  
changed lines
  Added in v.1.30


E-mail: