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