00001 00029 #ifndef ABA_POOLSLOTREF_INC 00030 #define ABA_POOLSLOTREF_INC 00031 00032 #include "abacus/poolslotref.h" 00033 #include "abacus/master.h" 00034 #include "abacus/constraint.h" 00035 #include "abacus/variable.h" 00036 #include "abacus/poolslot.h" 00037 00038 template<class BaseType, class CoType> 00039 inline ABA_POOLSLOTREF<BaseType, CoType>::ABA_POOLSLOTREF(ABA_MASTER *master) 00040 : 00041 master_(master), 00042 slot_(0), 00043 version_(0) 00044 { } 00045 00046 template<class BaseType, class CoType> 00047 ABA_POOLSLOTREF<BaseType, CoType>::ABA_POOLSLOTREF( 00048 ABA_POOLSLOT<BaseType, CoType> *slot) 00049 : 00050 master_(slot->master()), 00051 slot_(slot), 00052 version_(slot->version()) 00053 { 00054 ABA_CONVAR *cv = slot_->conVar(); 00055 00056 if(cv) cv->addReference(); 00057 } 00058 00059 template<class BaseType, class CoType> 00060 ABA_POOLSLOTREF<BaseType, CoType>::ABA_POOLSLOTREF(const ABA_POOLSLOTREF &rhs) 00061 : 00062 master_(rhs.master_), 00063 slot_(rhs.slot_), 00064 version_(rhs.version_) 00065 { 00066 ABA_CONVAR *cv = slot_->conVar(); 00067 00068 if (version_ == slot_->version() && cv) 00069 cv->addReference(); 00070 } 00071 00072 template<class BaseType, class CoType> 00073 ABA_POOLSLOTREF<BaseType, CoType>::~ABA_POOLSLOTREF() 00074 { 00075 if(slot_) { 00076 ABA_CONVAR *cv = slot_->conVar(); 00077 if (cv && version_ == slot_->version()) 00078 cv->removeReference(); 00079 } 00080 } 00081 00082 template <class BaseType, class CoType> 00083 ostream &operator<<(ostream &out, const ABA_POOLSLOTREF<BaseType, CoType> &rhs) 00084 { 00085 if (rhs.conVar()) rhs.conVar()->print(out); 00086 return out; 00087 } 00088 00089 template<class BaseType, class CoType> 00090 inline BaseType* ABA_POOLSLOTREF<BaseType, CoType>::conVar() const 00091 { 00092 if(version_ == slot_->version()) return slot_->conVar(); 00093 printDifferentVersionError(); 00094 00095 return 0; 00096 } 00097 00098 template<class BaseType, class CoType> 00099 void ABA_POOLSLOTREF<BaseType, CoType>::printDifferentVersionError() const 00100 { 00101 ABA_POOLSLOTREF<BaseType, CoType>::master_->out() << "ABA_POOLSLOTREF::con: Version of reference to slot " << version_; 00102 ABA_POOLSLOTREF<BaseType, CoType>::master_->out() << " and version of slot " << slot_->version() << " differ." << endl; 00103 } 00104 00105 template<class BaseType, class CoType> 00106 inline unsigned long ABA_POOLSLOTREF<BaseType, CoType>::version() const 00107 { 00108 return version_; 00109 } 00110 00111 template<class BaseType, class CoType> 00112 inline ABA_POOLSLOT<BaseType, CoType>* ABA_POOLSLOTREF<BaseType, CoType>::slot() const 00113 { 00114 return slot_; 00115 } 00116 00117 template<class BaseType, class CoType> 00118 void ABA_POOLSLOTREF<BaseType, CoType>::slot(ABA_POOLSLOT<BaseType, CoType> *s) 00119 { 00120 ABA_CONVAR *cv; 00121 00122 if(slot_) { 00123 cv = slot_->conVar(); 00124 if (cv && version_ == slot_->version()) 00125 cv->removeReference(); 00126 } 00127 00128 slot_ = s; 00129 version_ = s->version(); 00130 cv = slot_->conVar(); 00131 if(cv) cv->addReference(); 00132 } 00133 00134 #endif // ABA_POOLSLOTREF_INC