Changeset 708277 for src/Atom


Ignore:
Timestamp:
Apr 17, 2013, 6:56:32 PM (12 years ago)
Author:
Frederik Heber <heber@…>
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:
691318
Parents:
79d0b9
git-author:
Frederik Heber <heber@…> (03/18/13 18:34:02)
git-committer:
Frederik Heber <heber@…> (04/17/13 18:56:32)
Message:

FIX: Using fixed Observer in CodePatterns 1.2.6.

  • we now require CodePatterns 1.2.6.
  • Notifications now use subjectKilled() when the Observable they are associated with is destroyed. This allows Observers that are just sign on to a single channel safely sign off.
  • also, derived Observable classes must not remove their Channels and Notifications by themselves. This is done by the Observable base class. Otherwise, subjectKilled() is not called.
  • changed AtomObserver: Is directly connected to the atom class, AtomInserted and AtomRemoved called in its cstor and dstor. The World has nothing to do with it. However, we have to make sure AtomObserver is purged after World.
  • Fixed also some faulty uses of ObserverLog and we always insert into NotificationChannels with static_cast to Observable for clarity.
Location:
src/Atom
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/Atom/AtomObserver.cpp

    r79d0b9 r708277  
    5050{
    5151  Channels *OurChannel = new Channels();
    52   NotificationChannels.insert( std::make_pair(this, OurChannel) );
     52  NotificationChannels.insert( std::make_pair(static_cast<Observable *>(this), OurChannel) );
    5353  OurChannel->addChannel(AtomObservable::PositionChanged);
    5454  OurChannel->addChannel(AtomObservable::ElementChanged);
     
    7171}
    7272
     73/** Function to call when an atom is about to get deleted.
     74 *
     75 * @param res
     76 */
     77void AtomObserver::AtomRemoved(atom *res)
     78{
     79  res->signOff(this, AtomObservable::PositionChanged);
     80  res->signOff(this, AtomObservable::ElementChanged);
     81}
     82
    7383CONSTRUCT_SINGLETON(AtomObserver)
  • src/Atom/AtomObserver.hpp

    r79d0b9 r708277  
    1818
    1919class atom;
    20 class World;
    2120
    2221/** The AtomObserver is a central instance to all changes occuring within atoms.
     
    2625 * keeps him updated in case of removed or added atoms.
    2726 *
     27 * \warning AtomObserver must get purged \b after World as we do not keep an
     28 * an internal list of all atoms. Hence, each atom must get destroyed while
     29 * the AtomObserver instance is still intact or segfault will occur.
     30 *
    2831 */
    2932class AtomObserver : public Singleton<AtomObserver>, public Relay
     
    3235  friend class Singleton<AtomObserver>;
    3336
    34   //!> grant World access to AtomInserted.
    35   friend class World;
     37  //!> grant atom access
     38  friend class atom;
    3639public:
    3740
    3841private:
    3942  void AtomInserted(atom *res);
     43  void AtomRemoved(atom *res);
    4044
    4145  // private constructor and destructor due to singleton
    4246  AtomObserver();
    43   ~AtomObserver();
     47  virtual ~AtomObserver();
    4448};
    4549
  • src/Atom/atom.cpp

    r79d0b9 r708277  
    3535
    3636#include "atom.hpp"
     37#include "AtomObserver.hpp"
    3738#include "Bond/bond.hpp"
    3839#include "CodePatterns/Log.hpp"
     
    5455  sort(&Nr),
    5556  mol(0)
    56 {};
     57{
     58  // sign on to global atom change tracker
     59  AtomObserver::getInstance().AtomInserted(this);
     60}
    5761
    5862atom::atom(atom *pointer) :
     
    6670  AtomicVelocity = pointer->AtomicVelocity; // copy trajectory of velocity
    6771  AtomicForce = pointer->AtomicForce;
     72  // sign on to global atom change tracker
     73  AtomObserver::getInstance().AtomInserted(this);
    6874};
    6975
     
    8086{
    8187  removeFromMolecule();
    82 };
     88  // sign off from global atom change tracker
     89  AtomObserver::getInstance().AtomRemoved(this);
     90}
    8391
    8492
  • src/Atom/atom_observable.cpp

    r79d0b9 r708277  
    4646{
    4747  Channels *OurChannel = new Channels;
    48   NotificationChannels.insert( std::make_pair(this, OurChannel) );
     48  NotificationChannels.insert( std::make_pair(static_cast<Observable *>(this), OurChannel) );
    4949  // add instance for each notification type
    5050  for (size_t type = 0; type < NotificationType_MAX; ++type)
     
    5353
    5454AtomObservable::~AtomObservable()
    55 {
    56   std::map<Observable *, Channels*>::iterator iter = NotificationChannels.find(this);
    57   ASSERT(iter != NotificationChannels.end(),
    58       "~AtomObservable() - cannot find myself in NotificationChannels.");
    59   delete iter->second;
    60   NotificationChannels.erase(iter);
    61 }
     55{}
  • src/Atom/unittests/AtomObserverUnitTest.cpp

    r79d0b9 r708277  
    9595  delete observer2;
    9696
     97  World::purgeInstance();
    9798  AtomObserver::purgeInstance();
    98   World::purgeInstance();
    9999}
    100100
Note: See TracChangeset for help on using the changeset viewer.