Annotation of parser3/src/types/pa_vhash.h, revision 1.85

1.10      paf         1: /** @file
                      2:        Parser: @b hash parser type decl.
                      3: 
1.83      moko        4:        Copyright (c) 2001-2023 Art. Lebedev Studio (http://www.artlebedev.com)
                      5:        Authors: Konstantin Morshnev <moko@design.ru>, Alexandr Petrosian <paf@design.ru>
1.1       paf         6: */
                      7: 
                      8: #ifndef PA_VHASH_H
                      9: #define PA_VHASH_H
1.34      paf        10: 
1.85    ! moko       11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.84 2023/10/02 02:58:01 moko Exp $"
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.74      moko       18: #include "pa_symbols.h"
1.1       paf        19: 
1.39      paf        20: // defines
                     21: 
                     22: #define VHASH_TYPE "hash"
1.63      moko       23: 
1.46      paf        24: extern Methoded* hash_class;
1.13      paf        25: 
1.76      moko       26: class VHashBase: public VStateless_object {
1.1       paf        27: public: // value
                     28: 
1.46      paf        29:        override const char* type() const { return VHASH_TYPE; }
                     30:        override VStateless_class *get_class() { return hash_class; }
1.17      parser     31: 
1.76      moko       32: public: // usage
                     33: 
                     34:        virtual HashStringValue& hash()=0;
                     35:        virtual void set_default(Value* adefault)=0;
                     36:        virtual Value* get_default()=0;
1.85    ! moko       37:        virtual void add(Value* avalue)=0;
1.76      moko       38: };
                     39: 
                     40: 
                     41: /// value of type 'hash', implemented with Hash
                     42: class VHash: public VHashBase {
                     43: public: // value
                     44: 
                     45:        /// VHash: count
1.46      paf        46:        override int as_int() const { return fhash.count(); }
1.68      misha      47:        override double as_double() const { return fhash.count(); }
1.80      moko       48:        override bool is_defined() const { return fhash.count()!=0 || _default!=NULL; }
1.68      misha      49:        override bool as_bool() const { return fhash.count()!=0; }
1.76      moko       50:        override Value& as_expr_result() { return *new VInt(fhash.count()); }
1.1       paf        51: 
1.11      paf        52:        /// VHash: fhash
1.76      moko       53:        override HashStringValue *get_hash() { return &fhash; }
1.66      misha      54:        override HashStringValue* get_fields() { return &fhash; }
1.76      moko       55:        override HashStringValue* get_fields_reference() { return &fhash; }
1.66      misha      56: 
1.11      paf        57:        /// VHash: (key)=value
1.76      moko       58:        override Value* get_element(const String& aname) {
1.70      moko       59:                // $element first
1.46      paf        60:                if(Value* result=fhash.get(aname))
1.13      paf        61:                        return result;
1.42      paf        62: 
                     63:                // $fields -- pseudo field to make 'hash' more like 'table'
1.74      moko       64:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
1.42      paf        65:                        return this;
1.13      paf        66: 
1.71      moko       67: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
1.73      moko       68:                // $method, CLASS, CLASS_NAME
1.62      misha      69:                if(Value* result=VStateless_object::get_element(aname))
1.16      parser     70:                        return result;
1.71      moko       71: #endif
1.16      parser     72: 
                     73:                // default value
1.22      parser     74:                return get_default();
1.1       paf        75:        }
1.84      moko       76: 
1.70      moko       77: #ifdef FEATURE_GET_ELEMENT4CALL
                     78:        override Value* get_element4call(const String& aname) {
                     79:                // $method first
                     80:                if(Value* result=VStateless_object::get_element(aname))
                     81:                        return result;
                     82: 
                     83:                // $element
                     84:                if(Value* result=fhash.get(aname))
                     85:                        return result;
                     86: 
                     87:                // default value
1.84      moko       88:                if(Value* result=get_default())
                     89:                        return result;
                     90: 
                     91:                return bark("%s method not found", &aname);
1.70      moko       92:        }
                     93: #endif
1.84      moko       94: 
1.11      paf        95:        /// VHash: (key)=value
1.69      moko       96:        override const VJunction* put_element(const String& aname, Value* avalue) {
1.74      moko       97:                if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47      paf        98:                        set_default(avalue);
                     99:                else 
1.75      moko      100:                        fhash.put(aname, avalue);
1.36      paf       101: 
1.81      moko      102:                return 0;
1.1       paf       103:        }
1.52      paf       104: 
1.61      misha     105:        override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1       paf       106: 
                    107: public: // usage
                    108: 
1.75      moko      109:        VHash(): _default(0) {}
1.18      parser    110: 
1.75      moko      111:        VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7       paf       112: 
1.76      moko      113:        override HashStringValue& hash() { return fhash; }
                    114:        override void set_default(Value* adefault) { _default=adefault; }
                    115:        override Value* get_default() { return _default; }
1.85    ! moko      116:        override void add(Value* avalue) { fhash.put(String::Body::Format(fhash.count()), avalue); }
1.76      moko      117: 
                    118:        void extract_default();
                    119: 
                    120: private:
                    121: 
                    122:        HashStringValue fhash;
                    123:        Value* _default;
                    124: 
                    125: };
                    126: 
                    127: /// value of type 'hash', implemented with Hash reference
                    128: class VHashReference: public VHashBase {
                    129: public: // value
                    130: 
                    131:        /// VHash: count
                    132:        override int as_int() const { return fhash->count(); }
                    133:        override double as_double() const { return fhash->count(); }
                    134:        override bool is_defined() const { return fhash->count()!=0; }
                    135:        override bool as_bool() const { return fhash->count()!=0; }
                    136:        override Value& as_expr_result() { return *new VInt(fhash->count()); }
                    137: 
                    138:        /// VHash: fhash
                    139:        override HashStringValue *get_hash() { return fhash; }
                    140:        override HashStringValue* get_fields() { return fhash; }
1.77      moko      141:        override HashStringValue* get_fields_reference() { return fhash; }
1.76      moko      142: 
                    143:        /// VHash: (key)=value
                    144:        override Value* get_element(const String& aname) { 
                    145:                // $element first
                    146:                if(Value* result=fhash->get(aname))
                    147:                        return result;
                    148: 
                    149:                // $fields -- pseudo field to make 'hash' more like 'table'
                    150:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
                    151:                        return this;
                    152: 
                    153: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
                    154:                // $method, CLASS, CLASS_NAME
                    155:                if(Value* result=VStateless_object::get_element(aname))
                    156:                        return result;
                    157: #endif
                    158: 
                    159:                return 0;
1.67      moko      160:        }
1.76      moko      161:        
                    162: #ifdef FEATURE_GET_ELEMENT4CALL
                    163:        override Value* get_element4call(const String& aname) {
                    164:                // $method first
                    165:                if(Value* result=VStateless_object::get_element(aname))
                    166:                        return result;
1.67      moko      167: 
1.76      moko      168:                // $element
                    169:                if(Value* result=fhash->get(aname))
                    170:                        return result;
                    171: 
                    172:                return 0;
                    173:        }
                    174: #endif
                    175:        
                    176:        /// VHash: (key)=value
                    177:        override const VJunction* put_element(const String& aname, Value* avalue) {
                    178:                fhash->put(aname, avalue);
1.81      moko      179:                return 0;
1.22      parser    180:        }
1.75      moko      181: 
1.76      moko      182: public: // usage
                    183: 
                    184:        VHashReference(HashStringValue& source): fhash(&source) {}
1.53      paf       185: 
1.76      moko      186:        override HashStringValue& hash() { return *fhash; }
1.78      moko      187:        override void set_default(Value*) { }
1.76      moko      188:        override Value* get_default() { return 0; }
1.85    ! moko      189:        override void add(Value* avalue) { fhash->put(String::Body::Format(fhash->count()), avalue); }
1.13      paf       190: 
1.1       paf       191: private:
1.6       paf       192: 
1.76      moko      193:        HashStringValue *fhash;
1.26      paf       194: };
                    195: 
1.1       paf       196: #endif

E-mail: