Changeset 0af22d for src/UIElements
- Timestamp:
- Feb 14, 2016, 12:34:26 PM (9 years ago)
- 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:
- 393342
- Parents:
- b43585
- git-author:
- Frederik Heber <heber@…> (12/30/15 14:28:53)
- git-committer:
- Frederik Heber <heber@…> (02/14/16 12:34:26)
- Location:
- src/UIElements/Qt4/InstanceBoard
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer.hpp
rb43585 r0af22d 17 17 #include "ObservedValue_types.hpp" 18 18 19 #include <deque> 19 20 #include <map> 20 21 #include <string> … … 92 93 93 94 private: 94 typedef std::pair<typename T::ptr, size_t> RefCountedObservedValues_t; 95 typedef std::map<id, RefCountedObservedValues_t> CountedObservedValues_t; 95 /** \note CountedObservedValues_t needs to contain a list in the second argument 96 * as the ObservedValuesContainer may fall behind when a single atom is created 97 * and destroyed a number of times in a row (e.g. in the undo/redo cases). This 98 * problem is inherent because on the one hand we keep the QtObservedAtom alive 99 * till the last moment, i.e. till the GUI does not need it anymore where the 100 * original instance may long have been removed from the World. On the other hand 101 * we instantiate the e.g. QtObservedAtom as soon as the observed atom is created. 102 */ 103 104 typedef std::deque<std::pair<typename T::ptr, size_t> > RefCountedObservedValues_t; 105 typedef std::map<id, RefCountedObservedValues_t > CountedObservedValues_t; 96 106 //!> internal vector of observed values 97 107 CountedObservedValues_t ObservedValues; … … 154 164 * \param _id identifier of instance associated with observed values 155 165 * \param _obsvalues vector of observed values of instance 156 * \return true - insertion successful, false - else157 166 */ 158 boolinsert(const id _id, const typename T::ptr &_obsvalues);167 void insert(const id _id, const typename T::ptr &_obsvalues); 159 168 160 169 /** Use to change the identifier associated with a vector of observed values. … … 165 174 */ 166 175 bool changeIdentifier(const id _oldid, const id _newid); 167 168 /** Returns the number of reference delivered for this instance identified by \a _id.169 *170 * \param _id identifier of instance171 * \return reference count172 */173 size_t getRefCount(const id _id) const;174 176 175 177 /** Checks whether a vector of observed values of an instance identified by \a _id -
src/UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp
rb43585 r0af22d 33 33 { 34 34 for (typename CountedObservedValues_t::iterator iter = ObservedValues.begin(); 35 iter != ObservedValues.end(); ++iter) 36 iter->second.first->noteBoardIsGone(); 35 iter != ObservedValues.end(); ++iter) { 36 ASSERT( !iter->second.empty(), 37 "~ObservedValuesContainer() of "+NameOfType+" "+toString(iter->first) 38 +" has an empty list in ObservedValues."); 39 for (typename RefCountedObservedValues_t::iterator listiter = iter->second.begin(); 40 listiter != iter->second.end(); ++listiter) { 41 listiter->first->noteBoardIsGone(); 42 } 43 } 37 44 } 38 45 … … 44 51 "ObservedValuesContainer::getObservedValues() - no observed values present for " 45 52 +NameOfType+" "+toString(_id)); 46 const typename T::ptr &obsvalues = iter->second.first; 53 ASSERT( !iter->second.empty(), 54 "ObservedValuesContainer<T,id>::get() of "+NameOfType+" "+toString(_id) 55 +" has an empty list in ObservedValues."); 56 const typename T::ptr &obsvalues = iter->second.back().first; 47 57 48 58 return obsvalues; … … 59 69 "ObservedValuesContainer<T,id>::markObservedValuesAsConnected() - Observed value of " 60 70 +NameOfType+" "+toString(_id)+" is not present yet."); 61 ++(iter->second.second); 71 ASSERT( !iter->second.empty(), 72 "ObservedValuesContainer<T,id>::markObservedValuesAsConnected() of "+NameOfType 73 +" "+toString(_id)+" has an empty list in ObservedValues."); 74 ++(iter->second.back().second); 62 75 } 63 76 … … 67 80 { 68 81 typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id); 69 return ((iter != ObservedValues.end()) && (iter->second.second == 0)); 82 ASSERT( !iter->second.empty(), 83 "ObservedValuesContainer<T,id>::checkRefCount() of "+NameOfType 84 +" "+toString(_id)+" has an empty list in ObservedValues."); 85 return ((iter != ObservedValues.end()) && (iter->second.front().second == 0)); 70 86 } 71 87 … … 80 96 "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of " 81 97 +NameOfType+" "+toString(_id)+" is not present yet."); 82 ASSERT (iter->second.second != 0, 98 ASSERT( !iter->second.empty(), 99 "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() of "+NameOfType 100 +" "+toString(_id)+" has an empty list in ObservedValues."); 101 ASSERT (iter->second.front().second != 0, 83 102 "ObservedValuesContainer<T,id>::markObservedValuesAsDisconnected() - Observed value of " 84 103 +NameOfType+" "+toString(_id)+" is already signOff() from all."); 85 --(iter->second. second);104 --(iter->second.front().second); 86 105 87 106 if (checkRefCount(_id) && checksubjectKilled(_id) && checkMarkedForErase(_id)) … … 124 143 onDestroy(_id); 125 144 subjectKilledCount.erase(_id); 126 ObservedValues.erase(_id); 145 typename CountedObservedValues_t::iterator iter = ObservedValues.find(_id); 146 ASSERT( !iter->second.empty(), 147 "ObservedValuesContainer<T,id>::removeObservedValues() of "+NameOfType 148 +" for "+toString(_id)+" has an empty list in ObservedValues."); 149 if (iter->second.size() == 1) 150 ObservedValues.erase(iter); 151 else { 152 //if more than one, erase always the first one 153 iter->second.pop_front(); 154 } 127 155 MarkedForErase.erase(_id); 128 156 } … … 150 178 151 179 template <class T, typename id> 152 boolObservedValuesContainer<T,id>::insert(const id _id, const typename T::ptr &_obsvalues)180 void ObservedValuesContainer<T,id>::insert(const id _id, const typename T::ptr &_obsvalues) 153 181 { 154 182 std::pair<typename CountedObservedValues_t::iterator, bool> inserter = 155 183 ObservedValues.insert( 156 std::make_pair( _id, std::make_pair(_obsvalues,0) ) ); 184 std::make_pair( _id, RefCountedObservedValues_t(1,std::make_pair(_obsvalues,0)) ) ); 185 if (!inserter.second) { 186 // already an entry present? add to deque 187 inserter.first->second.push_back( std::make_pair(_obsvalues,0) ); 188 } 157 189 _obsvalues->activateObserver(); 158 return inserter.second;159 190 } 160 191 … … 174 205 if (status) { 175 206 { 207 // TODO: Actually, we need to think whether we do not have to to split the 208 // deque in two parts: the last entry having the newid, while all other 209 // ones retain the old one until they get removed. But we need to check 210 // whether changing ids "there" is possible when the QtObserved... is under 211 // removal. 176 212 RefCountedObservedValues_t obsvalues = Colditer->second; 177 213 ObservedValues.erase(Colditer); … … 193 229 194 230 template <class T, typename id> 195 size_t ObservedValuesContainer<T,id>::getRefCount(const id _id) const196 {197 typename CountedObservedValues_t::const_iterator iter = ObservedValues.find(_id);198 return iter->second.second;199 }200 201 template <class T, typename id>202 231 bool ObservedValuesContainer<T,id>::isPresent(const id _id) const 203 232 { -
src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp
rb43585 r0af22d 159 159 moleculeSubjectKilled); 160 160 QtObservedMolecule::ptr observedmolecule(new QtObservedMolecule(ObservedValues, *this)); 161 #ifndef NDEBUG 162 bool status = 163 #endif 164 moleculeObservedValues.insert(_id, observedmolecule); 165 ASSERT( status, 166 "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedMolecule for" 167 +toString(_id)+"."); 161 moleculeObservedValues.insert(_id, observedmolecule); 168 162 // we need to check for index changes 169 163 LOG(3, "DEBUG: InformationBoard signOn()s to molecule " << _id); … … 207 201 atomSubjectKilled); 208 202 QtObservedAtom::ptr observedatom(new QtObservedAtom(ObservedValues, *this)); 209 #ifndef NDEBUG 210 bool status = 211 #endif 212 atomObservedValues.insert(_id, observedatom); 213 ASSERT( status, 214 "QtObservedInstanceBoard::recieveNotification() - could not insert ObservedValues for" 215 +toString(_id)+"."); 203 atomObservedValues.insert(_id, observedatom); 216 204 // we need to check for index changes 217 205 LOG(3, "DEBUG: InformationBoard signOn()s to atom " << _id);
Note:
See TracChangeset
for help on using the changeset viewer.