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