Annotation of parser3/src/types/pa_vhash.h, revision 1.84
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.83 moko 4: Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com)
5: Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
1.1 paf 6: */
7:
8: #ifndef PA_VHASH_H
9: #define PA_VHASH_H
1.34 paf 10:
1.84 ! moko 11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.83 2023/09/26 20:49:12 moko Exp $"
1.1 paf 12:
1.13 paf 13: #include "classes.h"
1.1 paf 14: #include "pa_value.h"
15: #include "pa_hash.h"
1.21 parser 16: #include "pa_vint.h"
1.46 paf 17: #include "pa_globals.h"
1.74 moko 18: #include "pa_symbols.h"
1.1 paf 19:
1.39 paf 20: // defines
21:
22: #define VHASH_TYPE "hash"
1.63 moko 23:
1.46 paf 24: extern Methoded* hash_class;
1.13 paf 25:
1.76 moko 26: class VHashBase: public VStateless_object {
1.1 paf 27: public: // value
28:
1.46 paf 29: override const char* type() const { return VHASH_TYPE; }
30: override VStateless_class *get_class() { return hash_class; }
1.17 parser 31:
1.76 moko 32: public: // usage
33:
34: virtual HashStringValue& hash()=0;
35: virtual void set_default(Value* adefault)=0;
36: virtual Value* get_default()=0;
37: };
38:
39:
40: /// value of type 'hash', implemented with Hash
41: class VHash: public VHashBase {
42: public: // value
43:
44: /// VHash: count
1.46 paf 45: override int as_int() const { return fhash.count(); }
1.68 misha 46: override double as_double() const { return fhash.count(); }
1.80 moko 47: override bool is_defined() const { return fhash.count()!=0 || _default!=NULL; }
1.68 misha 48: override bool as_bool() const { return fhash.count()!=0; }
1.76 moko 49: override Value& as_expr_result() { return *new VInt(fhash.count()); }
1.1 paf 50:
1.11 paf 51: /// VHash: fhash
1.76 moko 52: override HashStringValue *get_hash() { return &fhash; }
1.66 misha 53: override HashStringValue* get_fields() { return &fhash; }
1.76 moko 54: override HashStringValue* get_fields_reference() { return &fhash; }
1.66 misha 55:
1.11 paf 56: /// VHash: (key)=value
1.76 moko 57: override Value* get_element(const String& aname) {
1.70 moko 58: // $element first
1.46 paf 59: if(Value* result=fhash.get(aname))
1.13 paf 60: return result;
1.42 paf 61:
62: // $fields -- pseudo field to make 'hash' more like 'table'
1.74 moko 63: if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
1.42 paf 64: return this;
1.13 paf 65:
1.71 moko 66: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
1.73 moko 67: // $method, CLASS, CLASS_NAME
1.62 misha 68: if(Value* result=VStateless_object::get_element(aname))
1.16 parser 69: return result;
1.71 moko 70: #endif
1.16 parser 71:
72: // default value
1.22 parser 73: return get_default();
1.1 paf 74: }
1.84 ! moko 75:
1.70 moko 76: #ifdef FEATURE_GET_ELEMENT4CALL
77: override Value* get_element4call(const String& aname) {
78: // $method first
79: if(Value* result=VStateless_object::get_element(aname))
80: return result;
81:
82: // $element
83: if(Value* result=fhash.get(aname))
84: return result;
85:
86: // default value
1.84 ! moko 87: if(Value* result=get_default())
! 88: return result;
! 89:
! 90: return bark("%s method not found", &aname);
1.70 moko 91: }
92: #endif
1.84 ! moko 93:
1.11 paf 94: /// VHash: (key)=value
1.69 moko 95: override const VJunction* put_element(const String& aname, Value* avalue) {
1.74 moko 96: if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47 paf 97: set_default(avalue);
98: else
1.75 moko 99: fhash.put(aname, avalue);
1.36 paf 100:
1.81 moko 101: return 0;
1.1 paf 102: }
1.52 paf 103:
1.61 misha 104: override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1 paf 105:
106: public: // usage
107:
1.75 moko 108: VHash(): _default(0) {}
1.18 parser 109:
1.75 moko 110: VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7 paf 111:
1.76 moko 112: override HashStringValue& hash() { return fhash; }
113: override void set_default(Value* adefault) { _default=adefault; }
114: override Value* get_default() { return _default; }
115:
116: void extract_default();
117:
118: private:
119:
120: HashStringValue fhash;
121: Value* _default;
122:
123: };
124:
125: /// value of type 'hash', implemented with Hash reference
126: class VHashReference: public VHashBase {
127: public: // value
128:
129: /// VHash: count
130: override int as_int() const { return fhash->count(); }
131: override double as_double() const { return fhash->count(); }
132: override bool is_defined() const { return fhash->count()!=0; }
133: override bool as_bool() const { return fhash->count()!=0; }
134: override Value& as_expr_result() { return *new VInt(fhash->count()); }
135:
136: /// VHash: fhash
137: override HashStringValue *get_hash() { return fhash; }
138: override HashStringValue* get_fields() { return fhash; }
1.77 moko 139: override HashStringValue* get_fields_reference() { return fhash; }
1.76 moko 140:
141: /// VHash: (key)=value
142: override Value* get_element(const String& aname) {
143: // $element first
144: if(Value* result=fhash->get(aname))
145: return result;
146:
147: // $fields -- pseudo field to make 'hash' more like 'table'
148: if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
149: return this;
150:
151: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
152: // $method, CLASS, CLASS_NAME
153: if(Value* result=VStateless_object::get_element(aname))
154: return result;
155: #endif
156:
157: return 0;
1.67 moko 158: }
1.76 moko 159:
160: #ifdef FEATURE_GET_ELEMENT4CALL
161: override Value* get_element4call(const String& aname) {
162: // $method first
163: if(Value* result=VStateless_object::get_element(aname))
164: return result;
1.67 moko 165:
1.76 moko 166: // $element
167: if(Value* result=fhash->get(aname))
168: return result;
169:
170: return 0;
171: }
172: #endif
173:
174: /// VHash: (key)=value
175: override const VJunction* put_element(const String& aname, Value* avalue) {
176: fhash->put(aname, avalue);
1.81 moko 177: return 0;
1.22 parser 178: }
1.75 moko 179:
1.76 moko 180: public: // usage
181:
182: VHashReference(HashStringValue& source): fhash(&source) {}
1.53 paf 183:
1.76 moko 184: override HashStringValue& hash() { return *fhash; }
1.78 moko 185: override void set_default(Value*) { }
1.76 moko 186: override Value* get_default() { return 0; }
1.13 paf 187:
1.1 paf 188: private:
1.6 paf 189:
1.76 moko 190: HashStringValue *fhash;
1.26 paf 191: };
192:
1.1 paf 193: #endif
E-mail: