Polaris: BaseRefElement.cc Source File

BaseRefElement.cc

Go 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 
 © 1995-2005 University of Illinois, Urbana-Champaign. All rights reserved.  Fri Mar 25 23:05:40 2005