Annotation of parser3/src/include/pa_vobject.h, revision 1.6.2.1

1.1       paf         1: /*
1.6.2.1 ! paf         2:   $Id: pa_vobject.h,v 1.6 2001/02/25 14:23:31 paf Exp $
1.1       paf         3: */
                      4: 
                      5: #ifndef PA_VOBJECT_H
                      6: #define PA_VOBJECT_H
                      7: 
                      8: #include "pa_value.h"
                      9: #include "pa_vjunction.h"
1.4       paf        10: 
1.6.2.1 ! paf        11: class Temp_class_alias;
        !            12: 
1.1       paf        13: class VObject : public Value {
1.6.2.1 ! paf        14:        friend Temp_class_alias;
1.1       paf        15: public: // Value
                     16:        
                     17:        // all: for error reporting after fail(), etc
                     18:        const char *type() const { return "Object"; }
                     19: 
1.4       paf        20:        // object_instance: (field)=value;(CLASS)=vclass;(method)=method_ref
1.1       paf        21:        Value *get_element(const String& name) {
1.4       paf        22:                // $CLASS=my class
                     23:                if(name==CLASS_NAME)
1.6.2.1 ! paf        24:                        return class_alias;
1.6       paf        25:                // $BASE=my parent
                     26:                if(name==BASE_NAME)
1.6.2.1 ! paf        27:                        return class_alias->base();
        !            28:                // $method=junction(self+class+method)
        !            29:                if(Junction *junction=class_real.get_junction(*this, name))
        !            30:                        return NEW VJunction(*junction);
1.1       paf        31:                // $field=fields.field
                     32:                return static_cast<Value *>(fields.get(name));
                     33:        }
                     34: 
                     35:        // object_instance: (field)=value
                     36:        void put_element(const String& name, Value *value) {
                     37:                // speed1:
1.4       paf        38:                //   will not check for '$CLASS(subst)' trick
1.1       paf        39:                //   will hope that user ain't THAT self-hating person
                     40:                // speed2:
                     41:                //   will not check for '$method_name(subst)' trick
                     42:                //   -same-
                     43: 
                     44:                fields.put(name, value);
                     45:        }
                     46: 
                     47:        // object_class, object_instance: object_class
1.6.2.1 ! paf        48:        VClass *get_class() { return &class_real; }
1.1       paf        49: 
                     50: public: // creation
                     51: 
                     52:        VObject(Pool& apool, VClass& vclass) : 
                     53:                Value(apool), 
1.6.2.1 ! paf        54:                class_real(vclass),
        !            55:                class_alias(&vclass),
1.1       paf        56:                fields(apool) {
                     57:        }
                     58: 
1.6.2.1 ! paf        59: protected: // vclass handling
        !            60: 
        !            61:        // vclass replacement mechanism is 'protected' from direct usage
        !            62:        // Temp_class_alias object enforces paired set/restore
        !            63:        VClass *set_alias(VClass *aalias){
        !            64:                VClass *result=aalias;
        !            65:                class_alias=aalias;
        !            66:                return result;
        !            67:        }
        !            68:        void restore_alias(VClass *aalias) {
        !            69:                class_alias=aalias;
        !            70:        }
        !            71: 
1.1       paf        72: private:
                     73: 
1.6.2.1 ! paf        74:        VClass& class_real;
        !            75:        VClass *class_alias;
1.1       paf        76:        Hash fields;
1.6.2.1 ! paf        77: };
        !            78: 
        !            79: class Temp_class_alias {
        !            80:        VObject vobject;
        !            81:        VClass *saved_alias;
        !            82: public:
        !            83:        Temp_class_alias(VObject& avobject, VClass& alias) : 
        !            84:                vobject(avobject),
        !            85:                saved_alias(avobject.set_alias(&alias)) {
        !            86:        }
        !            87:        ~Temp_class_alias() { 
        !            88:                vobject.restore_alias(saved_alias); 
        !            89:        }
1.1       paf        90: };
                     91: 
                     92: #endif

E-mail: