Annotation of parser3/src/types/pa_vhash.h, revision 1.76
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.76 ! moko 11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.75 2016/07/04 17:26:23 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(); }
47: override bool is_defined() const { return fhash.count()!=0; }
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.54 paf 98: return PUT_ELEMENT_REPLACED_ELEMENT;
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; }
! 136:
! 137: /// VHash: (key)=value
! 138: override Value* get_element(const String& aname) {
! 139: // $element first
! 140: if(Value* result=fhash->get(aname))
! 141: return result;
! 142:
! 143: // $fields -- pseudo field to make 'hash' more like 'table'
! 144: if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
! 145: return this;
! 146:
! 147: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
! 148: // $method, CLASS, CLASS_NAME
! 149: if(Value* result=VStateless_object::get_element(aname))
! 150: return result;
! 151: #endif
! 152:
! 153: return 0;
1.67 moko 154: }
1.76 ! moko 155:
! 156: #ifdef FEATURE_GET_ELEMENT4CALL
! 157: override Value* get_element4call(const String& aname) {
! 158: // $method first
! 159: if(Value* result=VStateless_object::get_element(aname))
! 160: return result;
1.67 moko 161:
1.76 ! moko 162: // $element
! 163: if(Value* result=fhash->get(aname))
! 164: return result;
! 165:
! 166: return 0;
! 167: }
! 168: #endif
! 169:
! 170: /// VHash: (key)=value
! 171: override const VJunction* put_element(const String& aname, Value* avalue) {
! 172: fhash->put(aname, avalue);
! 173: return PUT_ELEMENT_REPLACED_ELEMENT;
1.22 parser 174: }
1.75 moko 175:
1.76 ! moko 176: public: // usage
! 177:
! 178: VHashReference(HashStringValue& source): fhash(&source) {}
1.53 paf 179:
1.76 ! moko 180: override HashStringValue& hash() { return *fhash; }
! 181: override void set_default(Value* adefault) { }
! 182: override Value* get_default() { return 0; }
1.13 paf 183:
1.1 paf 184: private:
1.6 paf 185:
1.76 ! moko 186: HashStringValue *fhash;
1.26 paf 187: };
188:
1.1 paf 189: #endif
E-mail: