Annotation of parser3/src/types/pa_valiased.h, revision 1.22
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: */
7:
8: #ifndef PA_VALIASED_H
9: #define PA_VALIASED_H
1.21 paf 10:
1.22 ! paf 11: static const char* IDENT_VALIASED_H="$Date: pa_valiased.h,v 1.21 2002/08/01 11:26:53 paf Exp $";
1.1 paf 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.20 paf 55: VAliased(Pool& apool) : Value(apool) {}
1.1 paf 56:
1.9 paf 57: /// VAliased: this
1.1 paf 58: VAliased *get_aliased() { return this; }
1.7 paf 59:
1.19 paf 60: /// VAliased: $CLASS [if not disabled by VAliased::hide_class()]
1.7 paf 61: Value *get_element(const String& aname);
1.1 paf 62:
1.9 paf 63: protected: // VAliased
64:
65: /**
1.13 parser 66: used in get_element for getting $CLASS.
1.9 paf 67:
1.12 paf 68: to disable those elements classes can override
69: this method with @c {return true;}
1.9 paf 70: */
1.12 paf 71: virtual bool hide_class() { return false; }
1.9 paf 72:
1.19 paf 73: //{@ VAliased replacement mechanism is 'private'zed from direct usage
74: /// Temp_alias object enforces paired set/restore
75: virtual void set_alias(VStateless_class * /*aclass_alias*/) {}
76: virtual VStateless_class *get_alias() { return 0; }
77: //}@
1.1 paf 78:
79: };
80:
1.6 paf 81: /// Auto-object used for temporarily changing object's effective class
1.1 paf 82: class Temp_alias {
83: VAliased& vobject;
1.3 paf 84: VStateless_class *saved_alias;
1.1 paf 85: public:
1.3 paf 86: Temp_alias(VAliased& avobject, VStateless_class& alias) :
1.1 paf 87: vobject(avobject),
1.19 paf 88: saved_alias(avobject.get_alias()) {
89: avobject.set_alias(&alias);
1.1 paf 90: }
91: ~Temp_alias() {
1.19 paf 92: vobject.set_alias(saved_alias);
1.1 paf 93: }
94: };
95:
96: #endif
E-mail: