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: