13d12
< #include <memory>
26a26,32
>       // A cached return value from a slot
>       template<typename T>
>       struct cached_return_value {
>         cached_return_value(const T& t) : value(t) {}
> 
>         T value;
>       };
50c56
<         slot_call_iterator() : is_cache_valid(false) {}
---
>         slot_call_iterator() {}
53c59
<           : iter(iter_in), end(end_in), f(f), is_cache_valid(false)
---
>           : iter(iter_in), end(end_in), f(f), cache()
61,64c67,69
< 	  if (!is_cache_valid) {
< 	    cache = f(*iter);
< 	  }
< 	  is_cache_valid = true;
---
>           if (!cache.get()) {
>             cache.reset(new cached_return_value<result_type>(f(*iter)));
>           }
66c71
<           return cache;
---
>           return cache->value;
72c77
< 	  is_cache_valid = false;
---
>           cache.reset();
87,88c92
<         mutable result_type cache;
< 	mutable bool is_cache_valid;
---
>         mutable shared_ptr< cached_return_value<result_type> > cache;

