Annotation of parser3/src/types/pa_vhash.h, revision 1.53
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.53 ! paf 11: static const char * const IDENT_VHASH_H="$Date: 2004/07/26 14:43:09 $";
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.53 ! paf 110:
! 111: void extract_default();
1.13 paf 112:
1.46 paf 113: void check_lock() {
114: if(flocked)
1.30 paf 115: throw Exception("parser.runtime",
1.46 paf 116: 0,
117: "can not modify hash (flocked)");
1.26 paf 118: }
119:
1.1 paf 120: private:
1.6 paf 121:
1.48 paf 122: HashStringValue fhash;
1.46 paf 123: bool flocked;
1.47 paf 124: Value* _default;
1.26 paf 125:
126: };
127:
128: class VHash_lock {
129: VHash& fhash;
130: bool saved;
131: public:
1.46 paf 132: VHash_lock(VHash& ahash): fhash(ahash) {
133: saved=fhash.flocked;
134: fhash.flocked=true;
1.26 paf 135: }
136: ~VHash_lock() {
1.46 paf 137: fhash.flocked=saved;
1.26 paf 138: }
1.6 paf 139:
1.1 paf 140: };
141:
142: #endif
E-mail: