Annotation of parser3/src/types/pa_vhash.h, revision 1.43.2.2
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.2! paf 11: static const char* IDENT_VHASH_H="$Date: 2003/01/24 14:36:11 $";
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.2! paf 52: override HashStringValuePtr 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.2! paf 91: HashStringValuePtr hash(ConstStringPtr source) {
1.26 paf 92: check_lock(source);
1.43.2.2! paf 93: return HashStringValuePtr(&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: };
116:
117: class VHash_lock {
118: VHash& fhash;
119: bool saved;
120: public:
1.43.2.2! paf 121: VHash_lock(VHash& ahash): fhash(ahash) {
! 122: saved=fhash.flocked;
! 123: fhash.flocked=true;
1.26 paf 124: }
125: ~VHash_lock() {
1.43.2.2! paf 126: fhash.flocked=saved;
1.26 paf 127: }
1.6 paf 128:
1.1 paf 129: };
130:
131: #endif
E-mail: