Annotation of parser3/src/types/pa_vhash.h, revision 1.43.2.4
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.43 paf 4: Copyright (c) 2001, 2003 ArtLebedev Group (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.43.2.4! paf 11: static const char* IDENT_VHASH_H="$Date: 2003/01/28 09:48:17 $";
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.43.2.2 paf 17: #include "pa_globals.h"
1.1 paf 18:
1.39 paf 19: // defines
20:
21: #define VHASH_TYPE "hash"
1.42 paf 22: #define HASH_FIELDS_NAME "fields"
1.39 paf 23:
1.26 paf 24: // externs
25:
1.33 paf 26: extern Methoded *hash_class;
1.13 paf 27:
1.26 paf 28: // forwards
29:
30: class VHash_lock;
31:
1.11 paf 32: /// value of type 'hash', implemented with Hash
1.43.2.2 paf 33: class VHash: public VStateless_object {
1.26 paf 34: friend class VHash_lock;
1.1 paf 35: public: // value
36:
1.43.2.1 paf 37: override const char *type() const { return VHASH_TYPE; }
38: override VStateless_class *get_class() { return hash_class; }
1.17 parser 39:
1.19 parser 40: /// VHash: finteger
1.43.2.2 paf 41: override int as_int() const { return fhash.count(); }
1.19 parser 42: /// VHash: finteger
1.43.2.1 paf 43: override double as_double() const { return as_int(); }
1.17 parser 44: /// VHash: count!=0
1.43.2.1 paf 45: override bool is_defined() const { return as_int()!=0; }
1.23 parser 46: /// VHash: count!=0
1.43.2.1 paf 47: override bool as_bool() const { return is_defined(); }
1.20 parser 48: /// VHash: count
1.43.2.2 paf 49: override ValuePtr as_expr_result(bool ) { return ValuePtr(new VInt(as_int())); }
1.1 paf 50:
1.11 paf 51: /// VHash: fhash
1.43.2.4! paf 52: override HashStringValue *get_hash(ConstStringPtr source) { return hash(source); }
1.14 paf 53:
1.11 paf 54: /// VHash: (key)=value
1.43.2.2 paf 55: override ValuePtr get_element(ConstStringPtr aname, Value& aself, bool looking_up) {
1.36 paf 56: // $method
1.43.2.2 paf 57: if(ValuePtr result=VStateless_object::get_element(aname, aself, looking_up))
1.13 paf 58: return result;
1.42 paf 59:
60: // $fields -- pseudo field to make 'hash' more like 'table'
1.43.2.2 paf 61: if(*aname == HASH_FIELDS_NAME)
1.42 paf 62: return this;
1.13 paf 63:
64: // $element
1.43.2.2 paf 65: if(ValuePtr result=fhash.get(aname))
1.16 parser 66: return result;
67:
68: // default value
1.22 parser 69: return get_default();
1.1 paf 70: }
71:
1.11 paf 72: /// VHash: (key)=value
1.43.2.2 paf 73: override bool put_element(ConstStringPtr aname, ValuePtr avalue, bool /*replace*/) {
74: if(flocked) {
1.40 paf 75: if(!fhash.put_replace(aname, avalue))
76: throw Exception("parser.runtime",
1.43.2.2 paf 77: aname,
78: "can not insert new hash key (hash flocked)");
1.40 paf 79: } else
80: fhash.put(aname, avalue);
1.36 paf 81:
82: return true;
1.1 paf 83: }
84:
85: public: // usage
86:
1.43.2.2 paf 87: VHash(): flocked(false) {}
1.18 parser 88:
1.43.2.2 paf 89: VHash(const HashStringValue& source): fhash(source), flocked(false) {}
1.7 paf 90:
1.43.2.4! paf 91: HashStringValue *hash(ConstStringPtr source) {
1.26 paf 92: check_lock(source);
1.43.2.4! paf 93: return &fhash;
1.26 paf 94: }
1.1 paf 95:
1.43.2.2 paf 96: void set_default(ValuePtr adefault) {
97: fhash.put(hash_default_element_name, adefault);
1.22 parser 98: }
1.43.2.2 paf 99: ValuePtr get_default() {
100: return fhash.get(hash_default_element_name);
1.22 parser 101: }
1.13 paf 102:
1.43.2.2 paf 103: void check_lock(ConstStringPtr source) {
104: if(flocked)
1.30 paf 105: throw Exception("parser.runtime",
1.26 paf 106: source,
1.43.2.2 paf 107: "can not modify hash (flocked)");
1.26 paf 108: }
109:
1.1 paf 110: private:
1.6 paf 111:
1.43.2.2 paf 112: bool flocked;
113: HashStringValue fhash;
1.26 paf 114:
115: };
1.43.2.3 paf 116:
117: DECLARE_OBJECT_PTR(VHash)
1.26 paf 118:
119: class VHash_lock {
120: VHash& fhash;
121: bool saved;
122: public:
1.43.2.2 paf 123: VHash_lock(VHash& ahash): fhash(ahash) {
124: saved=fhash.flocked;
125: fhash.flocked=true;
1.26 paf 126: }
127: ~VHash_lock() {
1.43.2.2 paf 128: fhash.flocked=saved;
1.26 paf 129: }
1.6 paf 130:
1.1 paf 131: };
132:
133: #endif
E-mail: