Annotation of parser3/src/types/pa_vobject.C, revision 1.3
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"
9:
1.3 ! paf 10: static const char* IDENT_VOBJECT_C="$Date: 2002/08/13 15:35:45 $";
1.1 paf 11:
12: /// VObject: true, todo: z base table can be 33
13: Value *VObject::as_expr_result(bool) { return NEW VBool(pool(), as_bool()); }
14: /// VObject: true, todo: z base table can be false
15: bool VObject::as_bool() const { return true; }
16:
17: /// VObject: (field)=value;(CLASS)=vclass;(method)=method_ref
1.3 ! paf 18: Value *VObject::get_element(const String& aname, Value * /*aself*/, bool looking_down) {
1.1 paf 19: // gets element from last_derivate upwards
1.3 ! paf 20: if(!looking_down) {
1.1 paf 21: // $CLASS
22: if(aname==CLASS_NAME)
23: return get_class();
24:
25: // for first call, pass call to last derived VObject
1.3 ! paf 26: return get_last_derived()->get_element(aname,
! 27: 0, true/*the only user*/);
1.1 paf 28: }
29:
30: // $method, $CLASS_field
31: {
32: Temp_base temp_base(*get_class(), 0);
1.3 ! paf 33: if(Value *result=VStateless_object::get_element(aname, this, true))
1.1 paf 34: return result;
35: }
36:
37: // $field=ffields.field
38: if(Value *result=static_cast<Value *>(ffields.get(aname)))
39: return result;
40:
41: // up the tree...
42: if(fbase)
1.3 ! paf 43: if(Value *result=fbase->get_element(aname, fbase, true))
1.1 paf 44: return result;
45:
46: return 0;
47: }
48:
49: /// VObject: (field)=value
50: bool VObject::put_element(const String& aname, Value *avalue, bool replace) {
51: // replaces element to last_derivate upwards or stores it in self
52: // speed1:
53: // will not check for '$CLASS(subst)' trick
54: // will hope that user ain't THAT self-hating person
55: // speed2:
56: // will not check for '$method_name(subst)' trick
57: // -same-
58:
1.2 paf 59: if(!replace) {
60: // for first call, pass call to last derived VObject
61: if(get_last_derived()->put_element(aname, avalue, true))
62: return true;
1.1 paf 63:
1.2 paf 64: ffields.put(aname, avalue);
65: return false;
66: }
1.1 paf 67:
1.2 paf 68: // replace
1.1 paf 69: // upwards: copied from VClass::put_element...
70:
71: try {
72: if(fbase && fbase->put_element(aname, avalue, true))
73: return true; // replaced in base
1.2 paf 74:
75: return ffields.put_replace(aname, avalue);
1.1 paf 76: } catch(Exception) {
77: /* ignore "can not store to table&co errors for nonexistent elements */
78: bool error;
79: try {
1.3 ! paf 80: error=get_element(aname, this, false)!=0;
1.1 paf 81: } catch(Exception) {
82: error=false;
83: }
84: if(error)
85: /*re*/throw;
86: }
87:
1.2 paf 88: // could not put to any base of last child
89: return false;
1.1 paf 90: }
91:
E-mail: