13d12 < #include 26a26,32 > // A cached return value from a slot > template > 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(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 > cache;