Ignore:
Timestamp:
Aug 6, 2010, 2:01:13 PM (15 years ago)
Author:
Tillmann Crueger <crueger@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
822f01
Parents:
2a76b0
Message:

Made the periodentafel return only "const element *" instead of "element * const", to avoid unexpected changes to stored elements

  • Note: returning "type * const" from a function does not make sense, since the pointer has to be copied anyway (calling convention), so the calling function can just do another copy to get a non const version of the pointer
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/periodentafel.cpp

    r2a76b0 re5c0a1  
    3434  {
    3535    stringstream input(elementsDB,ios_base::in);
    36     bool status = LoadElementsDatabase(&input);
     36    bool status = LoadElementsDatabase(input);
    3737    ASSERT(status,  "General element initialization failed");
    3838  }
     
    7272 * \return iterator to added element
    7373 */
    74 periodentafel::iterator periodentafel::AddElement(element * const pointer)
     74periodentafel::iterator periodentafel::AddElement(element * pointer)
    7575{
    7676  atomicNumber_t Z = pointer->getNumber();
     
    8585 * \param *pointer element to be removed
    8686 */
    87 size_t periodentafel::RemoveElement(element * const pointer)
     87size_t periodentafel::RemoveElement(const element * pointer)
    8888{
    8989  return RemoveElement(pointer->getNumber());
     
    113113 * \return pointer to element or NULL if not found
    114114 */
    115 element * const periodentafel::FindElement(atomicNumber_t Z) const
     115const element * periodentafel::FindElement(atomicNumber_t Z) const
    116116{
    117117  const_iterator res = elements.find(Z);
     
    124124 * \return pointer to element
    125125 */
    126 element * const periodentafel::FindElement(const string &shorthand) const
     126const element * periodentafel::FindElement(const string &shorthand) const
    127127{
    128128  element *res = 0;
     
    139139 * \return desired element or NULL
    140140 */
    141 element * const periodentafel::AskElement() const
    142 {
    143   element * walker = NULL;
     141const element * periodentafel::AskElement() const
     142{
     143  const element * walker = NULL;
    144144  int Z;
    145145  do {
     
    154154 * \return pointer to either present or newly created element
    155155 */
    156 element * const periodentafel::EnterElement()
     156const element * periodentafel::EnterElement()
    157157{
    158158  atomicNumber_t Z = 0;
    159159  DoLog(0) && (Log() << Verbose(0) << "Atomic number: " << Z << endl);
    160160  cin >> Z;
    161   element * const res = FindElement(Z);
     161  const element *res = FindElement(Z);
    162162  if (!res) {
    163163    // TODO: make this using the constructor
     
    179179
    180180/******************** Access to iterators ****************************/
    181 periodentafel::const_iterator periodentafel::begin(){
     181periodentafel::const_iterator periodentafel::begin() const{
    182182  return elements.begin();
    183183}
    184184
    185 periodentafel::const_iterator periodentafel::end(){
     185periodentafel::const_iterator periodentafel::end() const{
    186186  return elements.end();
    187187}
    188188
    189 periodentafel::reverse_iterator periodentafel::rbegin(){
     189periodentafel::reverse_iterator periodentafel::rbegin() const{
    190190  return reverse_iterator(elements.end());
    191191}
    192192
    193 periodentafel::reverse_iterator periodentafel::rend(){
     193periodentafel::reverse_iterator periodentafel::rend() const{
    194194  return reverse_iterator(elements.begin());
    195195}
     
    227227  if (!input.fail())
    228228    DoLog(0) && (Log() << Verbose(0) << "Using " << filename << " as elements database." << endl);
    229   status = status && LoadElementsDatabase(&input);
     229  status = status && LoadElementsDatabase(input);
    230230  input.close();
    231231  input.clear();
     
    286286 * \return true - parsing successful, false - something went wrong
    287287 */
    288 bool periodentafel::LoadElementsDatabase(istream *input)
     288bool periodentafel::LoadElementsDatabase(istream &input)
    289289{
    290290  bool status = true;
    291   int counter = 0;
    292   pair< std::map<atomicNumber_t,element*>::iterator, bool > InserterTest;
    293   if (!(*input).fail()) {
    294     (*input).getline(header1, MAXSTRINGSIZE);
    295     (*input).getline(header2, MAXSTRINGSIZE); // skip first two header lines
     291  string header1tmp,header2tmp;
     292  // first parse into a map, so we can revert to old status in case something goes wront
     293  map<atomicNumber_t,element*> parsedElements;
     294  if (!input.fail()) {
     295    getline(input,header1tmp);
     296    getline(input,header2tmp); // skip first two header lines
     297    cout << "First header: " << header1tmp << endl;
     298    cout << "Second header: " << header2tmp << endl;
    296299    DoLog(0) && (Log() << Verbose(0) <<  "Parsed elements:");
    297     while (!(*input).eof()) {
     300    while (!input.eof()) {
    298301      element *neues = new element;
    299       (*input) >> neues->getName();;
    300       //(*input) >> ws;
    301       (*input) >> neues->getSymbol();
    302       //(*input) >> ws;
    303       (*input) >> neues->period;
    304       //(*input) >> ws;
    305       (*input) >> neues->group;
    306       //(*input) >> ws;
    307       (*input) >> neues->block;
    308       //(*input) >> ws;
    309       (*input) >> neues->Z;
    310       //(*input) >> ws;
    311       (*input) >> neues->mass;
    312       //(*input) >> ws;
    313       (*input) >> neues->CovalentRadius;
    314       //(*input) >> ws;
    315       (*input) >> neues->VanDerWaalsRadius;
    316       //(*input) >> ws;
    317       (*input) >> ws;
     302      input >> neues->getName();;
     303      //(*input) >> ws;
     304      input >> neues->getSymbol();
     305      //(*input) >> ws;
     306      input >> neues->period;
     307      //(*input) >> ws;
     308      input >> neues->group;
     309      //(*input) >> ws;
     310      input >> neues->block;
     311      //(*input) >> ws;
     312      input >> neues->Z;
     313      //(*input) >> ws;
     314      input >> neues->mass;
     315      //(*input) >> ws;
     316      input >> neues->CovalentRadius;
     317      //(*input) >> ws;
     318      input >> neues->VanDerWaalsRadius;
     319      //(*input) >> ws;
     320      input >> ws;
    318321      //neues->Output((ofstream *)&cout);
    319322      if ((neues->getNumber() > 0) && (neues->getNumber() < MAX_ELEMENTS)) {
    320         if (elements.count(neues->getNumber())) {// if element already present, remove and delete old one (i.e. replace it)
    321           //cout << neues->symbol << " is present already." << endl;
    322           element * const Elemental = FindElement(neues->getNumber());
    323           ASSERT(Elemental != NULL, "element should be present but is not??");
    324           *Elemental = *neues;
    325           delete(neues);
    326           neues = Elemental;
    327         } else {
    328           InserterTest = elements.insert(pair <atomicNumber_t,element*> (neues->getNumber(), neues));
    329           ASSERT(InserterTest.second, "Could not insert new element into periodentafel on LoadElementsDatabase().");
    330         }
     323        parsedElements[neues->Z] = neues;
    331324        DoLog(0) && (Log() << Verbose(0) << " " << *neues);
    332         counter++;
    333325      } else {
    334326        DoeLog(2) && (eLog() << Verbose(2) << "Detected empty line or invalid element in elements db, discarding." << endl);
     
    336328        delete(neues);
    337329      }
     330      // when the input is in failed state, we most likely just read garbage
     331      if(input.fail()) {
     332        DoeLog(2) && (eLog() << Verbose(2) << "Error parsing elements db." << endl);
     333        status = false;
     334        break;
     335      }
    338336    }
    339337    DoLog(0) && (Log() << Verbose(0) << endl);
     
    343341  }
    344342
    345   if (counter == 0)
     343  if (!parsedElements.size())
    346344    status = false;
     345
     346  if(status){
     347    for(map<atomicNumber_t,element*>::iterator iter=parsedElements.begin();
     348                                               iter!=parsedElements.end();
     349                                               ++iter){
     350      if (elements.count(iter->first)) {
     351        // if element already present, replace the old one
     352        // pointer to old element might still be in use, so we have to replace into the old element
     353        *(elements[iter->first])=*iter->second;
     354      }
     355      else {
     356        // no such element in periodentafel... we can just insert
     357        elements[iter->first] = iter->second;
     358      }
     359    }
     360    // all went well.. we now copy the header
     361    strncpy(header1,header1tmp.c_str(),MAXSTRINGSIZE);
     362    header1[MAXSTRINGSIZE-1]=0;
     363    strncpy(header2,header2tmp.c_str(),MAXSTRINGSIZE);
     364    header2[MAXSTRINGSIZE-1]=0;
     365  }
    347366
    348367  return status;
Note: See TracChangeset for help on using the changeset viewer.