poolslot.inc

Go to the documentation of this file.
00001 
00029 #ifndef ABA_POOLSLOT_INC
00030 #define ABA_POOLSLOT_INC
00031 
00032 #include "abacus/poolslot.h"
00033 #include "abacus/pool.h"
00034 #include "abacus/master.h"
00035 #include "abacus/constraint.h"
00036 #include "abacus/variable.h"
00037 
00038 #ifdef ABACUS_PARALLEL
00039 #include "abacus/id.h"
00040 #include "abacus/idmap.h"
00041 #endif
00042 
00043   template<class BaseType, class CoType> 
00044   inline ABA_POOLSLOT<BaseType, CoType>::ABA_POOLSLOT(ABA_MASTER *master, 
00045                                                ABA_POOL<BaseType, CoType> *pool, 
00046                                                BaseType *conVar) 
00047   :  
00048     master_(master),  
00049     conVar_(conVar),  
00050     pool_(pool)
00051   {
00052     if (conVar) version_ = 1;
00053     else        version_ = 0;
00054   }
00055 
00056   template<class BaseType, class CoType>
00057   ABA_POOLSLOT<BaseType, CoType>::~ABA_POOLSLOT()
00058   {
00059     if (conVar_ && conVar_->nReferences()) {
00060       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "~ABA_POOLSLOT(): it is not allowed to destruct objects of ";
00061       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "class ABA_POOLSLOT with a constraint/variable with ";
00062       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "positive reference counter = " << conVar_->nReferences() << "." << endl;
00063       exit(Fatal);
00064     }
00065 
00066     delete conVar_;
00067   }
00068 
00069 #include <limits.h>
00070 
00071   template<class BaseType, class CoType>
00072   void ABA_POOLSLOT<BaseType, CoType>::insert(BaseType *conVar)
00073   {
00074     if (conVar_ != 0) {
00075       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "ABA_POOLSLOT::insert(): insertion failed, the slot is not void" << endl;
00076       exit (Fatal);
00077     }
00078 
00079     if (version_ == ULONG_MAX) {
00080       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "ABA_POOLSLOT::insert(): insertion failed, ";
00081       ABA_POOLSLOT<BaseType, CoType>::master_->err() << "maximum version number ULONG_MAX = " << ULONG_MAX;
00082       ABA_POOLSLOT<BaseType, CoType>::master_->err() << " reached";
00083       exit (Fatal);
00084     }
00085 
00086 #ifdef ABACUS_PARALLEL
00087     if (conVar->identification_.isInitialized()) {
00088       master_->err() << "ABA_POOLSLOT::insert(): the constraint/variable"
00089                         " must not have an initialized ABA_ID!" << endl;
00090       exit (Fatal);
00091     }
00092 #endif
00093     conVar_ = conVar;
00094     ++version_;
00095   }
00096 
00097   template<class BaseType, class CoType>
00098   int ABA_POOLSLOT<BaseType, CoType>::softDelete()
00099   {
00100     if (conVar_ == 0)                  return 0;
00101     if (conVar_->deletable() == false) return 1;
00102     hardDelete();
00103     return 0;
00104   }
00105 
00106   template<class BaseType, class CoType>
00107   inline void ABA_POOLSLOT<BaseType, CoType>::hardDelete()
00108   {
00109 #ifdef ABACUS_PARALLEL
00110     if (conVar_ && conVar_->identification_.isInitialized()) {
00111       pool_->identificationMap()->remove(conVar_->identification_);
00112     }
00113 #endif
00114     delete conVar_;
00115     conVar_ = 0;
00116   }
00117 
00118   template<class BaseType, class CoType>
00119   inline void ABA_POOLSLOT<BaseType, CoType>::removeConVarFromPool()
00120   {
00121     pool_->removeConVar(this);
00122   }
00123 
00124   template<class BaseType, class CoType>
00125   inline BaseType * ABA_POOLSLOT<BaseType, CoType>::conVar() const
00126   {
00127     return conVar_;
00128   }
00129 
00130   template<class BaseType, class CoType>
00131   inline unsigned long ABA_POOLSLOT<BaseType, CoType>::version() const
00132   {
00133     return version_;
00134   }
00135 
00136   template<class BaseType, class CoType>
00137   inline ABA_MASTER * ABA_POOLSLOT<BaseType, CoType>::master()
00138   {
00139     return master_;
00140   }
00141 
00142 
00143 #ifdef ABACUS_PARALLEL
00144 
00145   template<class BaseType, class CoType>
00146   const ABA_ID &ABA_POOLSLOT<BaseType, CoType>::getIdentification(void) const
00147   {
00148     if (conVar_ == 0) {
00149       master_->err() << "ABA_POOLSLOT::getIdentification() : no "
00150                         "constraint/variable available in this slot!" << endl;
00151       exit(Fatal);
00152     }
00153     return conVar_->identification_;
00154   }
00155 
00156   template<class BaseType, class CoType>
00157   void ABA_POOLSLOT<BaseType, CoType>::setIdentification(const ABA_ID &id)
00158   {
00159     if (conVar_) {
00160       conVar_->identification_ = id;
00161       pool_->identificationMap()->insert(id, this);
00162     }
00163     else {
00164       master_->err() << "ABA_POOLSLOT::setIdentification() : no "
00165                         "constraint/variable available in this slot!" << endl;
00166       exit(Fatal);
00167     }
00168   }
00169 
00170   template<class BaseType, class CoType>
00171   void ABA_POOLSLOT<BaseType, CoType>::setNewIdentification()
00172   {
00173     if (conVar_)
00174       pool_->identificationMap()->insertWithNewId(conVar_->identification_, this);
00175     else {
00176       master_->err() << "ABA_POOLSLOT::setNewIdentification() : no "
00177                         "constraint/variable available in this slot!" << endl;
00178       exit(Fatal);
00179     }
00180   }
00181 
00182 #endif
00183 
00184 #endif   // ABA_POOLSLOT_INC

Generated on Tue Aug 14 18:09:54 2007 for ABACUS by  doxygen 1.5.1