21 template<
typename Val_>
inline constexpr
23 : age(),range_value() {
26 template<
typename Val_>
inline constexpr
28 : age(),range_value(v) {
31 template<
typename Val_>
inline
33 : age(l.age),range_value(l.range_value) {
36 template<
typename Val_>
inline
40 template<
typename Val_>
inline lru<Val_> &
43 range_value=l.range_value;
47 template<
typename Val_>
inline const typename lru<Val_>::
value_type &
53 template<
typename Val_>
inline typename lru<Val_>::
value_type &
59 template<
typename Val_>
inline clock_t
66 : total_accesses_(),total_hits_(),total_flushes_() {
71 : total_accesses_(bs.total_accesses_),total_hits_(bs.total_hits_),total_flushes_(bs.total_flushes_) {
80 total_accesses_=bs.total_accesses_;
81 total_hits_=bs.total_hits_;
82 total_flushes_=bs.total_flushes_;
88 return total_accesses_;
98 return total_flushes_;
113 _T(
"Basic cache statistics:\n")
114 _T(
"\tHit rate=")<<(
static_cast<
double>(stats.total_hits_)/stats.total_accesses_)<<
_T(
"\n")
115 _T(
"\tTotal number of accesses=")<<stats.total_accesses_<<
_T(
"\n")
116 _T(
"\tTotal number of hits=")<<stats.total_hits_<<
_T(
"\n")
117 _T(
"\tTotal number of flushes=")<<stats.total_flushes_<<
_T(
"\n")
143 template<
class Factory>
inline
145 : data_factory_(r.data_factory_) {
148 template<
class Factory>
inline
152 template<
class Factory>
inline base<Factory> &
154 data_factory_=r.data_factory_;
160 return data_factory_;
163 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline
164 ro<Factory, FP, ThrT, Stats>::
ro(
const ro &r)
165 :
base<Factory>(r),
low_water_mark(r.low_water_mark),
high_water_mark(r.high_water_mark), serialize(), flusher_pool(), populate_pool(r.populate_pool.pool_size()), internal_cache(), statistics_(r.statistics_) {
166 const lock_t lock(r.serialize);
167 internal_cache=r.internal_cache;
170 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline
171 ro<Factory, FP, ThrT, Stats>::~
ro(
void)
noexcept(
true) {
174 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline ro<Factory, FP, ThrT, Stats> &
176 const lock_t lock_this(serialize,
lock_traits::infinite_timeout());
177 base<Factory>::operator=(r);
181 const lock_t lock_that(r.serialize,
lock_traits::infinite_timeout());
182 internal_cache=r.internal_cache;
183 statistics_=r.statistics_;
187 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline bool
188 ro<Factory, FP, ThrT, Stats>::
empty(
void)
const noexcept(
true) {
189 const lock_t lock(serialize,
lock_traits::infinite_timeout());
190 return internal_cache.empty();
193 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline const typename ro<Factory, FP, ThrT, Stats>::
size_type
194 ro<Factory, FP, ThrT, Stats>::
size(
void)
const noexcept(
true) {
195 const lock_t lock(serialize,
lock_traits::infinite_timeout());
196 return internal_cache.size();
199 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline void
201 const lock_t lock(serialize,
lock_traits::infinite_timeout());
202 internal_cache.clear();
206 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline const typename ro<Factory, FP, ThrT, Stats>::
mapped_type
208 const typename colln_t::const_iterator i(internal_cache.find(id));
209 statistics_.accessed();
210 if (i!=internal_cache.end()) {
214 typedef typename base_t::find_range_data find_range_type;
216 const lock_t lock(serialize,
lock_traits::infinite_timeout());
217 auto const &get_range_data=populate_pool<<
typename thread_traits::populate_pool_t::joinable()<<find_range_type(
base<Factory>::data_factory(), id);
219 typedef typename base_t::flush_cache flush_cache_t;
220 flusher_pool<<flush_nonjoinable()<<flush_cache_t(*
this);
222 const std::pair<
typename colln_t::const_iterator,
bool> inserted_data(
223 internal_cache.insert(
226 typename colln_t::value_type::second_type(get_range_data->data)
230 assert(inserted_data.second);
231 return inserted_data.first->second;
235 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline void
238 lock_t lock(serialize);
242 const typename victimization_traits::criterion_t criterion(victimization_traits::select(internal_cache.begin(),internal_cache.end()));
243 const typename colln_t::iterator a_victim(
std::find_if(internal_cache.begin(),internal_cache.end(),criterion));
244 assert(a_victim!=internal_cache.end());
245 internal_cache.erase(a_victim);
247 statistics_.flushed();
252 template<
class Factory,
class FP,
class ThrT,
class Stats>
inline const Stats &