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