source: molecuilder/src/Patterns/Cacheable.hpp@ 8fc9b6

Last change on this file since 8fc9b6 was d0c7ec, checked in by Tillmann Crueger <crueger@…>, 16 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.