Annotation of parser3/src/types/pa_vhash.h, revision 1.61
1.10 paf 1: /** @file
2: Parser: @b hash parser type decl.
3:
1.60 misha 4: Copyright (c) 2001-2009 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.61 ! misha 11: static const char * const IDENT_VHASH_H="$Date: 2009-07-06 12:10: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.57 paf 75: override const VJunction* put_element(Value& /*aself*/, 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) {
1.55 paf 80: if(!fhash.put_replaced(aname, avalue))
1.59 misha 81: throw Exception(PARSER_RUNTIME,
1.47 paf 82: &aname,
83: "can not insert new hash key (hash flocked)");
84: } else
85: fhash.put(aname, avalue);
1.36 paf 86:
1.54 paf 87: return PUT_ELEMENT_REPLACED_ELEMENT;
1.1 paf 88: }
1.52 paf 89:
1.61 ! misha 90: override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1 paf 91:
92: public: // usage
93:
1.47 paf 94: VHash(): flocked(false), _default(0) {}
1.18 parser 95:
1.47 paf 96: VHash(const HashStringValue& source): fhash(source), flocked(false), _default(0) {}
1.7 paf 97:
1.46 paf 98: HashStringValue& hash() {
99: check_lock();
1.26 paf 100: return fhash;
101: }
1.1 paf 102:
1.44 paf 103: void set_default(Value* adefault) {
1.47 paf 104: _default=adefault;
1.22 parser 105: }
1.46 paf 106: Value* get_default() {
1.47 paf 107: return _default;
1.22 parser 108: }
1.53 paf 109:
110: void extract_default();
1.13 paf 111:
1.46 paf 112: void check_lock() {
113: if(flocked)
1.59 misha 114: throw Exception(PARSER_RUNTIME,
1.46 paf 115: 0,
116: "can not modify hash (flocked)");
1.26 paf 117: }
118:
1.1 paf 119: private:
1.6 paf 120:
1.48 paf 121: HashStringValue fhash;
1.46 paf 122: bool flocked;
1.47 paf 123: Value* _default;
1.26 paf 124:
125: };
126:
127: class VHash_lock {
128: VHash& fhash;
129: bool saved;
130: public:
1.46 paf 131: VHash_lock(VHash& ahash): fhash(ahash) {
132: saved=fhash.flocked;
133: fhash.flocked=true;
1.26 paf 134: }
135: ~VHash_lock() {
1.46 paf 136: fhash.flocked=saved;
1.26 paf 137: }
1.6 paf 138:
1.1 paf 139: };
140:
141: #endif
E-mail: