Annotation of parser3/src/types/pa_valiased.h, revision 1.6
1.6 ! paf 1: /** @file
! 2: Parser: aliased class decls.
! 3:
1.1 paf 4: Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.6 ! paf 5:
1.2 paf 6: Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.1 paf 7:
1.6 ! paf 8: $Id: pa_valiased.h,v 1.5 2001/03/19 17:42:17 paf Exp $
1.1 paf 9: */
10:
11: #ifndef PA_VALIASED_H
12: #define PA_VALIASED_H
13:
14: #include "pa_value.h"
15:
16: class Temp_alias;
17:
1.6 ! paf 18: /**
! 19: the object or class which effective class can change along method call.
! 20:
! 21: consider this:
! 22: @verbatim
! 23: @CLASS
! 24: article
! 25: @display[]
! 26: ^display_head[]
! 27: ^display_body[]
! 28: ^display_tail[]
! 29:
! 30: @CLASS
! 31: news_article
! 32: @display_tail[]
! 33: ...some calls...
! 34:
! 35: @main[]
! 36: $na[^news_article:load[]]
! 37: ^na.display[]
! 38: @endverbatim
! 39: here ^na.display[] call would go to \a article class
! 40: then back to news_article:display_tail.
! 41:
! 42: basically object's effective class changed twice:
! 43: -# from news_article to article in ^display[] call
! 44: -# from article to news_article in ^display_tail[] call
! 45:
! 46: @see Temp_alias
! 47: */
1.5 paf 48: class VAliased : public Value {
1.1 paf 49: friend Temp_alias;
50: public: // creation
51:
1.3 paf 52: VAliased(Pool& apool, VStateless_class& aclass_alias) : Value(apool),
1.1 paf 53: fclass_alias(&aclass_alias) {
54: }
55:
56: // valiased: this
57: VAliased *get_aliased() { return this; }
58:
59: private: // alias handling
60:
61: // VAliased replacement mechanism is 'protected' from direct usage
62: // Temp_alias object enforces paired set/restore
1.3 paf 63: VStateless_class *set_alias(VStateless_class *aclass_alias) {
64: VStateless_class *result=fclass_alias;
1.1 paf 65: fclass_alias=aclass_alias;
66: return result;
67: }
1.3 paf 68: void restore_alias(VStateless_class *aclass_alias) {
1.1 paf 69: fclass_alias=aclass_alias;
70: }
71:
72: protected:
73:
1.3 paf 74: VStateless_class *fclass_alias;
1.1 paf 75: };
76:
1.6 ! paf 77: /// Auto-object used for temporarily changing object's effective class
1.1 paf 78: class Temp_alias {
79: VAliased& vobject;
1.3 paf 80: VStateless_class *saved_alias;
1.1 paf 81: public:
1.3 paf 82: Temp_alias(VAliased& avobject, VStateless_class& alias) :
1.1 paf 83: vobject(avobject),
84: saved_alias(avobject.set_alias(&alias)) {
85: }
86: ~Temp_alias() {
87: vobject.restore_alias(saved_alias);
88: }
89: };
90:
91: #endif
E-mail: