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

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.9     ! paf         8:        $Id: pa_valiased.h,v 1.8 2001/03/20 06:45:20 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: /**
        !            69:        used in get_element for getting $CLASS and $BASE @returns current class alias.
        !            70: 
        !            71:        some classes have only dynamic method calls
        !            72:        and don't want to deal with static method calls:
        !            73:        they don't want to check for @c self validity [whether it is 'object' or a 'class'],
        !            74:        they want to assume they just called with 'object' @c self.
        !            75: 
        !            76:        more that that - they even have no name in Parser -
        !            77:        they are not registered in in Request::classes.
        !            78: 
        !            79:        so the only way to get to the class having no ability 
        !            80:        to use @c $CLASS_NAME: or @c ^CLASS_NAME: syntax is to use something like this:
        !            81: 
        !            82:        ex: VInt
        !            83:                this is nonsense:
        !            84:                @verbatim
        !            85:                        $a(123) $ac[$a.CLASS] ^ac.inc[48]
        !            86:                @endverbatim
        !            87: 
        !            88:        to disable that and to enable no 'self' checks in methods realisations
        !            89:        such classes can override it with @c {return0;}
        !            90: */
        !            91:        virtual VStateless_class *get_class_alias() { return fclass_alias; }
        !            92: 
1.1       paf        93: private: // alias handling
                     94: 
1.9     ! paf        95:        // VAliased replacement mechanism is 'private'zed from direct usage
1.1       paf        96:        // Temp_alias object enforces paired set/restore
1.3       paf        97:        VStateless_class *set_alias(VStateless_class *aclass_alias) {
                     98:                VStateless_class *result=fclass_alias;
1.1       paf        99:                fclass_alias=aclass_alias;
                    100:                return result;
                    101:        }
1.3       paf       102:        void restore_alias(VStateless_class *aclass_alias) {
1.1       paf       103:                fclass_alias=aclass_alias;
                    104:        }
                    105: 
                    106: protected:
                    107: 
1.3       paf       108:        VStateless_class *fclass_alias;
1.1       paf       109: };
                    110: 
1.6       paf       111: ///    Auto-object used for temporarily changing object's effective class
1.1       paf       112: class Temp_alias {
                    113:        VAliased& vobject;
1.3       paf       114:        VStateless_class *saved_alias;
1.1       paf       115: public:
1.3       paf       116:        Temp_alias(VAliased& avobject, VStateless_class& alias) : 
1.1       paf       117:                vobject(avobject),
                    118:                saved_alias(avobject.set_alias(&alias)) {
                    119:        }
                    120:        ~Temp_alias() { 
                    121:                vobject.restore_alias(saved_alias); 
                    122:        }
                    123: };
                    124: 
                    125: #endif

E-mail: