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

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.6     ! paf         8:        $Id: pa_valiased.h,v 1.5 2001/03/19 17:42:17 paf Exp $
1.1       paf         9: */
                     10: 
                     11: #ifndef PA_VALIASED_H
                     12: #define PA_VALIASED_H
                     13: 
                     14: #include "pa_value.h"
                     15: 
                     16: class Temp_alias;
                     17: 
1.6     ! paf        18: /**
        !            19:        the object or class which effective class can change along method call.
        !            20: 
        !            21:        consider this:
        !            22:        @verbatim
        !            23:                @CLASS
        !            24:                article
        !            25:                @display[]
        !            26:                ^display_head[]
        !            27:                ^display_body[]
        !            28:                ^display_tail[]
        !            29: 
        !            30:                @CLASS
        !            31:                news_article
        !            32:                @display_tail[]
        !            33:                ...some calls...
        !            34: 
        !            35:                @main[]
        !            36:                $na[^news_article:load[]]
        !            37:                ^na.display[]
        !            38:        @endverbatim
        !            39:        here ^na.display[] call would go to \a article class
        !            40:        then back to news_article:display_tail.
        !            41: 
        !            42:        basically object's effective class changed twice:
        !            43:        -# from news_article to article in ^display[] call
        !            44:        -# from article to news_article in ^display_tail[] call
        !            45:          
        !            46:        @see Temp_alias
        !            47: */
1.5       paf        48: class VAliased : public Value {
1.1       paf        49:        friend Temp_alias;
                     50: public: // creation
                     51: 
1.3       paf        52:        VAliased(Pool& apool, VStateless_class& aclass_alias) : Value(apool), 
1.1       paf        53:                fclass_alias(&aclass_alias) {
                     54:        }
                     55: 
                     56:        // valiased: this
                     57:        VAliased *get_aliased() { return this; }
                     58: 
                     59: private: // alias handling
                     60: 
                     61:        // VAliased replacement mechanism is 'protected' from direct usage
                     62:        // Temp_alias object enforces paired set/restore
1.3       paf        63:        VStateless_class *set_alias(VStateless_class *aclass_alias) {
                     64:                VStateless_class *result=fclass_alias;
1.1       paf        65:                fclass_alias=aclass_alias;
                     66:                return result;
                     67:        }
1.3       paf        68:        void restore_alias(VStateless_class *aclass_alias) {
1.1       paf        69:                fclass_alias=aclass_alias;
                     70:        }
                     71: 
                     72: protected:
                     73: 
1.3       paf        74:        VStateless_class *fclass_alias;
1.1       paf        75: };
                     76: 
1.6     ! paf        77: ///    Auto-object used for temporarily changing object's effective class
1.1       paf        78: class Temp_alias {
                     79:        VAliased& vobject;
1.3       paf        80:        VStateless_class *saved_alias;
1.1       paf        81: public:
1.3       paf        82:        Temp_alias(VAliased& avobject, VStateless_class& alias) : 
1.1       paf        83:                vobject(avobject),
                     84:                saved_alias(avobject.set_alias(&alias)) {
                     85:        }
                     86:        ~Temp_alias() { 
                     87:                vobject.restore_alias(saved_alias); 
                     88:        }
                     89: };
                     90: 
                     91: #endif

E-mail: