Changeset 4272f0 for molecuilder/src
- Timestamp:
- Feb 2, 2010, 4:46:29 PM (16 years ago)
- Children:
- bb9503
- Parents:
- 8fc9b6
- Location:
- molecuilder/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
molecuilder/src/Makefile.am
r8fc9b6 r4272f0 32 32 bin_PROGRAMS = molecuilder joiner analyzer 33 33 molecuilderdir = ${bindir} 34 #libmolecuilder_a_CXXFLAGS = -DNO_CACHING 34 35 libmolecuilder_a_SOURCES = ${SOURCE} ${HEADER} 35 36 libgslwrapper_a_SOURCES = ${LINALGSOURCE} ${LINALGHEADER} 36 37 molecuilder_DATA = elements.db valence.db orbitals.db Hbonddistance.db Hbondangle.db 37 38 molecuilder_LDFLAGS = $(BOOST_LIB) 39 #molecuilder_CXXFLAGS = -DNO_CACHING 38 40 molecuilder_SOURCES = builder.cpp 39 41 molecuilder_LDADD = libmolecuilder.a libgslwrapper.a -
molecuilder/src/Patterns/Cacheable.hpp
r8fc9b6 r4272f0 12 12 #include <boost/function.hpp> 13 13 14 template<typename T> 15 class Cacheable : public Observer 16 { 17 public: 18 Cacheable(Observable *_owner, boost::function<T()> _recalcMethod); 19 virtual ~Cacheable(); 14 #ifndef NO_CACHING 20 15 21 const bool isValid(); 22 const T& operator*(); 23 const bool operator==(const T&); 24 const bool operator!=(const T&); 16 template<typename T> 17 class Cacheable : public Observer 18 { 19 public: 20 Cacheable(Observable *_owner, boost::function<T()> _recalcMethod); 21 virtual ~Cacheable(); 25 22 26 // methods implemented for base-class Observer 27 void update(Observable *subject); 28 void subjectKilled(Observable *subject); 29 private: 30 void checkValid(); 23 const bool isValid(); 24 const T& operator*(); 25 const bool operator==(const T&); 26 const bool operator!=(const T&); 31 27 32 T content; 33 Observable *owner; 34 bool valid; 35 bool canBeUsed; 36 boost::function<T()> recalcMethod; 37 }; 28 // methods implemented for base-class Observer 29 void update(Observable *subject); 30 void subjectKilled(Observable *subject); 31 private: 32 void checkValid(); 38 33 39 template<typename T> 40 Cacheable<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 } 34 T content; 35 Observable *owner; 36 bool valid; 37 bool canBeUsed; 38 boost::function<T()> recalcMethod; 39 }; 48 40 49 template<typename T>50 const T& Cacheable<T>::operator*(){51 checkValid();52 return content;53 }54 41 55 template<typename T> 56 const bool Cacheable<T>::operator==(const T& rval){ 57 checkValid(); 58 return (content == rval); 59 } 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 } 60 51 61 template<typename T>62 const bool Cacheable<T>::operator!=(const T& rval){63 checkValid();64 return (content != rval);65 }52 template<typename T> 53 const T& Cacheable<T>::operator*(){ 54 checkValid(); 55 return content; 56 } 66 57 67 template<typename T>68 Cacheable<T>::~Cacheable() 69 { 70 owner->signOff(this);71 }58 template<typename T> 59 const bool Cacheable<T>::operator==(const T& rval){ 60 checkValid(); 61 return (content == rval); 62 } 72 63 73 template<typename T> 74 const bool Cacheable<T>::isValid(){ 75 return valid; 76 } 64 template<typename T> 65 const bool Cacheable<T>::operator!=(const T& rval){ 66 checkValid(); 67 return (content != rval); 68 } 77 69 78 template<typename T> 79 void Cacheable<T>::update(Observable *subject) { 80 valid = false; 81 } 70 template<typename T> 71 Cacheable<T>::~Cacheable() 72 { 73 owner->signOff(this); 74 } 82 75 83 template<typename T> 84 void Cacheable<T>::subjectKilled(Observable *subject) { 85 valid = false; 86 canBeUsed = false; 87 } 76 template<typename T> 77 const bool Cacheable<T>::isValid(){ 78 return valid; 79 } 88 80 89 template<typename T> 90 void Cacheable<T>::checkValid(){ 91 assert(canBeUsed && "Cacheable used after owner was deleted"); 92 if(!isValid()){ 93 content = recalcMethod(); 81 template<typename T> 82 void Cacheable<T>::update(Observable *subject) { 83 valid = false; 94 84 } 95 } 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 96 159 97 160 #endif /* CACHEABLE_HPP_ */
Note:
See TracChangeset
for help on using the changeset viewer.