Annotation of parser3/src/types/pa_vhash.h, revision 1.75
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.72 moko 4: Copyright (c) 2001-2015 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.75 ! moko 11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.74 2016/05/24 17:48:37 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.11 paf 26: /// value of type 'hash', implemented with Hash
1.46 paf 27: class VHash: public VStateless_object {
1.1 paf 28: public: // value
29:
1.46 paf 30: override const char* type() const { return VHASH_TYPE; }
31: override VStateless_class *get_class() { return hash_class; }
1.17 parser 32:
1.19 parser 33: /// VHash: finteger
1.46 paf 34: override int as_int() const { return fhash.count(); }
1.19 parser 35: /// VHash: finteger
1.68 misha 36: override double as_double() const { return fhash.count(); }
1.17 parser 37: /// VHash: count!=0
1.68 misha 38: override bool is_defined() const { return fhash.count()!=0; }
1.23 parser 39: /// VHash: count!=0
1.68 misha 40: override bool as_bool() const { return fhash.count()!=0; }
1.20 parser 41: /// VHash: count
1.65 moko 42: override Value& as_expr_result() { return *new VInt(as_int()); }
1.1 paf 43:
1.11 paf 44: /// VHash: fhash
1.46 paf 45: override HashStringValue *get_hash() { return &hash(); }
1.14 paf 46:
1.66 misha 47: override HashStringValue* get_fields() { return &fhash; }
48:
1.11 paf 49: /// VHash: (key)=value
1.62 misha 50: override Value* get_element(const String& aname) {
1.70 moko 51: // $element first
1.46 paf 52: if(Value* result=fhash.get(aname))
1.13 paf 53: return result;
1.42 paf 54:
55: // $fields -- pseudo field to make 'hash' more like 'table'
1.74 moko 56: if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
1.42 paf 57: return this;
1.13 paf 58:
1.71 moko 59: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
1.73 moko 60: // $method, CLASS, CLASS_NAME
1.62 misha 61: if(Value* result=VStateless_object::get_element(aname))
1.16 parser 62: return result;
1.71 moko 63: #endif
1.16 parser 64:
65: // default value
1.22 parser 66: return get_default();
1.1 paf 67: }
68:
1.70 moko 69: #ifdef FEATURE_GET_ELEMENT4CALL
70: override Value* get_element4call(const String& aname) {
71: // $method first
72: if(Value* result=VStateless_object::get_element(aname))
73: return result;
74:
75: // $element
76: if(Value* result=fhash.get(aname))
77: return result;
78:
79: // default value
80: return get_default();
81: }
82: #endif
83:
1.11 paf 84: /// VHash: (key)=value
1.69 moko 85: override const VJunction* put_element(const String& aname, Value* avalue) {
1.74 moko 86: if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47 paf 87: set_default(avalue);
88: else
1.75 ! moko 89: fhash.put(aname, avalue);
1.36 paf 90:
1.54 paf 91: return PUT_ELEMENT_REPLACED_ELEMENT;
1.1 paf 92: }
1.52 paf 93:
1.61 misha 94: override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1 paf 95:
96: public: // usage
97:
1.75 ! moko 98: VHash(): _default(0) {}
1.18 parser 99:
1.75 ! moko 100: VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7 paf 101:
1.46 paf 102: HashStringValue& hash() {
1.67 moko 103: return fhash;
104: }
105:
1.44 paf 106: void set_default(Value* adefault) {
1.47 paf 107: _default=adefault;
1.22 parser 108: }
1.75 ! moko 109:
1.46 paf 110: Value* get_default() {
1.47 paf 111: return _default;
1.22 parser 112: }
1.53 paf 113:
114: void extract_default();
1.13 paf 115:
1.1 paf 116: private:
1.6 paf 117:
1.48 paf 118: HashStringValue fhash;
1.47 paf 119: Value* _default;
1.26 paf 120:
121: };
122:
1.1 paf 123: #endif
E-mail: