00001 #include "GLBaseOrganism.h"
00002 #include "GLBaseOrganismStorage.h"
00003
00007 GLBaseOrganismStorage::GLBaseOrganismStorage()
00008 {
00009 m_free_memory = GLConstants::DO_NOT_FREE;
00010 }
00011
00015 GLBaseOrganismStorage::~GLBaseOrganismStorage()
00016 {
00017 }
00018
00025 void GLBaseOrganismStorage::deleteAllOrganisms(iterator* start)
00026 {
00027
00028 setMemoryLockForAllOrganisms(false, start);
00029
00030 deleteOrganisms(start);
00031 }
00032
00039 void GLBaseOrganismStorage::deleteOrganisms(iterator* start)
00040 {
00041
00042 iterator *it = start;
00043 if (it == NULL)
00044 it = getIterator();
00045
00046 for(; !it->isEnd(); it->moveNext())
00047 {
00048
00049 if (it->getElement() == NULL) continue;
00050
00051 if (it->getElement()->isLockedInMemory()) continue;
00052
00053 delete it->getElement();
00054 it->getElement() = NULL;
00055 }
00056
00057 if (start == NULL) delete it;
00058 }
00059
00073 int GLBaseOrganismStorage::fillFromVector(
00074 const vector<GLBaseOrganism*>& vector,
00075 GLConstants::TStorageFilling fill,
00076 int size)
00077 {
00078
00079 if (fill == GLConstants::REPLACE) emptyStorage();
00080
00081
00082 int to_transfer = size;
00083 if ((size < 0) || (size > (int)vector.size()))
00084 {
00085 to_transfer = vector.size();
00086 }
00087 int counter = 0;
00088
00089 for(int i = 0; i < to_transfer; i++)
00090 {
00091
00092 if (addOrganism(vector[i]) == true)
00093 {
00094 counter++;
00095 }
00096 else
00097 {
00098 delete vector[i];
00099 }
00100 }
00101 return counter;
00102 }
00103
00115 const GLBaseOrganism* GLBaseOrganismStorage::findOrganism(
00116 const GLBaseOrganism* organism,
00117 bool soft) const
00118 {
00119 const_iterator* it = getIteratorConst();
00120
00121 for (; !it->isEnd(); it->moveNext())
00122 {
00123 if (it->getElement()->isEqual(organism, soft))
00124 break;
00125 }
00126
00127 const GLBaseOrganism* found = it->isEnd() ? NULL : it->getElement();
00128 delete it;
00129 return found;
00130 }
00131
00149 int GLBaseOrganismStorage::getOrganismsVector(
00150 vector<const GLBaseOrganism*>& container,
00151 GLConstants::TStorageFilling fill,
00152 int size,
00153 bool copy_clones) const
00154 {
00155
00156 if(fill == GLConstants::REPLACE) container.clear();
00157
00158 int to_transfer = size;
00159 if ((size == -1) || (size >= getSize()))
00160 to_transfer = getSize();
00161 int container_start = container.size();
00162 container.resize(container.size() + to_transfer);
00163
00164
00165 vector<const GLBaseOrganism*>::iterator it_cont =
00166 container.begin() + container_start;
00167 const_iterator* it = getIteratorConst();
00168 for(int i = 0; i < to_transfer; i++)
00169 {
00170 *it_cont = copy_clones ?
00171 it->getElement()->makeClone(false) :
00172 it->getElement();
00173 ++it_cont;
00174 it->moveNext();
00175 }
00176 delete it;
00177 return to_transfer;
00178 }
00179
00197 int GLBaseOrganismStorage::getOrganismsVector(
00198 vector<GLBaseOrganism*>& container,
00199 GLConstants::TStorageFilling fill,
00200 int size,
00201 bool copy_clones)
00202 {
00203
00204 if(fill == GLConstants::REPLACE) container.clear();
00205
00206 int to_transfer = size;
00207 if ((size == -1) || (size >= getSize()))
00208 to_transfer = getSize();
00209 int container_start = container.size();
00210 container.resize(container.size() + to_transfer);
00211
00212
00213 vector<GLBaseOrganism*>::iterator it_cont =
00214 container.begin() + container_start;
00215 iterator* it = getIterator();
00216 for(int i = 0; i < to_transfer; i++)
00217 {
00218 *it_cont = copy_clones ?
00219 it->getElement()->makeClone(false) :
00220 it->getElement();
00221 ++it_cont;
00222 it->moveNext();
00223 }
00224 delete it;
00225 return to_transfer;
00226 }
00227
00228
00237 void GLBaseOrganismStorage::setMemoryLockForAllOrganisms(
00238 bool new_lock,
00239 iterator* start)
00240 {
00241
00242 iterator *it = start;
00243 if (it == NULL)
00244 it = getIterator();
00245
00246 for(; !it->isEnd(); it->moveNext())
00247 {
00248
00249 if (it->getElement() == NULL) continue;
00250
00251 it->getElement()->setMemoryLock(new_lock);
00252 }
00253 if (start == NULL) delete it;
00254 }