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: