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

1.10      paf         1: /** @file
                      2:        Parser: @b hash parser type decl.
                      3: 
1.72      moko        4:        Copyright (c) 2001-2015 Art. Lebedev Studio (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.77    ! moko       11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.76 2016/07/20 13:57:04 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(); }
                     47:        override bool is_defined() const { return fhash.count()!=0; }
                     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:        }
                     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
                     87:                return get_default();
                     88:        }
                     89: #endif
                     90:        
1.11      paf        91:        /// VHash: (key)=value
1.69      moko       92:        override const VJunction* put_element(const String& aname, Value* avalue) {
1.74      moko       93:                if(SYMBOLS_EQ(aname,_DEFAULT_SYMBOL))
1.47      paf        94:                        set_default(avalue);
                     95:                else 
1.75      moko       96:                        fhash.put(aname, avalue);
1.36      paf        97: 
1.54      paf        98:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.1       paf        99:        }
1.52      paf       100: 
1.61      misha     101:        override VFile* as_vfile(String::Language lang, const Request_charsets *charsets=0);
1.1       paf       102: 
                    103: public: // usage
                    104: 
1.75      moko      105:        VHash(): _default(0) {}
1.18      parser    106: 
1.75      moko      107:        VHash(const HashStringValue& source): fhash(source), _default(0) {}
1.7       paf       108: 
1.76      moko      109:        override HashStringValue& hash() { return fhash; }
                    110:        override void set_default(Value* adefault) { _default=adefault; }
                    111:        override Value* get_default() { return _default; }
                    112: 
                    113:        void extract_default();
                    114: 
                    115: private:
                    116: 
                    117:        HashStringValue fhash;
                    118:        Value* _default;
                    119: 
                    120: };
                    121: 
                    122: /// value of type 'hash', implemented with Hash reference
                    123: class VHashReference: public VHashBase {
                    124: public: // value
                    125: 
                    126:        /// VHash: count
                    127:        override int as_int() const { return fhash->count(); }
                    128:        override double as_double() const { return fhash->count(); }
                    129:        override bool is_defined() const { return fhash->count()!=0; }
                    130:        override bool as_bool() const { return fhash->count()!=0; }
                    131:        override Value& as_expr_result() { return *new VInt(fhash->count()); }
                    132: 
                    133:        /// VHash: fhash
                    134:        override HashStringValue *get_hash() { return fhash; }
                    135:        override HashStringValue* get_fields() { return fhash; }
1.77    ! moko      136:        override HashStringValue* get_fields_reference() { return fhash; }
1.76      moko      137: 
                    138:        /// VHash: (key)=value
                    139:        override Value* get_element(const String& aname) { 
                    140:                // $element first
                    141:                if(Value* result=fhash->get(aname))
                    142:                        return result;
                    143: 
                    144:                // $fields -- pseudo field to make 'hash' more like 'table'
                    145:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
                    146:                        return this;
                    147: 
                    148: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
                    149:                // $method, CLASS, CLASS_NAME
                    150:                if(Value* result=VStateless_object::get_element(aname))
                    151:                        return result;
                    152: #endif
                    153: 
                    154:                return 0;
1.67      moko      155:        }
1.76      moko      156:        
                    157: #ifdef FEATURE_GET_ELEMENT4CALL
                    158:        override Value* get_element4call(const String& aname) {
                    159:                // $method first
                    160:                if(Value* result=VStateless_object::get_element(aname))
                    161:                        return result;
1.67      moko      162: 
1.76      moko      163:                // $element
                    164:                if(Value* result=fhash->get(aname))
                    165:                        return result;
                    166: 
                    167:                return 0;
                    168:        }
                    169: #endif
                    170:        
                    171:        /// VHash: (key)=value
                    172:        override const VJunction* put_element(const String& aname, Value* avalue) {
                    173:                fhash->put(aname, avalue);
                    174:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.22      parser    175:        }
1.75      moko      176: 
1.76      moko      177: public: // usage
                    178: 
                    179:        VHashReference(HashStringValue& source): fhash(&source) {}
1.53      paf       180: 
1.76      moko      181:        override HashStringValue& hash() { return *fhash; }
                    182:        override void set_default(Value* adefault) { }
                    183:        override Value* get_default() { return 0; }
1.13      paf       184: 
1.1       paf       185: private:
1.6       paf       186: 
1.76      moko      187:        HashStringValue *fhash;
1.26      paf       188: };
                    189: 
1.1       paf       190: #endif

E-mail: