Annotation of parser3/src/types/pa_vhash.h, revision 1.26
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.1 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.3 paf 5: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.1 paf 6:
1.26 ! paf 7: $Id: pa_vhash.h,v 1.25 2001/10/23 14:43:44 parser Exp $
1.1 paf 8: */
9:
10: #ifndef PA_VHASH_H
11: #define PA_VHASH_H
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.13 paf 20: extern Methoded *hash_base_class;
21:
1.26 ! paf 22: // forwards
! 23:
! 24: class VHash_lock;
! 25:
1.11 paf 26: /// value of type 'hash', implemented with Hash
1.13 paf 27: class VHash : public VStateless_class {
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.17 parser 32:
1.19 parser 33: /// VHash: finteger
34: int as_int() const { return fhash.size(); }
35: /// VHash: finteger
36: double as_double() const { return as_int(); }
1.17 parser 37: /// VHash: count!=0
1.19 parser 38: bool is_defined() const { return as_int()!=0; }
1.23 parser 39: /// VHash: count!=0
40: bool as_bool() const { return is_defined(); }
1.20 parser 41: /// VHash: count
1.24 parser 42: Value *as_expr_result(bool ) { return NEW VInt(pool(), as_int()); }
1.1 paf 43:
1.11 paf 44: /// VHash: fhash
1.26 ! paf 45: Hash *get_hash(const String *source) { return &hash(source); }
1.14 paf 46:
47: /// VHash: 0
48: VStateless_class *get_class() { return 0; }
1.7 paf 49:
1.11 paf 50: /// VHash: (key)=value
1.1 paf 51: Value *get_element(const String& name) {
1.15 parser 52: // $CLASS,$method
1.13 paf 53: if(Value *result=VStateless_class::get_element(name))
54: return result;
55:
56: // $element
1.16 parser 57: if(Value *result=static_cast<Value *>(fhash.get(name)))
58: return result;
59:
60: // default value
1.22 parser 61: return get_default();
1.1 paf 62: }
63:
1.11 paf 64: /// VHash: (key)=value
1.1 paf 65: void put_element(const String& name, Value *value) {
1.26 ! paf 66: hash(&name).put(name, value);
1.1 paf 67: }
68:
69: public: // usage
70:
1.13 paf 71: VHash(Pool& apool) : VStateless_class(apool, hash_base_class),
1.26 ! paf 72: fhash(apool), locked(false) {
1.18 parser 73: }
74:
75: VHash(Pool& apool, const Hash& source) : VStateless_class(apool, hash_base_class),
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.26 ! paf 85: hash(&adefault.name()).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)
! 93: throw Exception(0, 0,
! 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: