Annotation of parser3/src/types/pa_vobject.h, revision 1.70

1.6       paf         1: /**    @file
1.7       paf         2:        Parser: @b object class decl.
                      3: 
1.69      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_VOBJECT_H
                      9: #define PA_VOBJECT_H
                     10: 
1.70    ! moko       11: #define IDENT_PA_VOBJECT_H "$Id: pa_vobject.h,v 1.69 2023/09/26 20:49:12 moko Exp $"
1.39      paf        12: 
                     13: // includes
1.19      paf        14: 
1.1       paf        15: #include "pa_vjunction.h"
                     16: #include "pa_vclass.h"
1.4       paf        17: #include "pa_vstateless_object.h"
1.39      paf        18: #include "pa_vfile.h"
1.6       paf        19: 
1.23      paf        20: // defines
                     21: 
                     22: #define BASE_NAME "BASE"
                     23: 
1.26      paf        24: /**    parser class instance, stores 
                     25:        - class VObject::fclass;
                     26:        - fields VObject::ffields (dynamic, not static, which are stored in class).
1.6       paf        27: */
1.53      misha      28: class VObject: public Value {
1.39      paf        29: 
1.61      moko       30:        VClass& fclass;
1.53      misha      31:        HashStringValue ffields;
1.39      paf        32: 
1.56      moko       33:        enum State {
                     34:                IS_GETTER_ACTIVE = 0x01,
                     35:                IS_SETTER_ACTIVE = 0x02
                     36:        };
                     37: 
                     38:        int state; // default setter & getter state
                     39: 
1.1       paf        40: public: // Value
                     41:        
1.65      moko       42:        const char* type() const { return fclass.type(); }
1.53      misha      43:        override Value* as(const char* atype);
1.12      parser     44: 
1.25      paf        45:        /// VObject: fclass
1.39      paf        46:        override VStateless_class *get_class() { return &fclass; }
                     47: 
                     48:        override bool is_defined() const;
1.58      moko       49:        override Value& as_expr_result();
1.39      paf        50:        override int as_int() const;
1.49      misha      51:        override double as_double() const;
1.39      paf        52:        override bool as_bool() const;
1.70    ! moko       53:        override VFile* as_vfile();
1.33      paf        54:        
1.39      paf        55:        override HashStringValue* get_hash();
                     56:        override Table *get_table();
1.55      misha      57:        override HashStringValue* get_fields() { return &ffields; }
1.66      moko       58:        override HashStringValue* get_fields_reference() { return &ffields; }
1.33      paf        59: 
1.53      misha      60:        override Value* get_element(const String& aname);
1.61      moko       61:        override const VJunction* put_element(const String& name, Value* value);
1.63      moko       62: #ifdef FEATURE_GET_ELEMENT4CALL
                     63:        override Value* get_element4call(const String& aname);
                     64: #endif
1.24      paf        65: 
1.59      moko       66:        override const String* get_json_string(Json_options& options);
                     67: 
1.56      moko       68:        /// VObject default getter & setter support
                     69:        override void enable_default_getter(){ state |= IS_GETTER_ACTIVE; }
                     70:        override void enable_default_setter(){ if(fclass.has_default_setter()) state |= IS_SETTER_ACTIVE; }
                     71:        override void disable_default_getter(){ state &= ~IS_GETTER_ACTIVE; }
                     72:        override void disable_default_setter(){ state &= ~IS_SETTER_ACTIVE; }
                     73:        override bool is_enabled_default_getter(){ return (state & IS_GETTER_ACTIVE) > 0; }
1.62      moko       74:        override bool is_enabled_default_setter(){ return (state & IS_SETTER_ACTIVE) > 0; }
1.56      moko       75: 
1.1       paf        76: public: // creation
                     77: 
1.61      moko       78:        VObject(VClass& aclass): fclass(aclass), state(IS_GETTER_ACTIVE){}
1.1       paf        79: 
                     80: private:
                     81: 
1.60      moko       82:        Value* get_scalar_value(const char* as_something) const;
1.56      moko       83: };
                     84: 
                     85: ///    Auto-objects used for temporarily disabling setter/getter
                     86: 
                     87: class Temp_disable_default_getter {
                     88:        Value& fwhere;
                     89: public:
                     90:        Temp_disable_default_getter(Value& awhere) : fwhere(awhere) {
                     91:                fwhere.disable_default_getter();
                     92:        }
                     93:        ~Temp_disable_default_getter() { 
                     94:                fwhere.enable_default_getter();
                     95:        }
                     96: };
1.49      misha      97: 
1.56      moko       98: class Temp_disable_default_setter {
                     99:        Value& fwhere;
                    100: public:
                    101:        Temp_disable_default_setter(Value& awhere) : fwhere(awhere) {
                    102:                fwhere.disable_default_setter();
                    103:        }
                    104:        ~Temp_disable_default_setter() { 
                    105:                fwhere.enable_default_setter();
                    106:        }
1.1       paf       107: };
                    108: 
                    109: #endif

E-mail: