Ignore:
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
    18/** \file periodentafel.cpp
    29 *
     
    512 */
    613
     14// include config.h
     15#ifdef HAVE_CONFIG_H
     16#include <config.h>
     17#endif
     18
    719#include "Helpers/MemDebug.hpp"
    8 
    9 using namespace std;
    1020
    1121#include <iomanip>
     
    3444  {
    3545    stringstream input(elementsDB,ios_base::in);
    36     bool status = LoadElementsDatabase(&input);
     46    bool status = LoadElementsDatabase(input);
    3747    ASSERT(status,  "General element initialization failed");
    3848  }
     
    7282 * \return iterator to added element
    7383 */
    74 periodentafel::iterator periodentafel::AddElement(element * const pointer)
     84periodentafel::iterator periodentafel::AddElement(element * pointer)
    7585{
    7686  atomicNumber_t Z = pointer->getNumber();
    7787  ASSERT(!elements.count(Z), "Element is already present.");
    78   pointer->sort = &pointer->Z;
    7988  if (pointer->getNumber() < 1 && pointer->getNumber() >= MAX_ELEMENTS)
    8089    DoeLog(0) && (eLog() << Verbose(0) << "Invalid Z number!\n");
     
    8695 * \param *pointer element to be removed
    8796 */
    88 size_t periodentafel::RemoveElement(element * const pointer)
     97size_t periodentafel::RemoveElement(const element * pointer)
    8998{
    9099  return RemoveElement(pointer->getNumber());
     
    114123 * \return pointer to element or NULL if not found
    115124 */
    116 element * const periodentafel::FindElement(atomicNumber_t Z) const
     125const element * periodentafel::FindElement(atomicNumber_t Z) const
    117126{
    118127  const_iterator res = elements.find(Z);
     
    125134 * \return pointer to element
    126135 */
    127 element * const periodentafel::FindElement(const string &shorthand) const
     136const element * periodentafel::FindElement(const string &shorthand) const
    128137{
    129138  element *res = 0;
     
    140149 * \return desired element or NULL
    141150 */
    142 element * const periodentafel::AskElement() const
    143 {
    144   element * walker = NULL;
     151const element * periodentafel::AskElement() const
     152{
     153  const element * walker = NULL;
    145154  int Z;
    146155  do {
     
    155164 * \return pointer to either present or newly created element
    156165 */
    157 element * const periodentafel::EnterElement()
     166const element * periodentafel::EnterElement()
    158167{
    159168  atomicNumber_t Z = 0;
    160169  DoLog(0) && (Log() << Verbose(0) << "Atomic number: " << Z << endl);
    161170  cin >> Z;
    162   element * const res = FindElement(Z);
     171  const element *res = FindElement(Z);
    163172  if (!res) {
    164173    // TODO: make this using the constructor
     
    169178    cin >> tmp->mass;
    170179    DoLog(0) && (Log() << Verbose(0) << "Name [max 64 chars]: " << endl);
    171     cin >> tmp->name;
     180    cin >> tmp->getName();
    172181    DoLog(0) && (Log() << Verbose(0) << "Short form [max 3 chars]: " << endl);
    173     cin >> tmp->symbol;
     182    cin >> tmp->getSymbol();
    174183    AddElement(tmp);
    175184    return tmp;
     
    180189
    181190/******************** Access to iterators ****************************/
    182 periodentafel::const_iterator periodentafel::begin(){
     191periodentafel::const_iterator periodentafel::begin() const{
    183192  return elements.begin();
    184193}
    185194
    186 periodentafel::const_iterator periodentafel::end(){
     195periodentafel::const_iterator periodentafel::end() const{
    187196  return elements.end();
    188197}
    189198
    190 periodentafel::reverse_iterator periodentafel::rbegin(){
     199periodentafel::reverse_iterator periodentafel::rbegin() const{
    191200  return reverse_iterator(elements.end());
    192201}
    193202
    194 periodentafel::reverse_iterator periodentafel::rend(){
     203periodentafel::reverse_iterator periodentafel::rend() const{
    195204  return reverse_iterator(elements.begin());
    196205}
     
    228237  if (!input.fail())
    229238    DoLog(0) && (Log() << Verbose(0) << "Using " << filename << " as elements database." << endl);
    230   status = status && LoadElementsDatabase(&input);
     239  status = status && LoadElementsDatabase(input);
    231240  input.close();
    232241  input.clear();
     
    287296 * \return true - parsing successful, false - something went wrong
    288297 */
    289 bool periodentafel::LoadElementsDatabase(istream *input)
     298bool periodentafel::LoadElementsDatabase(istream &input)
    290299{
    291300  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;
    297309    DoLog(0) && (Log() << Verbose(0) <<  "Parsed elements:");
    298     while (!(*input).eof()) {
     310    while (!input.eof()) {
    299311      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;
    319331      //neues->Output((ofstream *)&cout);
    320332      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);
    334335      } else {
    335336        DoeLog(2) && (eLog() << Verbose(2) << "Detected empty line or invalid element in elements db, discarding." << endl);
     
    337338        delete(neues);
    338339      }
     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      }
    339346    }
    340347    DoLog(0) && (Log() << Verbose(0) << endl);
     
    344351  }
    345352
    346   if (counter == 0)
     353  if (!parsedElements.size())
    347354    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  }
    348377
    349378  return status;
Note: See TracChangeset for help on using the changeset viewer.