--- parser3/src/include/Attic/pa_wcontext.h 2001/02/22 08:25:51 1.4 +++ parser3/src/include/Attic/pa_wcontext.h 2001/02/23 14:18:26 1.12 @@ -1,82 +1,43 @@ /* - $Id: pa_wcontext.h,v 1.4 2001/02/22 08:25:51 paf Exp $ -*/ - -/* - data core + $Id: pa_wcontext.h,v 1.12 2001/02/23 14:18:26 paf Exp $ */ #ifndef PA_WCONTEXT_H #define PA_WCONTEXT_H -#include "pa_value.h" +#include "pa_wvalue.h" -class WContext : public Value { +class WContext : public WValue { public: // Value // all: for error reporting after fail(), etc - /*virtual*/ const char *get_type() const { return "WContext"; } - // wcontext: accumulated string - /*virtual*/ String *get_string() { return &string; }; + const char *type() const { return "WContext"; } // wcontext: transparent - /*virtual*/ Value *get_element(const String& name) const { return check_value()->get_element(name); } + Value *get_element(const String& name) { return check_value()->get_element(name); } // wcontext: transparent - /*virtual*/ void put_element(const String& name, Value *avalue){ check_value()->put_element(name, avalue); } + void put_element(const String& name, Value *avalue){ + if(!fvalue) + fvalue=NEW VHash(pool()); + fvalue->put_element(name, avalue); + } + // wcontext: transparent - /*virtual*/ Method *get_method(const String& name) const { return check_value()->get_method(name); } + Method *get_method(const String& name) const { return check_value()->get_method(name); } // wcontext: none yet | transparent - /*virtual*/ VClass *get_class() const { return fvalue?fvalue->get_class():0; } + VClass *get_class() const { return fvalue?fvalue->get_class():0; } // wcontext: none yet | transparent - /*virtual*/ bool is_or_derived_from(VClass& ancestor) { return fvalue?fvalue->is_or_derived_from(ancestor):false; } + bool is_or_derived_from(VClass& ancestor) { return fvalue?fvalue->is_or_derived_from(ancestor):false; } public: // usage - WContext(Pool& apool, Value *avalue) : Value(apool), - fvalue(avalue), - string(apool) { - } - - // appends a string to result - void write(String *astring) { - if(!astring) - return; - - 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; - - if(fvalue) // already have value? - pool().exception().raise(0,0, // don't need to construct twice - 0, - "value already assigned"); - else - fvalue=avalue; - - String *string=avalue->get_string(); - if(string) - write(string); - } - //void write(String_iterator& from, String_iterator& to); - - // retrives the resulting value - // that can be VString if value==0 or the Value object - Value *value() const { - return fvalue?fvalue:0;//TODO: new VString(string); + WContext(Pool& apool, Value *avalue) : WValue(apool, avalue) { } private: - String string; - Value *fvalue; - -private: // raises an exception on 0 value Value *check_value() const { if(!fvalue) - pool().exception().raise(0,0, + THROW(0,0, 0, "accessing wcontext without value");