Changes in src/periodentafel.cpp [952f38:9f99b3]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/periodentafel.cpp
r952f38 r9f99b3 1 /* 2 * Project: MoleCuilder 3 * Description: creates and alters molecular systems 4 * Copyright (C) 2010 University of Bonn. All rights reserved. 5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. 6 */ 7 1 8 /** \file periodentafel.cpp 2 9 * … … 5 12 */ 6 13 14 // include config.h 15 #ifdef HAVE_CONFIG_H 16 #include <config.h> 17 #endif 18 7 19 #include "Helpers/MemDebug.hpp" 8 9 using namespace std;10 20 11 21 #include <iomanip> … … 34 44 { 35 45 stringstream input(elementsDB,ios_base::in); 36 bool status = LoadElementsDatabase( &input);46 bool status = LoadElementsDatabase(input); 37 47 ASSERT(status, "General element initialization failed"); 38 48 } … … 72 82 * \return iterator to added element 73 83 */ 74 periodentafel::iterator periodentafel::AddElement(element * constpointer)84 periodentafel::iterator periodentafel::AddElement(element * pointer) 75 85 { 76 86 atomicNumber_t Z = pointer->getNumber(); 77 87 ASSERT(!elements.count(Z), "Element is already present."); 78 pointer->sort = &pointer->Z;79 88 if (pointer->getNumber() < 1 && pointer->getNumber() >= MAX_ELEMENTS) 80 89 DoeLog(0) && (eLog() << Verbose(0) << "Invalid Z number!\n"); … … 86 95 * \param *pointer element to be removed 87 96 */ 88 size_t periodentafel::RemoveElement( element * constpointer)97 size_t periodentafel::RemoveElement(const element * pointer) 89 98 { 90 99 return RemoveElement(pointer->getNumber()); … … 114 123 * \return pointer to element or NULL if not found 115 124 */ 116 element * constperiodentafel::FindElement(atomicNumber_t Z) const125 const element * periodentafel::FindElement(atomicNumber_t Z) const 117 126 { 118 127 const_iterator res = elements.find(Z); … … 125 134 * \return pointer to element 126 135 */ 127 element * constperiodentafel::FindElement(const string &shorthand) const136 const element * periodentafel::FindElement(const string &shorthand) const 128 137 { 129 138 element *res = 0; … … 140 149 * \return desired element or NULL 141 150 */ 142 element * constperiodentafel::AskElement() const143 { 144 element * walker = NULL;151 const element * periodentafel::AskElement() const 152 { 153 const element * walker = NULL; 145 154 int Z; 146 155 do { … … 155 164 * \return pointer to either present or newly created element 156 165 */ 157 element * constperiodentafel::EnterElement()166 const element * periodentafel::EnterElement() 158 167 { 159 168 atomicNumber_t Z = 0; 160 169 DoLog(0) && (Log() << Verbose(0) << "Atomic number: " << Z << endl); 161 170 cin >> Z; 162 element * constres = FindElement(Z);171 const element *res = FindElement(Z); 163 172 if (!res) { 164 173 // TODO: make this using the constructor … … 169 178 cin >> tmp->mass; 170 179 DoLog(0) && (Log() << Verbose(0) << "Name [max 64 chars]: " << endl); 171 cin >> tmp-> name;180 cin >> tmp->getName(); 172 181 DoLog(0) && (Log() << Verbose(0) << "Short form [max 3 chars]: " << endl); 173 cin >> tmp-> symbol;182 cin >> tmp->getSymbol(); 174 183 AddElement(tmp); 175 184 return tmp; … … 180 189 181 190 /******************** Access to iterators ****************************/ 182 periodentafel::const_iterator periodentafel::begin() {191 periodentafel::const_iterator periodentafel::begin() const{ 183 192 return elements.begin(); 184 193 } 185 194 186 periodentafel::const_iterator periodentafel::end() {195 periodentafel::const_iterator periodentafel::end() const{ 187 196 return elements.end(); 188 197 } 189 198 190 periodentafel::reverse_iterator periodentafel::rbegin() {199 periodentafel::reverse_iterator periodentafel::rbegin() const{ 191 200 return reverse_iterator(elements.end()); 192 201 } 193 202 194 periodentafel::reverse_iterator periodentafel::rend() {203 periodentafel::reverse_iterator periodentafel::rend() const{ 195 204 return reverse_iterator(elements.begin()); 196 205 } … … 228 237 if (!input.fail()) 229 238 DoLog(0) && (Log() << Verbose(0) << "Using " << filename << " as elements database." << endl); 230 status = status && LoadElementsDatabase( &input);239 status = status && LoadElementsDatabase(input); 231 240 input.close(); 232 241 input.clear(); … … 287 296 * \return true - parsing successful, false - something went wrong 288 297 */ 289 bool periodentafel::LoadElementsDatabase(istream *input)298 bool periodentafel::LoadElementsDatabase(istream &input) 290 299 { 291 300 bool status = true; 292 int counter = 0; 293 pair< std::map<atomicNumber_t,element*>::iterator, bool > InserterTest; 294 if (!(*input).fail()) { 295 (*input).getline(header1, MAXSTRINGSIZE); 296 (*input).getline(header2, MAXSTRINGSIZE); // skip first two header lines 301 string header1tmp,header2tmp; 302 // first parse into a map, so we can revert to old status in case something goes wront 303 map<atomicNumber_t,element*> parsedElements; 304 if (!input.fail()) { 305 getline(input,header1tmp); 306 getline(input,header2tmp); // skip first two header lines 307 //cout << "First header: " << header1tmp << endl; 308 //cout << "Second header: " << header2tmp << endl; 297 309 DoLog(0) && (Log() << Verbose(0) << "Parsed elements:"); 298 while (! (*input).eof()) {310 while (!input.eof()) { 299 311 element *neues = new element; 300 (*input)>> neues->name;301 //(*input) >> ws; 302 (*input)>> neues->symbol;303 //(*input) >> ws; 304 (*input)>> neues->period;305 //(*input) >> ws; 306 (*input)>> neues->group;307 //(*input) >> ws; 308 (*input)>> neues->block;309 //(*input) >> ws; 310 (*input)>> neues->Z;311 //(*input) >> ws; 312 (*input)>> neues->mass;313 //(*input) >> ws; 314 (*input)>> neues->CovalentRadius;315 //(*input) >> ws; 316 (*input)>> neues->VanDerWaalsRadius;317 //(*input) >> ws; 318 (*input)>> ws;312 input >> neues->name; 313 //(*input) >> ws; 314 input >> neues->symbol; 315 //(*input) >> ws; 316 input >> neues->period; 317 //(*input) >> ws; 318 input >> neues->group; 319 //(*input) >> ws; 320 input >> neues->block; 321 //(*input) >> ws; 322 input >> neues->Z; 323 //(*input) >> ws; 324 input >> neues->mass; 325 //(*input) >> ws; 326 input >> neues->CovalentRadius; 327 //(*input) >> ws; 328 input >> neues->VanDerWaalsRadius; 329 //(*input) >> ws; 330 input >> ws; 319 331 //neues->Output((ofstream *)&cout); 320 332 if ((neues->getNumber() > 0) && (neues->getNumber() < MAX_ELEMENTS)) { 321 if (elements.count(neues->getNumber())) {// if element already present, remove and delete old one (i.e. replace it) 322 //cout << neues->symbol << " is present already." << endl; 323 element * const Elemental = FindElement(neues->getNumber()); 324 ASSERT(Elemental != NULL, "element should be present but is not??"); 325 *Elemental = *neues; 326 delete(neues); 327 neues = Elemental; 328 } else { 329 InserterTest = elements.insert(pair <atomicNumber_t,element*> (neues->getNumber(), neues)); 330 ASSERT(InserterTest.second, "Could not insert new element into periodentafel on LoadElementsDatabase()."); 331 } 332 DoLog(0) && (Log() << Verbose(0) << " " << elements[neues->getNumber()]->symbol); 333 counter++; 333 parsedElements[neues->Z] = neues; 334 DoLog(0) && (Log() << Verbose(0) << " " << *neues); 334 335 } else { 335 336 DoeLog(2) && (eLog() << Verbose(2) << "Detected empty line or invalid element in elements db, discarding." << endl); … … 337 338 delete(neues); 338 339 } 340 // when the input is in failed state, we most likely just read garbage 341 if(input.fail()) { 342 DoeLog(2) && (eLog() << Verbose(2) << "Error parsing elements db." << endl); 343 status = false; 344 break; 345 } 339 346 } 340 347 DoLog(0) && (Log() << Verbose(0) << endl); … … 344 351 } 345 352 346 if ( counter == 0)353 if (!parsedElements.size()) 347 354 status = false; 355 356 if(status){ 357 for(map<atomicNumber_t,element*>::iterator iter=parsedElements.begin(); 358 iter!=parsedElements.end(); 359 ++iter){ 360 if (elements.count(iter->first)) { 361 // if element already present, replace the old one 362 // pointer to old element might still be in use, so we have to replace into the old element 363 *(elements[iter->first])=*iter->second; 364 delete(iter->second); 365 } 366 else { 367 // no such element in periodentafel... we can just insert 368 elements[iter->first] = iter->second; 369 } 370 } 371 // all went well.. we now copy the header 372 strncpy(header1,header1tmp.c_str(),MAXSTRINGSIZE); 373 header1[MAXSTRINGSIZE-1]=0; 374 strncpy(header2,header2tmp.c_str(),MAXSTRINGSIZE); 375 header2[MAXSTRINGSIZE-1]=0; 376 } 348 377 349 378 return status;
Note:
See TracChangeset
for help on using the changeset viewer.