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

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.84    ! moko       11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.83 2023/09/26 20:49:12 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;
                     37: };
                     38: 
                     39: 
                     40: /// value of type 'hash', implemented with Hash
                     41: class VHash: public VHashBase {
                     42: public: // value
                     43: 
                     44:        /// VHash: count
1.46      paf        45:        override int as_int() const { return fhash.count(); }
1.68      misha      46:        override double as_double() const { return fhash.count(); }
1.80      moko       47:        override bool is_defined() const { return fhash.count()!=0 || _default!=NULL; }
1.68      misha      48:        override bool as_bool() const { return fhash.count()!=0; }
1.76      moko       49:        override Value& as_expr_result() { return *new VInt(fhash.count()); }
1.1       paf        50: 
1.11      paf        51:        /// VHash: fhash
1.76      moko       52:        override HashStringValue *get_hash() { return &fhash; }
1.66      misha      53:        override HashStringValue* get_fields() { return &fhash; }
1.76      moko       54:        override HashStringValue* get_fields_reference() { return &fhash; }
1.66      misha      55: 
1.11      paf        56:        /// VHash: (key)=value
1.76      moko       57:        override Value* get_element(const String& aname) {
1.70      moko       58:                // $element first
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'
1.74      moko       63:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
1.42      paf        64:                        return this;
1.13      paf        65: 
1.71      moko       66: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
1.73      moko       67:                // $method, CLASS, CLASS_NAME
1.62      misha      68:                if(Value* result=VStateless_object::get_element(aname))
1.16      parser     69:                        return result;
1.71      moko       70: #endif
1.16      parser     71: 
                     72:                // default value
1.22      parser     73:                return get_default();
1.1       paf        74:        }
1.84    ! moko       75: 
1.70      moko       76: #ifdef FEATURE_GET_ELEMENT4CALL
                     77:        override Value* get_element4call(const String& aname) {
                     78:                // $method first
                     79:                if(Value* result=VStateless_object::get_element(aname))
                     80:                        return result;
                     81: 
                     82:                // $element
                     83:                if(Value* result=fhash.get(aname))
                     84:                        return result;
                     85: 
                     86:                // default value
1.84    ! moko       87:                if(Value* result=get_default())
        !            88:                        return result;
        !            89: 
        !            90:                return bark("%s method not found", &aname);
1.70      moko       91:        }
                     92: #endif
1.84    ! moko       93: 
1.11      paf        94:        /// VHash: (key)=value
1.69      moko       95:        override const VJunction* put_element(const String& aname, Value* avalue) {
1.74      moko       96:                if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47      paf        97:                        set_default(avalue);
                     98:                else 
1.75      moko       99:                        fhash.put(aname, avalue);
1.36      paf       100: 
1.81      moko      101:                return 0;
1.1       paf       102:        }
1.52      paf       103: 
1.61      misha     104:        override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1       paf       105: 
                    106: public: // usage
                    107: 
1.75      moko      108:        VHash(): _default(0) {}
1.18      parser    109: 
1.75      moko      110:        VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7       paf       111: 
1.76      moko      112:        override HashStringValue& hash() { return fhash; }
                    113:        override void set_default(Value* adefault) { _default=adefault; }
                    114:        override Value* get_default() { return _default; }
                    115: 
                    116:        void extract_default();
                    117: 
                    118: private:
                    119: 
                    120:        HashStringValue fhash;
                    121:        Value* _default;
                    122: 
                    123: };
                    124: 
                    125: /// value of type 'hash', implemented with Hash reference
                    126: class VHashReference: public VHashBase {
                    127: public: // value
                    128: 
                    129:        /// VHash: count
                    130:        override int as_int() const { return fhash->count(); }
                    131:        override double as_double() const { return fhash->count(); }
                    132:        override bool is_defined() const { return fhash->count()!=0; }
                    133:        override bool as_bool() const { return fhash->count()!=0; }
                    134:        override Value& as_expr_result() { return *new VInt(fhash->count()); }
                    135: 
                    136:        /// VHash: fhash
                    137:        override HashStringValue *get_hash() { return fhash; }
                    138:        override HashStringValue* get_fields() { return fhash; }
1.77      moko      139:        override HashStringValue* get_fields_reference() { return fhash; }
1.76      moko      140: 
                    141:        /// VHash: (key)=value
                    142:        override Value* get_element(const String& aname) { 
                    143:                // $element first
                    144:                if(Value* result=fhash->get(aname))
                    145:                        return result;
                    146: 
                    147:                // $fields -- pseudo field to make 'hash' more like 'table'
                    148:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
                    149:                        return this;
                    150: 
                    151: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
                    152:                // $method, CLASS, CLASS_NAME
                    153:                if(Value* result=VStateless_object::get_element(aname))
                    154:                        return result;
                    155: #endif
                    156: 
                    157:                return 0;
1.67      moko      158:        }
1.76      moko      159:        
                    160: #ifdef FEATURE_GET_ELEMENT4CALL
                    161:        override Value* get_element4call(const String& aname) {
                    162:                // $method first
                    163:                if(Value* result=VStateless_object::get_element(aname))
                    164:                        return result;
1.67      moko      165: 
1.76      moko      166:                // $element
                    167:                if(Value* result=fhash->get(aname))
                    168:                        return result;
                    169: 
                    170:                return 0;
                    171:        }
                    172: #endif
                    173:        
                    174:        /// VHash: (key)=value
                    175:        override const VJunction* put_element(const String& aname, Value* avalue) {
                    176:                fhash->put(aname, avalue);
1.81      moko      177:                return 0;
1.22      parser    178:        }
1.75      moko      179: 
1.76      moko      180: public: // usage
                    181: 
                    182:        VHashReference(HashStringValue& source): fhash(&source) {}
1.53      paf       183: 
1.76      moko      184:        override HashStringValue& hash() { return *fhash; }
1.78      moko      185:        override void set_default(Value*) { }
1.76      moko      186:        override Value* get_default() { return 0; }
1.13      paf       187: 
1.1       paf       188: private:
1.6       paf       189: 
1.76      moko      190:        HashStringValue *fhash;
1.26      paf       191: };
                    192: 
1.1       paf       193: #endif

E-mail: