Annotation of parser3/src/types/pa_vhash.h, revision 1.52
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.50 paf 4: Copyright (c) 2001-2004 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.52 ! paf 11: static const char * const IDENT_VHASH_H="$Date: 2004/05/12 10:16:49 $";
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.51 paf 47: override bool is_defined() const { return as_bool(); }
1.23 parser 48: /// VHash: count!=0
1.51 paf 49: override bool as_bool() const { return as_int()!=0; }
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: }
1.52 ! paf 89:
! 90: override VFile* as_vfile(String::Language lang=String::L_UNSPECIFIED,
! 91: const Request_charsets *charsets=0);
1.1 paf 92:
93: public: // usage
94:
1.47 paf 95: VHash(): flocked(false), _default(0) {}
1.18 parser 96:
1.47 paf 97: VHash(const HashStringValue& source): fhash(source), flocked(false), _default(0) {}
1.7 paf 98:
1.46 paf 99: HashStringValue& hash() {
100: check_lock();
1.26 paf 101: return fhash;
102: }
1.1 paf 103:
1.44 paf 104: void set_default(Value* adefault) {
1.47 paf 105: _default=adefault;
1.22 parser 106: }
1.46 paf 107: Value* get_default() {
1.47 paf 108: return _default;
1.22 parser 109: }
1.13 paf 110:
1.46 paf 111: void check_lock() {
112: if(flocked)
1.30 paf 113: throw Exception("parser.runtime",
1.46 paf 114: 0,
115: "can not modify hash (flocked)");
1.26 paf 116: }
117:
1.1 paf 118: private:
1.6 paf 119:
1.48 paf 120: HashStringValue fhash;
1.46 paf 121: bool flocked;
1.47 paf 122: Value* _default;
1.26 paf 123:
124: };
125:
126: class VHash_lock {
127: VHash& fhash;
128: bool saved;
129: public:
1.46 paf 130: VHash_lock(VHash& ahash): fhash(ahash) {
131: saved=fhash.flocked;
132: fhash.flocked=true;
1.26 paf 133: }
134: ~VHash_lock() {
1.46 paf 135: fhash.flocked=saved;
1.26 paf 136: }
1.6 paf 137:
1.1 paf 138: };
139:
140: #endif
E-mail: