Annotation of parser3/src/types/pa_vhash.h, revision 1.82
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.82 ! moko 4: Copyright (c) 2001-2020 Art. Lebedev Studio (http://www.artlebedev.com)
1.29 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 paf 6: */
7:
8: #ifndef PA_VHASH_H
9: #define PA_VHASH_H
1.34 paf 10:
1.82 ! moko 11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.81 2020/10/27 10:10:10 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: }
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
87: return get_default();
88: }
89: #endif
90:
1.11 paf 91: /// VHash: (key)=value
1.69 moko 92: override const VJunction* put_element(const String& aname, Value* avalue) {
1.74 moko 93: if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47 paf 94: set_default(avalue);
95: else
1.75 moko 96: fhash.put(aname, avalue);
1.36 paf 97:
1.81 moko 98: return 0;
1.1 paf 99: }
1.52 paf 100:
1.61 misha 101: override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1 paf 102:
103: public: // usage
104:
1.75 moko 105: VHash(): _default(0) {}
1.18 parser 106:
1.75 moko 107: VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7 paf 108:
1.76 moko 109: override HashStringValue& hash() { return fhash; }
110: override void set_default(Value* adefault) { _default=adefault; }
111: override Value* get_default() { return _default; }
112:
113: void extract_default();
114:
115: private:
116:
117: HashStringValue fhash;
118: Value* _default;
119:
120: };
121:
122: /// value of type 'hash', implemented with Hash reference
123: class VHashReference: public VHashBase {
124: public: // value
125:
126: /// VHash: count
127: override int as_int() const { return fhash->count(); }
128: override double as_double() const { return fhash->count(); }
129: override bool is_defined() const { return fhash->count()!=0; }
130: override bool as_bool() const { return fhash->count()!=0; }
131: override Value& as_expr_result() { return *new VInt(fhash->count()); }
132:
133: /// VHash: fhash
134: override HashStringValue *get_hash() { return fhash; }
135: override HashStringValue* get_fields() { return fhash; }
1.77 moko 136: override HashStringValue* get_fields_reference() { return fhash; }
1.76 moko 137:
138: /// VHash: (key)=value
139: override Value* get_element(const String& aname) {
140: // $element first
141: if(Value* result=fhash->get(aname))
142: return result;
143:
144: // $fields -- pseudo field to make 'hash' more like 'table'
145: if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
146: return this;
147:
148: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
149: // $method, CLASS, CLASS_NAME
150: if(Value* result=VStateless_object::get_element(aname))
151: return result;
152: #endif
153:
154: return 0;
1.67 moko 155: }
1.76 moko 156:
157: #ifdef FEATURE_GET_ELEMENT4CALL
158: override Value* get_element4call(const String& aname) {
159: // $method first
160: if(Value* result=VStateless_object::get_element(aname))
161: return result;
1.67 moko 162:
1.76 moko 163: // $element
164: if(Value* result=fhash->get(aname))
165: return result;
166:
167: return 0;
168: }
169: #endif
170:
171: /// VHash: (key)=value
172: override const VJunction* put_element(const String& aname, Value* avalue) {
173: fhash->put(aname, avalue);
1.81 moko 174: return 0;
1.22 parser 175: }
1.75 moko 176:
1.76 moko 177: public: // usage
178:
179: VHashReference(HashStringValue& source): fhash(&source) {}
1.53 paf 180:
1.76 moko 181: override HashStringValue& hash() { return *fhash; }
1.78 moko 182: override void set_default(Value*) { }
1.76 moko 183: override Value* get_default() { return 0; }
1.13 paf 184:
1.1 paf 185: private:
1.6 paf 186:
1.76 moko 187: HashStringValue *fhash;
1.26 paf 188: };
189:
1.1 paf 190: #endif
E-mail: