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

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.8     ! paf         8:        $Id: pa_valiased.h,v 1.7 2001/03/19 22:38:11 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: 
                     60:        // valiased: this
                     61:        VAliased *get_aliased() { return this; }
1.7       paf        62: 
                     63:        // VAliased: $CLASS, $BASE
                     64:        Value *get_element(const String& aname);
1.1       paf        65: 
                     66: private: // alias handling
                     67: 
                     68:        // VAliased replacement mechanism is 'protected' from direct usage
                     69:        // Temp_alias object enforces paired set/restore
1.3       paf        70:        VStateless_class *set_alias(VStateless_class *aclass_alias) {
                     71:                VStateless_class *result=fclass_alias;
1.1       paf        72:                fclass_alias=aclass_alias;
                     73:                return result;
                     74:        }
1.3       paf        75:        void restore_alias(VStateless_class *aclass_alias) {
1.1       paf        76:                fclass_alias=aclass_alias;
                     77:        }
                     78: 
                     79: protected:
                     80: 
1.3       paf        81:        VStateless_class *fclass_alias;
1.1       paf        82: };
                     83: 
1.6       paf        84: ///    Auto-object used for temporarily changing object's effective class
1.1       paf        85: class Temp_alias {
                     86:        VAliased& vobject;
1.3       paf        87:        VStateless_class *saved_alias;
1.1       paf        88: public:
1.3       paf        89:        Temp_alias(VAliased& avobject, VStateless_class& alias) : 
1.1       paf        90:                vobject(avobject),
                     91:                saved_alias(avobject.set_alias(&alias)) {
                     92:        }
                     93:        ~Temp_alias() { 
                     94:                vobject.restore_alias(saved_alias); 
                     95:        }
                     96: };
                     97: 
                     98: #endif

E-mail: