Annotation of parser3/src/types/pa_valiased.h, revision 1.19
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.19 ! paf 7: $Id: pa_valiased.h,v 1.18 2002/02/08 08:30:18 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.19 ! paf 55: VAliased(Pool& apool, VStateless_class& aclass_alias) : 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: