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: