Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
CallerStalenessCache.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5
7
8 /*
9 ********************************************************************************
10 ********************** CallerStalenessCache_Traits_DEFAULT *********************
11 ********************************************************************************
12 */
13 inline CallerStalenessCache_Traits_DEFAULT::TimeStampType CallerStalenessCache_Traits_DEFAULT::GetCurrentTimestamp ()
14 {
15 return Time::GetTickCount ();
16 }
17
18 /*
19 ********************************************************************************
20 ****************** CallerStalenessCache<KEY,VALUE,TIME_TRAITS> *****************
21 ********************************************************************************
22 */
23 template <typename KEY, typename VALUE, typename TIME_TRAITS>
24 inline typename CallerStalenessCache<KEY, VALUE, TIME_TRAITS>::TimeStampType CallerStalenessCache<KEY, VALUE, TIME_TRAITS>::GetCurrentTimestamp ()
25 {
26 return TIME_TRAITS::GetCurrentTimestamp ();
27 }
28 template <typename KEY, typename VALUE, typename TIME_TRAITS>
29 inline typename CallerStalenessCache<KEY, VALUE, TIME_TRAITS>::TimeStampType CallerStalenessCache<KEY, VALUE, TIME_TRAITS>::Ago (TimeStampDifferenceType backThisTime)
30 {
31 Require (backThisTime >= 0s);
32 return GetCurrentTimestamp () - backThisTime;
33 }
34 template <typename KEY, typename VALUE, typename TIME_TRAITS>
36 {
37 if constexpr (same_as<void, KEY>) {
38 if (fData_.has_value () and fData_.fDataCapturedAt < t) {
39 fData_ = nullopt;
40 }
41 }
42 else {
43 for (auto i = fData_.begin (); i != fData_.end ();) {
44 if (i->fValue.fDataCapturedAt < t) {
45 fData_.Remove (i, &i);
46 }
47 else {
48 ++i;
49 }
50 }
51 }
52 }
53 template <typename KEY, typename VALUE, typename TIME_TRAITS>
55 {
56 if constexpr (same_as<void, KEY>) {
57 fData_ = nullopt;
58 }
59 else {
60 fData_.clear ();
61 }
62 }
63 template <typename KEY, typename VALUE, typename TIME_TRAITS>
64 template <typename K>
66 requires (IsKeyedCache<K>)
67 {
68 fData_.Remove (k);
69 }
70 template <typename KEY, typename VALUE, typename TIME_TRAITS>
73 {
74 fData_ = myVal_{move (v), GetCurrentTimestamp ()};
75 }
76 template <typename KEY, typename VALUE, typename TIME_TRAITS>
77 template <typename K>
79 requires (IsKeyedCache<K>)
80 {
81 fData_.Add (k, myVal_{move (v), GetCurrentTimestamp ()}, addReplaceMode);
82 }
83 template <typename KEY, typename VALUE, typename TIME_TRAITS>
85 requires (not IsKeyedCache<KEY>)
86 {
87 optional<myVal_> o = fData_;
88 if (not o.has_value () or o->fDataCapturedAt < staleIfOlderThan) {
89 return nullopt;
90 }
91 return o->fValue;
92 }
93 template <typename KEY, typename VALUE, typename TIME_TRAITS>
94 template <typename K>
96 requires (IsKeyedCache<K>)
97 {
98 optional<myVal_> o = fData_.Lookup (k);
99 if (not o.has_value () or o->fDataCapturedAt < staleIfOlderThan) {
100 return nullopt;
101 }
102 return o->fValue;
103 }
104 template <typename KEY, typename VALUE, typename TIME_TRAITS>
106 requires (not IsKeyedCache<KEY>)
107 {
108 optional<myVal_> o = fData_;
109 if (not o.has_value () or o->fDataCapturedAt < staleIfOlderThan) {
110 VALUE v{cacheFiller ()}; // cache fill can take some time, so make sure we call GetCurrentTimestamp() after cachefiller
111 myVal_ mv{move (v), GetCurrentTimestamp ()};
112 fData_ = mv;
113 return move (mv.fValue);
114 }
115 return o->fValue;
116 }
117 template <typename KEY, typename VALUE, typename TIME_TRAITS>
118 template <typename F, typename K>
121 {
122 optional<myVal_> o = fData_.Lookup (k);
123 if (not o.has_value () or o->fDataCapturedAt < staleIfOlderThan) {
124 VALUE v{cacheFiller (k)}; // cache fill can take some time, so make sure we call GetCurrentTimestamp() after cachefiller
125 myVal_ mv{move (v), GetCurrentTimestamp ()};
126 fData_.Add (k, mv);
127 return move (mv.fValue);
128 }
129 return o->fValue;
130 }
131 template <typename KEY, typename VALUE, typename TIME_TRAITS>
132 template <typename K>
133 inline VALUE CallerStalenessCache<KEY, VALUE, TIME_TRAITS>::LookupValue (Common::ArgByValueType<K> k, TimeStampType staleIfOlderThan,
134 const VALUE& defaultValue) const
135 requires (IsKeyedCache<K>)
136 {
137 return Lookup (k, staleIfOlderThan).value_or (defaultValue);
138 }
139 template <typename KEY, typename VALUE, typename TIME_TRAITS>
141 {
142 Clear ();
143 }
144
145}
static TimeStampType Ago(TimeStampDifferenceType backThisTime)
nonvirtual optional< VALUE > Lookup(TimeStampType staleIfOlderThan) const
nonvirtual VALUE LookupValue(TimeStampType staleIfOlderThan, const function< VALUE()> &cacheFiller)
nonvirtual void Add(Common::ArgByValueType< VALUE > v)
LRUCache implements a simple least-recently-used caching strategy, with optional hashing (of keys) to...
Definition LRUCache.h:94
nonvirtual void Add(typename Common::ArgByValueType< KEY > key, typename Common::ArgByValueType< VALUE > value)
Definition LRUCache.inl:265
nonvirtual optional< VALUE > Lookup(typename Common::ArgByValueType< KEY > key)
Definition LRUCache.inl:253
conditional_t<(sizeof(CHECK_T)<=2 *sizeof(void *)) and is_trivially_copyable_v< CHECK_T >, CHECK_T, const CHECK_T & > ArgByValueType
This is an alias for 'T' - but how we want to pass it on stack as formal parameter.
Definition TypeHints.h:32
AddReplaceMode
Mode flag to say if Adding to a container replaces, or if the first addition wins.