| Polaris: BaseRefElement.cc Source File | ||
|
Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
BaseRefElement.ccGo to the documentation of this file.00001 /// 00002 /// 00003 #ifdef POLARIS_GNU_PRAGMAS 00004 #pragma implementation 00005 #endif 00006 /// 00007 #include "BaseRefElement.h" 00008 00009 ostream & 00010 operator << (ostream & o, const BaseRefElement &e) 00011 { 00012 e.print(o); 00013 return o; 00014 } 00015 00016 BaseRefElement::~BaseRefElement() 00017 { 00018 if (_wrap.get()) { 00019 _listable_ref_dec(_wrap.get()); 00020 _wrap.set(0); 00021 } 00022 } 00023 00024 int 00025 BaseRefElement::structures_OK() const 00026 { 00027 return 1; /// ... I'm OK, you're OK 00028 } 00029 00030 Listable * 00031 BaseRefElement::listable_clone() const 00032 { 00033 return (Listable *) new BaseRefElement(*this); 00034 } 00035 00036 void 00037 BaseRefElement::print(ostream & out) const 00038 { 00039 if (_wrap.get()) 00040 _wrap.get()->print(out); 00041 else 00042 out << "<INVALID>"; 00043 } 00044 00045 void 00046 BaseRefElement::modify(Listable &new_ref) 00047 { 00048 p_assert(new_ref.wrapper(), 00049 "BaseRefElement::modify( ): object to be referenced not in" 00050 " a live structure"); 00051 00052 if (&new_ref == _wrap.get()) /// ... This is the same reference as before 00053 return; 00054 00055 if (_wrap.get()) 00056 _wrap.get()->ref_dec(); /// ... changing reference: old obj looses ref 00057 00058 _wrap.set(&new_ref); 00059 00060 _wrap.get()->ref_inc(); /// ... document new ref to object 00061 } 00062 00063 void 00064 BaseRefElement::del() 00065 { 00066 if (_wrap.get()) { 00067 _wrap.get()->ref_dec(); 00068 _wrap.set(0); 00069 } 00070 } 00071 00072 Listable & 00073 BaseRefElement::grab() 00074 { 00075 p_assert(_wrap.get(), "BaseRefElement:grab(): object invalid"); 00076 00077 Listable *el = _wrap.get(); 00078 00079 _wrap.get()->ref_dec(); 00080 _wrap.set(0); 00081 00082 return *el; 00083 } 00084 00085 Listable & 00086 BaseRefElement::modify_and_grab(Listable &el) 00087 { 00088 p_assert(_wrap.get(), "BaseRefElement:modify_and_grab(): object invalid"); 00089 00090 Listable &p = grab(); 00091 00092 modify(el); 00093 00094 return p; 00095 } 00096 |
||
|