Annotation of parser3/src/types/pa_wcontext.h, revision 1.36

1.12      paf         1: /**    @file
                      2:        Parser: write context class decl.
                      3: 
1.26      paf         4:        Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
1.27      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1       paf         6: */
                      7: 
                      8: #ifndef PA_WCONTEXT_H
                      9: #define PA_WCONTEXT_H
1.33      paf        10: 
1.36    ! paf        11: static const char* IDENT_WCONTEXT_H="$Date: 2002/08/07 13:24:31 $";
1.1       paf        12: 
                     13: #include "pa_value.h"
                     14: #include "pa_vstring.h"
                     15: #include "pa_vhash.h"
                     16: 
                     17: class Request;
                     18: 
1.29      paf        19: class StringOrValue {
                     20: public:
                     21:        StringOrValue() : fstring(0), fvalue(0) {}
                     22:        /// anticipating either String or Value [must not be 0&0]
1.30      paf        23:        StringOrValue(const String *astring, Value *avalue) : fstring(astring), fvalue(avalue) {}
                     24:        void set_string(const String& astring) { fstring=&astring; }
1.29      paf        25:        void set_value(Value& avalue) { fvalue=&avalue; }
1.31      paf        26:        const String *get_string() { return fstring; }
                     27:        Value *get_value() { return fvalue; }
1.29      paf        28:        Value& as_value() const {
                     29:                return *(fvalue?fvalue:new(fstring->pool()) VString(*fstring));
                     30:        }
                     31:        const String& as_string() const {
                     32:                return fstring?*fstring:fvalue->as_string();
                     33:        }
                     34: private:
1.30      paf        35:        const String *fstring;
1.29      paf        36:        Value *fvalue;
                     37: };
                     38: 
1.12      paf        39: /** Write context
                     40:        they do different write()s here, later picking up the result
                     41:        @see Request::wcontext
                     42: */
1.1       paf        43: class WContext : public Value {
1.18      paf        44:        friend class Request;
1.19      paf        45: 
1.1       paf        46: public: // Value
                     47: 
                     48:        const char *type() const { return "wcontext"; }
1.12      paf        49:        /// WContext: accumulated fstring
1.1       paf        50:        const String *get_string() { return &fstring; };
                     51: 
1.12      paf        52:        /// WContext: none yet | transparent
1.5       paf        53:        VStateless_class *get_class() { return fvalue?fvalue->get_class():0; }
1.1       paf        54: 
                     55: public: // WContext
                     56: 
1.12      paf        57:        /// appends a fstring to result
1.35      paf        58:        virtual void write(const String& astring, uchar lang) {
                     59:                fstring.append(astring, lang);
                     60:        }
1.32      paf        61:        /// writes Value; raises an error if already, providing origin
1.35      paf        62:        virtual void write(Value& avalue, const String* origin=0);
1.1       paf        63: 
1.12      paf        64:        /**
                     65:                if value is VString writes fstring,
1.32      paf        66:                else writes Value; raises an error if already, providing origin
                     67:        */
1.35      paf        68:        void write(Value& avalue, uchar lang, const String* origin=0) {
1.32      paf        69:                if(const String *fstring=avalue.get_string())
                     70:                        write(*fstring, lang);
                     71:                else
                     72:                        write(avalue, origin);
                     73:        }
1.1       paf        74: 
1.12      paf        75:        /**
                     76:                retrives the resulting value
1.29      paf        77:                that can be String if value==0 or the Value object
1.12      paf        78:                wmethod_frame first checks for $result and if there is one, returns it instead
                     79:        */
1.29      paf        80:        virtual StringOrValue result() {
                     81:                return fvalue?StringOrValue(0, fvalue):StringOrValue(&fstring, 0);
1.7       paf        82:        }
                     83: 
1.1       paf        84: public: // usage
                     85: 
1.16      parser     86:        WContext(Pool& apool, Value *avalue) : Value(apool), 
1.7       paf        87:                fstring(*new(apool) String(apool)),
1.20      paf        88:                fvalue(avalue) {
                     89:                flags.constructing=
                     90:                        flags.entered_class=
                     91:                        flags.entered_object=0;
1.1       paf        92:        }
                     93: 
1.20      paf        94:        void set_constructing(bool aconstructing) { flags.constructing=aconstructing?1:0; }
                     95:        bool get_constructing() { return flags.constructing!=0; }
1.19      paf        96: 
1.28      paf        97:        void set_in_expression(bool ain_expression) { flags.in_expression=ain_expression?1:0; }
                     98:        bool get_in_expression() { return flags.in_expression!=0; }
                     99: 
1.25      paf       100:        void set_somebody_entered_some_class() { flags.entered_class=1; }
1.20      paf       101:        bool get_somebody_entered_some_class() { return flags.entered_class!=0; }
1.19      paf       102: 
                    103:        void set_somebody_entered_some_object(bool aentered_object) {   
1.24      paf       104:                flags.entered_object=aentered_object?1:0; 
                    105:        }
1.20      paf       106:        bool get_somebody_entered_some_object() { return flags.entered_object!=0; }
1.14      paf       107: 
1.1       paf       108: protected:
1.7       paf       109:        String& fstring;
1.19      paf       110:        Value *fvalue;
1.1       paf       111: private:
1.19      paf       112:        struct {
1.20      paf       113:                int constructing:1;
1.28      paf       114:                int in_expression:1;
1.20      paf       115:                int entered_object:1;
                    116:                int entered_class:1;
                    117:        } flags;
1.1       paf       118: };
                    119: 
                    120: #endif

E-mail: