source: src/Patterns/ObservedIterator.hpp@ e0b6fd

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
Last change on this file since e0b6fd was f2bb0f, checked in by Tillmann Crueger <crueger@…>, 15 years ago

FIX: Repaired memory smashing in CreateAdjacencyList

BROKEN: Unittests still fail

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2 * ObservedIterator.hpp
3 *
4 * Created on: Mar 4, 2010
5 * Author: crueger
6 */
7
8#ifndef OBSERVEDITERATOR_HPP_
9#define OBSERVEDITERATOR_HPP_
10
11#include "Patterns/Observer.hpp"
12
13#include <iterator>
14
15// we build an iterator that observes traversion of some kind of Data structure conforming to STL
16template<class _Set>
17class ObservedIterator
18 : public std::iterator<typename std::iterator_traits<typename _Set::iterator>::iterator_category,
19 typename std::iterator_traits<typename _Set::iterator>::value_type,
20 typename std::iterator_traits<typename _Set::iterator>::difference_type,
21 typename std::iterator_traits<typename _Set::iterator>::pointer,
22 typename std::iterator_traits<typename _Set::iterator>::reference>
23{
24public:
25 // Some typedefs to conform to STL-Iterator structure
26 typedef typename _Set::iterator _Iter;
27 typedef typename _Iter::value_type value_type;
28 typedef typename _Iter::difference_type difference_type;
29 typedef typename _Iter::pointer pointer;
30 typedef typename _Iter::reference reference;
31 typedef typename _Iter::iterator_category iterator_category;
32
33 ObservedIterator() :
34 protector(0)
35 {}
36
37 ObservedIterator(_Iter iter,Observable *obs) :
38 iter(iter)
39 {
40 // for this we actually get a lock on the heap,
41 // so we can copy ourselves
42 protector = new Observable::_Observable_protector(obs);
43 }
44
45 ObservedIterator(const ObservedIterator &dest) :
46 iter(dest.iter)
47 {
48 protector = new Observable::_Observable_protector(*dest.protector);
49 }
50
51 ~ObservedIterator(){
52 if(protector)
53 delete protector;
54 }
55
56 // standard Iterator methods
57 ObservedIterator& operator=(const ObservedIterator& dest){
58 if(&dest !=this){
59 // get the new lock first, in case the two locks point to the same observable
60 Observable::_Observable_protector *newLock = new Observable::_Observable_protector(*dest.protector);
61 delete protector;
62 protector = newLock;
63 // After the new lock is aquired we can safely set the iterator
64 iter = dest.iter;
65 }
66 return *this;
67 }
68
69 ObservedIterator& operator++() // prefix
70 {
71 ++iter;
72 return *this;
73 }
74
75 ObservedIterator operator++(int) // postfix with the dummy int parameter
76 {
77 ObservedIterator ret(*this);
78 ++(*this);
79 return ret;
80 }
81
82 ObservedIterator& operator--() // prefix
83 {
84 --iter;
85 }
86
87 ObservedIterator operator--(int) // postfix with the dummy int parameter
88 {
89 ObservedIterator ret(*this);
90 --(*this);
91 return ret;
92 }
93
94 bool operator==(const ObservedIterator &rhs){
95 return iter==rhs.iter;
96 }
97
98 bool operator!=(const ObservedIterator &rhs){
99 return iter!=rhs.iter;
100 }
101
102 value_type operator*(){
103 return (*iter);
104 }
105
106 // when we turn into a const iterator we can loose our lock
107 operator typename _Set::const_iterator() {
108 // typecast will be handled by the typecast method of the original iterator
109 return iter;
110 }
111
112private:
113 _Iter iter;
114 Observable::_Observable_protector *protector;
115};
116
117#endif /* OBSERVEDITERATOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.