--- parser3/src/classes/hash.C 2015/09/24 20:14:03 1.122 +++ parser3/src/classes/hash.C 2016/07/04 17:26:23 1.127 @@ -1,7 +1,7 @@ /** @file Parser: @b hash parser class. - Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com) + Copyright (c) 2001-2015 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -17,7 +17,7 @@ #include "pa_vbool.h" #include "pa_vmethod_frame.h" -volatile const char * IDENT_HASH_C="$Id: hash.C,v 1.122 2015/09/24 20:14:03 moko Exp $"; +volatile const char * IDENT_HASH_C="$Id: hash.C,v 1.127 2016/07/04 17:26:23 moko Exp $"; // class @@ -31,7 +31,7 @@ public: // global variable -DECLARE_CLASS_VAR(hash, new MHash, 0); +DECLARE_CLASS_VAR(hash, new MHash); // methods @@ -198,7 +198,7 @@ static void _create_or_add(Request& r, M HashStringValue* self_hash=&(self.hash()); if(VHash* src=static_cast(vsrc.as(VHASH_TYPE))) { - src_hash=&(src->hash_ro()); + src_hash=&(src->hash()); if(src_hash==self_hash) // same: doing nothing return; @@ -384,13 +384,13 @@ static void _keys(Request& r, MethodPara *columns+=keys_column_name; Table* table=new Table(columns); - GET_SELF(r, VHash).hash_ro().for_each(keys_collector, table); + GET_SELF(r, VHash).hash().for_each(keys_collector, table); r.write_no_lang(*new VTable(table)); } static void _count(Request& r, MethodParams&) { - r.write_no_lang(*new VInt(GET_SELF(r, VHash).hash_ro().count())); + r.write_no_lang(*new VInt(GET_SELF(r, VHash).hash().count())); } static void _delete(Request& r, MethodParams& params) { @@ -401,7 +401,7 @@ static void _delete(Request& r, MethodPa } static void _contains(Request& r, MethodParams& params) { - bool result=GET_SELF(r, VHash).hash_ro().contains(params.as_string(0, "key must be string")); + bool result=GET_SELF(r, VHash).hash().contains(params.as_string(0, "key must be string")); r.write_no_lang(VBool::get(result)); } @@ -465,8 +465,7 @@ static void _foreach(Request& r, MethodP }; VHash& self=GET_SELF(r, VHash); - HashStringValue& hash=self.hash_ro(); - VHash_lock lock(self); + HashStringValue& hash=self.hash(); hash.first_that(one_foreach_cycle, &info); } @@ -508,6 +507,7 @@ static int sort_cmp_double(const void *a return 0; } static void _sort(Request& r, MethodParams& params){ +#ifdef HASH_ORDER const String& key_var_name=params.as_string(0, "key-var name must be string"); const String& value_var_name=params.as_string(1, "value-var name must be string"); Value& key_maker=params.as_junction(2, "key-maker must be code"); @@ -520,9 +520,8 @@ static void _sort(Request& r, MethodPara VMethodFrame* context=r.get_method_frame()->caller(); VHash& self=GET_SELF(r, VHash); - HashStringValue& hash=self.hash_ro(); + HashStringValue& hash=self.hash(); int count=hash.count(); - VHash_lock lock(self); Hash_seq_item* seq=new(PointerFreeGC) Hash_seq_item[count]; int pos=0; @@ -564,10 +563,11 @@ static void _sort(Request& r, MethodPara hash.order_next(seq[pos].hash_pair); delete[] seq; +#endif } static void _at(Request& r, MethodParams& params) { - HashStringValue& hash=GET_SELF(r, VHash).hash_ro(); + HashStringValue& hash=GET_SELF(r, VHash).hash(); size_t count=hash.count(); int pos=0; @@ -605,11 +605,14 @@ static void _at(Request& r, MethodParams switch(result_type) { case AtResultTypeKey: { +#ifdef HASH_ORDER if(pos == 0) { r.write_assign_lang(*new VString(*new String(hash.first_key(), String::L_TAINTED))); } else if((size_t)pos == count-1) { r.write_assign_lang(*new VString(*new String(hash.last_key(), String::L_TAINTED))); - } else { + } else +#endif + { for(HashStringValue::Iterator i(hash); i; i.next(), pos-- ) if(!pos){ r.write_assign_lang(*new VString(*new String(i.key(), String::L_TAINTED))); @@ -620,11 +623,14 @@ static void _at(Request& r, MethodParams } case AtResultTypeValue: { +#ifdef HASH_ORDER if(pos == 0) { r.write_assign_lang(*hash.first_value()); } else if((size_t)pos == count-1) { r.write_assign_lang(*hash.last_value()); - } else { + } else +#endif + { for(HashStringValue::Iterator i(hash); i; i.next(), pos-- ) if(!pos){ r.write_assign_lang(*i.value()); @@ -635,11 +641,14 @@ static void _at(Request& r, MethodParams } case AtResultTypeHash: { +#ifdef HASH_ORDER if(pos == 0) { r.write_no_lang(SingleElementHash(hash.first_key(), hash.first_value())); } else if((size_t)pos == count-1) { r.write_no_lang(SingleElementHash(hash.last_key(), hash.last_value())); - } else { + } else +#endif + { for(HashStringValue::Iterator i(hash); i; i.next(), pos-- ) if(!pos){ r.write_no_lang(SingleElementHash(i.key(), i.value())); @@ -681,10 +690,10 @@ MHash::MHash(): Methoded("hash") add_native_method("sql", Method::CT_DYNAMIC, _sql, 1, 2); // ^hash._keys[[column name]] - add_native_method("_keys", Method::CT_DYNAMIC, _keys, 0, 1); + add_native_method("_keys", Method::CT_DYNAMIC, _keys, 0, 1); // ^hash._count[] - add_native_method("_count", Method::CT_DYNAMIC, _count, 0, 0); + add_native_method("_count", Method::CT_DYNAMIC, _count, 0, 0); // ^hash.foreach[key;value]{code}[delim] add_native_method("foreach", Method::CT_DYNAMIC, _foreach, 2+1, 2+1+1); @@ -696,4 +705,12 @@ MHash::MHash(): Methoded("hash") // ^hash._at[first|last[;'key'|'value'|'hash']] // ^hash._at([-+]offset)[['key'|'value'|'hash']] add_native_method("_at", Method::CT_DYNAMIC, _at, 1, 2); + +#ifdef FEATURE_GET_ELEMENT4CALL + // aliases without "_" + add_native_method("keys", Method::CT_DYNAMIC, _keys, 0, 1); + add_native_method("count", Method::CT_DYNAMIC, _count, 0, 0); + add_native_method("at", Method::CT_DYNAMIC, _at, 1, 2); +#endif + }