Annotation of parser3/src/types/pa_valiased.h, revision 1.12

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

E-mail: