19typedef std::map<unsigned int,bool,std::less<unsigned int> > mapclass;
20typedef std::map<unsigned int,bool,std::less<unsigned int> >::iterator mapiterator;
25template <
class T,
class S>
31 T (*calc_fn)(
const S &);
34 const T& value()
const;
35 T calculate_val()
const {
return (*calc_fn)(*iptr); }
39 void init(
const S *, T (*fnptr)(
const S &));
40 void copy(
const lazy &,
const S *);
42 const T& force_recalculation()
const;
44 const T& operator() ()
const {
return this->value(); }
51 template <
class T,
class S>
friend class lazy;
53 mutable bool validflag;
54 mutable mapclass validcache;
55 mutable unsigned int tagnum;
58 unsigned int getnewtag()
const {
return tagnum++; }
60 bool is_whole_cache_valid()
const
63 bool is_cache_entry_valid(
const unsigned int tag)
const
64 {
return validcache[tag]; }
65 void set_cache_entry_validity(
const unsigned int tag,
const bool newflag)
const
66 { validcache[tag] = newflag; }
68 void invalidate_whole_cache()
const;
73 void set_whole_cache_validity(
const bool newflag)
const
74 { validflag = newflag; }
85template <
class T,
class S>
88 if ( (iptr == 0) || (tag==0) ) {
89 std::cerr <<
"Error: uninitialized lazy evaluation class" << std::endl;
92 if (! iptr->is_whole_cache_valid() ) {
93 iptr->invalidate_whole_cache();
94 iptr->set_whole_cache_validity(
true);
96 if (! iptr->is_cache_entry_valid(tag)) {
98 storedval = calculate_val();
99 iptr->set_cache_entry_validity(tag,
true);
105template <
class T,
class S>
106const T& lazy<T,S>::force_recalculation()
const
108 if ( (iptr == 0) || (tag==0) ) {
109 std::cerr <<
"Error: uninitialized lazy evaluation class" << std::endl;
114 if (! iptr->is_whole_cache_valid() ) {
115 iptr->invalidate_whole_cache();
116 iptr->set_whole_cache_validity(
true);
119 storedval = calculate_val();
120 iptr->set_cache_entry_validity(tag,
true);
126template <
class T,
class S>
127void lazy<T,S>::init(
const S *ip, T (*fnptr)(
const S &))
131 tag = iptr->getnewtag();
132 iptr->set_cache_entry_validity(tag,
false);
136template <
class T,
class S>
137void lazy<T,S>::copy(
const lazy &source,
const S *ip) {
138 storedval = source.storedval;
140 calc_fn = source.calc_fn;