Annotation of parser3/src/types/pa_vobject.C, revision 1.9.4.4

1.1       paf         1: /**    @file
                      2:        Parser: @b object class impl.
                      3: 
                      4:        Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
                      5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
                      6: */
                      7: 
                      8: #include "pa_vobject.h"
1.7       paf         9: #include "pa_vhash.h"
                     10: #include "pa_vtable.h"
1.1       paf        11: 
1.9.4.4 ! paf        12: static const char* IDENT_VOBJECT_C="$Date: 2002/10/31 13:49:57 $";
1.5       paf        13: 
1.6       paf        14: Value *VObject::as(const char *atype, bool looking_up) { 
1.5       paf        15:        if(!looking_up)
1.9.4.1   paf        16:                return get_last_derived().as(atype, true/*the only user*/); // figure out from last_derivate upwards
1.5       paf        17: 
                     18:        // is it me?
1.6       paf        19:        if(Value *result=Value::as(atype, false))
                     20:                return result;
1.5       paf        21: 
                     22:        // is it my base?
                     23:        if(fbase) {
1.6       paf        24:                if(Value *result=fbase->as(atype, true))
                     25:                        return result;
1.5       paf        26:        }
                     27: 
                     28:        // neither
1.6       paf        29:        return 0;
1.5       paf        30: }
1.1       paf        31: 
1.7       paf        32: /// VObject: from possible parent, if any
                     33: bool VObject::is_defined() const {
                     34:        return fbase?fbase->is_defined():Value::is_defined();
                     35: }
                     36: /// VObject: from possible parent, if any
                     37: Value *VObject::as_expr_result(bool) { 
                     38:        return fbase?fbase->as_expr_result():Value::as_expr_result();
                     39: }
                     40: /// VObject: from possible parent, if any
                     41: int VObject::as_int() const {
                     42:        return fbase?fbase->as_int():Value::as_int();
                     43: }
                     44: /// VObject: from possible parent, if any
                     45: double VObject::as_double() {
                     46:        return fbase?fbase->as_double():Value::as_double();
                     47: }
                     48: /// VObject: from possible parent, if any
                     49: bool VObject::as_bool() const { 
                     50:        return fbase?fbase->as_bool():Value::as_bool();
                     51: }
                     52: /// VObject: from possible parent, if any
                     53: VFile *VObject::as_vfile(String::Untaint_lang lang, bool origins_mode) {
                     54:        return fbase?fbase->as_vfile(lang, origins_mode):Value::as_vfile(lang, origins_mode);
                     55: }
                     56: 
                     57: /// VObject: from possible parent, if any
                     58: Hash *VObject::get_hash(const String *source) {
1.9.4.1   paf        59:        if(Value *vhash=get_last_derived().as(VHASH_TYPE, false))
1.7       paf        60:                return vhash->get_hash(source);
                     61: 
                     62:        return 0;
                     63: }
                     64: /// VObject: from possible 'table' parent
                     65: Table *VObject::get_table() {
1.9.4.1   paf        66:        if(Value *vtable=get_last_derived().as(VTABLE_TYPE, false))
1.7       paf        67:                return vtable->get_table();
                     68: 
                     69:        return 0;
                     70: }
1.1       paf        71: 
                     72: /// VObject: (field)=value;(CLASS)=vclass;(method)=method_ref
1.9.4.1   paf        73: Value *VObject::get_element(const String& aname, Value& aself, bool looking_up) {
1.8       paf        74:        // simple things first: $field=ffields.field
                     75:        if(Value *result=static_cast<Value *>(ffields.get(aname)))
                     76:                return result;
                     77: 
1.9.4.3   paf        78:        // gets element from last_derivate upwards
1.5       paf        79:        if(!looking_up) {
1.9.4.3   paf        80:                // $CLASS
                     81:                if(aname==CLASS_NAME)
                     82:                        return get_class();
                     83: 
                     84:                // $virtual_method
1.9.4.4 ! paf        85:                VObject& last_derived=get_last_derived();
1.9.4.3   paf        86:                if(Value *result=last_derived.stateless_object__get_element(aname, last_derived))
1.1       paf        87:                        return result;
                     88:        }
                     89: 
1.9.4.3   paf        90:        // up the tree for other $virtual_field try...
                     91:        if(fbase)
                     92:                if(Value *result=fbase->get_element(aname, *fbase, true))
1.1       paf        93:                        return result;
                     94: 
                     95:        return 0;
1.9.4.3   paf        96: }
                     97: Value *VObject::stateless_object__get_element(const String& aname, Value& aself) {
                     98:        return VStateless_object::get_element(aname, aself, false);
1.1       paf        99: }
                    100: 
                    101: /// VObject: (field)=value
                    102: bool VObject::put_element(const String& aname, Value *avalue, bool replace) {
1.9.4.4 ! paf       103:        //copied from VStateless_class, maybe not needed try {
1.1       paf       104:                if(fbase && fbase->put_element(aname, avalue, true))
                    105:                        return true; // replaced in base
1.9.4.4 ! paf       106:        //} catch(Exception) {  /* allow override parent variables, useful for form descendants */ }
1.2       paf       107: 
1.9.4.4 ! paf       108:        if(replace)
1.2       paf       109:                return ffields.put_replace(aname, avalue);
1.9.4.4 ! paf       110:        else {
        !           111:                ffields.put(aname, avalue);
        !           112:                return false;
        !           113:        }
1.1       paf       114: }
                    115: 

E-mail: