Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/periodentafel.cpp

    r745a85 r49e1ae  
    1010#include <fstream>
    1111#include <cstring>
    12 #include <cassert>
    1312
    1413#include "element.hpp"
     
    1918#include "verbose.hpp"
    2019
    21 using namespace std;
    22 
    2320/************************************* Functions for class periodentafel ***************************/
    2421
     
    2623 * Initialises start and end of list and resets periodentafel::checkliste to false.
    2724 */
    28 periodentafel::periodentafel()
    29 {};
     25periodentafel::periodentafel() : start(new element), end(new element)
     26{
     27  start->previous = NULL;
     28  start->next = end;
     29  end->previous = start;
     30  end->next = NULL;
     31};
    3032
    3133/** destructor for class periodentafel
     
    3537{
    3638  CleanupPeriodtable();
     39  delete(end);
     40  delete(start);
    3741};
    3842
     
    4145 * \return true - succeeded, false - does not occur
    4246 */
    43 periodentafel::iterator periodentafel::AddElement(element * const pointer)
    44 {
    45   atomicNumber_t Z = pointer->getNumber();
    46   assert(!elements.count(Z));
     47bool periodentafel::AddElement(element * const pointer)
     48{
    4749  pointer->sort = &pointer->Z;
    48   if (pointer->getNumber() < 1 && pointer->getNumber() >= MAX_ELEMENTS)
     50  if (pointer->Z < 1 && pointer->Z >= MAX_ELEMENTS)
    4951    Log() << Verbose(0) << "Invalid Z number!\n";
    50   pair<iterator,bool> res = elements.insert(pair<atomicNumber_t,element*>(Z,pointer));
    51   return res.first;
     52  return add(pointer, end);
    5253};
    5354
     
    5657 * \return true - succeeded, false - element not found
    5758 */
    58 void periodentafel::RemoveElement(element * const pointer)
    59 {
    60   atomicNumber_t Z = pointer->getNumber();
    61   elements.erase(Z);
     59bool periodentafel::RemoveElement(element * const pointer)
     60{
     61  return remove(pointer, start, end);
    6262};
    6363
     
    6565 * \return true - succeeded, false - does not occur
    6666 */
    67 void periodentafel::CleanupPeriodtable()
    68 {
    69   for(iterator iter=elements.begin();iter!=elements.end();++iter){
    70     delete(*iter).second;
    71   }
    72   elements.clear();
     67bool periodentafel::CleanupPeriodtable()
     68{
     69  return cleanup(start,end);
    7370};
    7471
     
    7875 * \return pointer to element or NULL if not found
    7976 */
    80 const element * periodentafel::FindElement(atomicNumber_t Z) const
    81 {
    82   const_iterator res = elements.find(Z);
    83   return res!=elements.end()?((*res).second):0;
     77element * const periodentafel::FindElement(const int Z) const
     78{
     79  element *walker = find(&Z, start,end);
     80  return(walker);
    8481};
    8582
     
    8986 * \return pointer to element
    9087 */
    91 const element * periodentafel::FindElement(const char * const shorthand) const
    92 {
    93   element *res = 0;
    94   for(const_iterator iter=elements.begin();iter!=elements.end();++iter) {
    95     if((*iter).second->getSymbol() == shorthand){
    96       res = (*iter).second;
    97       break;
    98     }
     88element * const periodentafel::FindElement(const char * const shorthand) const
     89{
     90  element *walker =  periodentafel::start;
     91  while (walker->next != periodentafel::end) {
     92    walker = walker->next;
     93    if (strncmp(walker->symbol, shorthand, 3) == 0)
     94      return(walker);
    9995  }
    100   return res;
     96  return (NULL);
    10197};
    10298
    10399/** Asks for element number and returns pointer to element
    104100 */
    105 const element * periodentafel::AskElement() const
    106 {
    107   const element *walker = NULL;
     101element * const periodentafel::AskElement() const
     102{
     103  element *walker = NULL;
    108104  int Z;
    109105  do {
     
    118114 * \return pointer to either present or newly created element
    119115 */
    120 const element * periodentafel::EnterElement()
    121 {
    122   const element *res = NULL;
    123   atomicNumber_t Z = 0;
     116element * const periodentafel::EnterElement()
     117{
     118  element *walker = NULL;
     119  int Z = -1;
    124120  Log() << Verbose(0) << "Atomic number: " << Z << endl;
    125121  cin >> Z;
    126   res = FindElement(Z);
    127   if (!res) {
    128     // TODO: make this using the constructor
    129     element *tmp;
     122  walker = FindElement(Z);
     123  if (walker == NULL) {
    130124    Log() << Verbose(0) << "Element not found in database, please enter." << endl;
    131     tmp = new element;
    132     tmp->Z = Z;
     125    walker = new element;
     126    walker->Z = Z;
    133127    Log() << Verbose(0) << "Mass: " << endl;
    134     cin >> tmp->mass;
     128    cin >> walker->mass;
    135129    Log() << Verbose(0) << "Name [max 64 chars]: " << endl;
    136     cin >> tmp->name;
     130    cin >> walker->name;
    137131    Log() << Verbose(0) << "Short form [max 3 chars]: " << endl;
    138     cin >> tmp->symbol;
    139     AddElement(tmp);
    140     res = tmp;
     132    cin >> walker->symbol;
     133    periodentafel::AddElement(walker);
    141134  }
    142   return res;
    143 };
    144 
    145 
    146 /******************** Access to iterators ****************************/
    147 periodentafel::const_iterator periodentafel::begin(){
    148   return elements.begin();
    149 }
    150 
    151 periodentafel::const_iterator periodentafel::end(){
    152   return elements.end();
    153 }
    154 
    155 periodentafel::reverse_iterator periodentafel::rbegin(){
    156   return reverse_iterator(elements.end());
    157 }
    158 
    159 periodentafel::reverse_iterator periodentafel::rend(){
    160   return reverse_iterator(elements.begin());
    161 }
     135  return(walker);
     136};
    162137
    163138/** Prints period table to given stream.
    164139 * \param output stream
    165140 */
    166 bool periodentafel::Output(ostream * const output) const
     141bool periodentafel::Output(ofstream * const output) const
    167142{
    168143  bool result = true;
     144  element *walker = start;
    169145  if (output != NULL) {
    170     for(const_iterator iter=elements.begin(); iter !=elements.end();++iter){
    171       result = result && (*iter).second->Output(output);
     146    while (walker->next != end) {
     147      walker = walker->next;
     148      result = result && walker->Output(output);
    172149    }
    173150    return result;
     
    180157 * \param *checkliste elements table for this molecule
    181158 */
    182 bool periodentafel::Checkout(ostream * const output, const int * const checkliste) const
    183 {
     159bool periodentafel::Checkout(ofstream * const output, const int * const checkliste) const
     160{
     161  element *walker = start;
    184162  bool result = true;
    185163  int No = 1;
     
    188166    *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;
    189167    *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
    190     for(const_iterator iter=elements.begin(); iter!=elements.end();++iter){
    191       if (((*iter).first < MAX_ELEMENTS) && (checkliste[(*iter).first])) {
    192         (*iter).second->No = No;
    193         result = result && (*iter).second->Checkout(output, No++, checkliste[(*iter).first]);
     168    while (walker->next != end) {
     169      walker = walker->next;
     170      if ((walker != NULL) && (walker->Z > 0) && (walker->Z < MAX_ELEMENTS) && (checkliste[walker->Z])) {
     171        walker->No = No;
     172        result = result && walker->Checkout(output, No++, checkliste[walker->Z]);
    194173      }
    195174    }
     
    205184{
    206185  ifstream infile;
     186  double tmp;
    207187  element *ptr;
    208   map<atomicNumber_t,element*> parsedElems;
    209188  bool status = true;
    210189  bool otherstatus = true;
     
    244223      //neues->Output((ofstream *)&cout);
    245224      if ((neues->Z > 0) && (neues->Z < MAX_ELEMENTS))
    246         parsedElems[neues->getNumber()] = neues;
     225        periodentafel::AddElement(neues);
    247226      else {
    248227        Log() << Verbose(0) << "Could not parse element: ";
     
    264243  if (infile != NULL) {
    265244    while (!infile.eof()) {
    266       atomicNumber_t Z;
    267       infile >> Z;
    268       infile >> ws;
    269       infile >> parsedElems[Z]->Valence;
     245      infile >> tmp;
     246      infile >> ws;
     247      infile >> FindElement((int)tmp)->Valence;
    270248      infile >> ws;
    271249      //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->Valence << " valence electrons." << endl;
     
    283261  if (infile != NULL) {
    284262    while (!infile.eof()) {
    285       atomicNumber_t Z;
    286       infile >> Z;
    287       infile >> ws;
    288       infile >> parsedElems[Z]->NoValenceOrbitals;
     263      infile >> tmp;
     264      infile >> ws;
     265      infile >> FindElement((int)tmp)->NoValenceOrbitals;
    289266      infile >> ws;
    290267      //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->NoValenceOrbitals << " number of singly occupied valence orbitals." << endl;
     
    302279  if (infile != NULL) {
    303280    while (!infile.eof()) {
    304       atomicNumber_t Z;
    305       infile >> Z;
    306       ptr = parsedElems[Z];
     281      infile >> tmp;
     282      ptr = FindElement((int)tmp);
    307283      infile >> ws;
    308284      infile >> ptr->HBondDistance[0];
     
    324300  if (infile != NULL) {
    325301    while (!infile.eof()) {
    326       atomicNumber_t Z;
    327       infile >> Z;
    328       ptr = parsedElems[Z];
     302      infile >> tmp;
     303      ptr = FindElement((int)tmp);
    329304      infile >> ws;
    330305      infile >> ptr->HBondAngle[0];
     
    338313    otherstatus = false;
    339314
    340   if (otherstatus){
    341     map<atomicNumber_t,element*>::iterator iter;
    342     for(iter=parsedElems.begin();iter!=parsedElems.end();++iter){
    343       AddElement((*iter).second);
    344     }
    345   }
    346   else{
     315  if (!otherstatus)
    347316    eLog() << Verbose(2) << "Something went wrong while parsing the other databases!" << endl;
    348     map<atomicNumber_t,element*>::iterator iter;
    349     for(iter=parsedElems.begin();iter!=parsedElems.end();++iter){
    350       AddElement((*iter).second);
    351     }
    352   }
    353317
    354318  return status;
     
    370334    f << header1 << endl;
    371335    f << header2 << endl;
    372     for(const_iterator iter=elements.begin();iter!=elements.end();++iter){
    373          result = result && (*iter).second->Output(&f);
     336    element *walker = periodentafel::start;
     337    while (walker->next != periodentafel::end) {
     338      walker = walker->next;
     339      result = result && walker->Output(&f);
    374340    }
    375341    f.close();
Note: See TracChangeset for help on using the changeset viewer.