source: src/Patterns/Cacheable.hpp@ 9ad391

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

Added possibility to disable caching mechanism at compile time

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 * Cacheable.hpp
3 *
4 * Created on: Feb 2, 2010
5 * Author: crueger
6 */
7
8#ifndef CACHEABLE_HPP_
9#define CACHEABLE_HPP_
10
11#include "Patterns/Observer.hpp"
12#include <boost/function.hpp>
13
14#ifndef NO_CACHING
15
16 template<typename T>
17 class Cacheable : public Observer
18 {
19 public:
20 Cacheable(Observable *_owner, boost::function<T()> _recalcMethod);
21 virtual ~Cacheable();
22
23 const bool isValid();
24 const T& operator*();
25 const bool operator==(const T&);
26 const bool operator!=(const T&);
27
28 // methods implemented for base-class Observer
29 void update(Observable *subject);
30 void subjectKilled(Observable *subject);
31 private:
32 void checkValid();
33
34 T content;
35 Observable *owner;
36 bool valid;
37 bool canBeUsed;
38 boost::function<T()> recalcMethod;
39 };
40
41
42 template<typename T>
43 Cacheable<T>::Cacheable(Observable *_owner, boost::function<T()> _recalcMethod) :
44 owner(_owner),
45 recalcMethod(_recalcMethod),
46 valid(false),
47 canBeUsed(true)
48 {
49 owner->signOn(this);
50 }
51
52 template<typename T>
53 const T& Cacheable<T>::operator*(){
54 checkValid();
55 return content;
56 }
57
58 template<typename T>
59 const bool Cacheable<T>::operator==(const T& rval){
60 checkValid();
61 return (content == rval);
62 }
63
64 template<typename T>
65 const bool Cacheable<T>::operator!=(const T& rval){
66 checkValid();
67 return (content != rval);
68 }
69
70 template<typename T>
71 Cacheable<T>::~Cacheable()
72 {
73 owner->signOff(this);
74 }
75
76 template<typename T>
77 const bool Cacheable<T>::isValid(){
78 return valid;
79 }
80
81 template<typename T>
82 void Cacheable<T>::update(Observable *subject) {
83 valid = false;
84 }
85
86 template<typename T>
87 void Cacheable<T>::subjectKilled(Observable *subject) {
88 valid = false;
89 canBeUsed = false;
90 }
91
92 template<typename T>
93 void Cacheable<T>::checkValid(){
94 assert(canBeUsed && "Cacheable used after owner was deleted");
95 if(!isValid()){
96 content = recalcMethod();
97 }
98 }
99#else
100 template<typename T>
101 class Cacheable : public Observer
102 {
103 public:
104 Cacheable(Observable *_owner, boost::function<T()> _recalcMethod);
105 virtual ~Cacheable();
106
107 const bool isValid();
108 const T& operator*();
109 const bool operator==(const T&);
110 const bool operator!=(const T&);
111
112 // methods implemented for base-class Observer
113 void update(Observable *subject);
114 void subjectKilled(Observable *subject);
115 private:
116
117 boost::function<T()> recalcMethod;
118 };
119
120 template<typename T>
121 Cacheable<T>::Cacheable(Observable *_owner, boost::function<T()> _recalcMethod) :
122 recalcMethod(_recalcMethod)
123 {}
124
125 template<typename T>
126 const T& Cacheable<T>::operator*(){
127 return recalcMethod();
128 }
129
130 template<typename T>
131 const bool Cacheable<T>::operator==(const T& rval){
132 return (recalcMethod() == rval);
133 }
134
135 template<typename T>
136 const bool Cacheable<T>::operator!=(const T& rval){
137 return (recalcMethod() != rval);
138 }
139
140 template<typename T>
141 Cacheable<T>::~Cacheable()
142 {}
143
144 template<typename T>
145 const bool Cacheable<T>::isValid(){
146 return true;
147 }
148
149 template<typename T>
150 void Cacheable<T>::update(Observable *subject) {
151 assert(0 && "Cacheable::update should never be called when caching is disabled");
152 }
153
154 template<typename T>
155 void Cacheable<T>::subjectKilled(Observable *subject) {
156 assert(0 && "Cacheable::subjectKilled should never be called when caching is disabled");
157 }
158#endif
159
160#endif /* CACHEABLE_HPP_ */
Note: See TracBrowser for help on using the repository browser.