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

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.76    ! moko       11: #define IDENT_PA_VHASH_H "$Id: pa_vhash.h,v 1.75 2016/07/04 17:26:23 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; }
        !           136: 
        !           137:        /// VHash: (key)=value
        !           138:        override Value* get_element(const String& aname) { 
        !           139:                // $element first
        !           140:                if(Value* result=fhash->get(aname))
        !           141:                        return result;
        !           142: 
        !           143:                // $fields -- pseudo field to make 'hash' more like 'table'
        !           144:                if(SYMBOLS_EQ(aname,FIELDS_SYMBOL))
        !           145:                        return this;
        !           146: 
        !           147: #if !defined(FEATURE_GET_ELEMENT4CALL) || !defined(OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL)
        !           148:                // $method, CLASS, CLASS_NAME
        !           149:                if(Value* result=VStateless_object::get_element(aname))
        !           150:                        return result;
        !           151: #endif
        !           152: 
        !           153:                return 0;
1.67      moko      154:        }
1.76    ! moko      155:        
        !           156: #ifdef FEATURE_GET_ELEMENT4CALL
        !           157:        override Value* get_element4call(const String& aname) {
        !           158:                // $method first
        !           159:                if(Value* result=VStateless_object::get_element(aname))
        !           160:                        return result;
1.67      moko      161: 
1.76    ! moko      162:                // $element
        !           163:                if(Value* result=fhash->get(aname))
        !           164:                        return result;
        !           165: 
        !           166:                return 0;
        !           167:        }
        !           168: #endif
        !           169:        
        !           170:        /// VHash: (key)=value
        !           171:        override const VJunction* put_element(const String& aname, Value* avalue) {
        !           172:                fhash->put(aname, avalue);
        !           173:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.22      parser    174:        }
1.75      moko      175: 
1.76    ! moko      176: public: // usage
        !           177: 
        !           178:        VHashReference(HashStringValue& source): fhash(&source) {}
1.53      paf       179: 
1.76    ! moko      180:        override HashStringValue& hash() { return *fhash; }
        !           181:        override void set_default(Value* adefault) { }
        !           182:        override Value* get_default() { return 0; }
1.13      paf       183: 
1.1       paf       184: private:
1.6       paf       185: 
1.76    ! moko      186:        HashStringValue *fhash;
1.26      paf       187: };
                    188: 
1.1       paf       189: #endif

E-mail: