source: src/Patterns/Cacheable.hpp@ e3c8b4

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

Added data structure to allow caching of derived values

  • Property mode set to 100644
File size: 1.8 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
14template<typename T>
15class Cacheable : public Observer
16{
17public:
18 Cacheable(Observable *_owner, boost::function<T()> _recalcMethod);
19 virtual ~Cacheable();
20
21 const bool isValid();
22 const T& operator*();
23 const bool operator==(const T&);
24 const bool operator!=(const T&);
25
26 // methods implemented for base-class Observer
27 void update(Observable *subject);
28 void subjectKilled(Observable *subject);
29private:
30 void checkValid();
31
32 T content;
33 Observable *owner;
34 bool valid;
35 bool canBeUsed;
36 boost::function<T()> recalcMethod;
37};
38
39template<typename T>
40Cacheable<T>::Cacheable(Observable *_owner, boost::function<T()> _recalcMethod) :
41 owner(_owner),
42 recalcMethod(_recalcMethod),
43 valid(false),
44 canBeUsed(true)
45{
46 owner->signOn(this);
47}
48
49template<typename T>
50const T& Cacheable<T>::operator*(){
51 checkValid();
52 return content;
53}
54
55template<typename T>
56const bool Cacheable<T>::operator==(const T& rval){
57 checkValid();
58 return (content == rval);
59}
60
61template<typename T>
62const bool Cacheable<T>::operator!=(const T& rval){
63 checkValid();
64 return (content != rval);
65}
66
67template<typename T>
68Cacheable<T>::~Cacheable()
69{
70 owner->signOff(this);
71}
72
73template<typename T>
74const bool Cacheable<T>::isValid(){
75 return valid;
76}
77
78template<typename T>
79void Cacheable<T>::update(Observable *subject) {
80 valid = false;
81}
82
83template<typename T>
84void Cacheable<T>::subjectKilled(Observable *subject) {
85 valid = false;
86 canBeUsed = false;
87}
88
89template<typename T>
90void Cacheable<T>::checkValid(){
91 assert(canBeUsed && "Cacheable used after owner was deleted");
92 if(!isValid()){
93 content = recalcMethod();
94 }
95}
96
97#endif /* CACHEABLE_HPP_ */
Note: See TracBrowser for help on using the repository browser.