|
|
| version 1.3, 2001/02/22 08:16:09 | version 1.22, 2001/03/08 12:19:20 |
|---|---|
| Line 2 | Line 2 |
| $Id$ | $Id$ |
| */ | */ |
| /* | |
| data core | |
| */ | |
| #ifndef PA_WCONTEXT_H | #ifndef PA_WCONTEXT_H |
| #define PA_WCONTEXT_H | #define PA_WCONTEXT_H |
| #include "pa_value.h" | #include "pa_value.h" |
| #include "pa_vstring.h" | |
| #include "pa_vhash.h" | |
| class WContext : public Value { | class WContext : public Value { |
| public: // Value | public: // Value |
| // all: for error reporting after fail(), etc | // all: for error reporting after fail(), etc |
| /*virtual*/ const char *get_type() const { return "WContext"; } | const char *type() const { return "wcontext"; } |
| // wcontext: accumulated string | // WContext: accumulated fstring |
| /*virtual*/ String *get_string() { return &string; }; | String *get_string() { return &fstring; }; |
| // wcontext: transparent | |
| /*virtual*/ Value *get_element(const String& name) const { return check_value()->get_element(name); } | // WContext: none yet | transparent |
| // wcontext: transparent | VClass *get_class() { return fvalue?fvalue->get_class():0; } |
| /*virtual*/ void put_element(const String& name, Value *avalue){ check_value()->put_element(name, avalue); } | |
| // wcontext: transparent | // wcontext: transparent |
| /*virtual*/ Method *get_method(const String& name) const { return check_value()->get_method(name); } | VAliased *get_aliased() { return fvalue?fvalue->get_aliased():0; } |
| // wcontext: none yet | transparent | |
| /*virtual*/ VClass *get_class() const { return fvalue?fvalue->get_class():0; } | public: // WContext |
| // wcontext: none yet | transparent | |
| /*virtual*/ bool is_or_derived_from(VClass& ancestor) { return fvalue?fvalue->is_or_derived_from(ancestor):false; } | // appends a fstring to result |
| virtual void write(String *astring); | |
| // if value is VString writes fstring, | |
| // else writes Value; raises an error if already | |
| virtual void write(Value *avalue); | |
| public: // usage | public: // usage |
| WContext(Pool& apool, Value *avalue) : Value(apool), | WContext(Pool& apool, Value *avalue, bool aconstructing) : Value(apool), |
| fvalue(avalue), | fvalue(avalue), |
| string(apool) { | fconstructing(aconstructing), |
| fstring(*new(apool) String(apool)) { | |
| } | } |
| // appends a string to result | bool constructing() { return fconstructing; } |
| // until Value written, ignores afterwards | |
| void write(String *astring) { | |
| if(!astring) | |
| return; | |
| if(fvalue) // already have value? | // retrives the resulting value |
| return; // don't need any strings anymore | Value *object() const { |
| return fvalue; | |
| string+=*astring; | |
| } | |
| // if value.string!=0 writes string altogether[for showing class names, etc] | |
| // writes Value; raises an error if already | |
| void write(Value *avalue) { | |
| if(!avalue) | |
| return; | |
| String *string=avalue->get_string(); | |
| if(string) | |
| write(string); | |
| else | |
| if(fvalue) // already have value? | |
| pool().exception().raise(0,0, // don't need to construct twice | |
| 0, | |
| "value already assigned"); | |
| else | |
| fvalue=avalue; | |
| } | } |
| //void write(String_iterator& from, String_iterator& to); | |
| // retrives the resulting value | // retrives the resulting value |
| // that can be VString if value==0 or the Value object | // that can be VString if value==0 or the Value object |
| Value *value() const { | Value *result() const { |
| return fvalue?fvalue:0;//TODO: new VString(string); | return fvalue?fvalue:NEW VString(fstring); |
| } | } |
| private: | |
| String string; | |
| Value *fvalue; | |
| protected: | |
| Value *fvalue; | |
| private: | private: |
| // raises an exception on 0 value | bool fconstructing; |
| Value *check_value() const { | String& fstring; |
| if(!fvalue) | |
| pool().exception().raise(0,0, | |
| 0, | |
| "accessing wcontext without value"); | |
| return fvalue; | |
| } | |
| }; | }; |
| #endif | #endif |