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