source: src/Patterns/ObservedIterator.hpp@ 75ac0c

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 75ac0c was bd58fb, checked in by Tillmann Crueger <crueger@…>, 15 years ago

Added an iterator pattern for observed Data structures

  • Property mode set to 100644
File size: 3.0 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 }
73
74 ObservedIterator operator++(int) // postfix with the dummy int parameter
75 {
76 ObservedIterator ret(*this);
77 ++(*this);
78 return ret;
79 }
80
81 ObservedIterator& operator--() // prefix
82 {
83 --iter;
84 }
85
86 ObservedIterator operator--(int) // postfix with the dummy int parameter
87 {
88 ObservedIterator ret(*this);
89 --(*this);
90 return ret;
91 }
92
93 bool operator==(const ObservedIterator &rhs){
94 return iter==rhs.iter;
95 }
96
97 bool operator!=(const ObservedIterator &rhs){
98 return iter!=rhs.iter;
99 }
100
101 value_type operator*(){
102 return (*iter);
103 }
104
105 // when we turn into a const iterator we can loose our lock
106 operator typename _Set::const_iterator() {
107 // typecast will be handled by the typecast method of the original iterator
108 return iter;
109 }
110
111private:
112 _Iter iter;
113 Observable::_Observable_protector *protector;
114};
115
116#endif /* OBSERVEDITERATOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.