@@ -15,9 +15,7 @@ enum class ES3FIFOPageLocation {
1515 MainQueue
1616};
1717
18- template <typename TPageKey
19- , typename TPageKeyHash
20- , typename TPageKeyEqual>
18+ template <typename TPageKey, typename TPageTraits>
2119class TS3FIFOGhostPageQueue {
2220 struct TGhostPage {
2321 TPageKey Key;
@@ -31,13 +29,13 @@ class TS3FIFOGhostPageQueue {
3129
3230 struct TGhostPageHash {
3331 inline size_t operator ()(const TGhostPage* ghost) const {
34- return TPageKeyHash ()( ghost->Key );
32+ return ghost->Key . GetHash ( );
3533 }
3634 };
3735
3836 struct TGhostPageEqual {
3937 inline bool operator ()(const TGhostPage* left, const TGhostPage* right) const {
40- return TPageKeyEqual ()( left->Key , right->Key ) ;
38+ return left->Key == right->Key ;
4139 }
4240 };
4341
@@ -122,14 +120,7 @@ class TS3FIFOGhostPageQueue {
122120 TDeque<TGhostPage> GhostsQueue;
123121};
124122
125- template <typename TPage
126- , typename TPageKey
127- , typename TPageKeyHash
128- , typename TPageKeyEqual
129- , typename TPageSize
130- , typename TPageLocation
131- , typename TPageFrequency
132- >
123+ template <typename TPage, typename TPageKey, typename TPageTraits>
133124class TS3FIFOCache : public ICacheCache <TPage> {
134125 struct TLimit {
135126 ui64 SmallQueueLimit;
@@ -176,7 +167,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
176167 }
177168
178169 TIntrusiveList<TPage> Touch (TPage* page) override {
179- const ES3FIFOPageLocation location = GetLocation (page);
170+ const ES3FIFOPageLocation location = TPageTraits:: GetLocation (page);
180171 switch (location) {
181172 case ES3FIFOPageLocation::SmallQueue:
182173 case ES3FIFOPageLocation::MainQueue: {
@@ -191,7 +182,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
191182 }
192183
193184 void Erase (TPage* page) override {
194- const ES3FIFOPageLocation location = GetLocation (page);
185+ const ES3FIFOPageLocation location = TPageTraits:: GetLocation (page);
195186 switch (location) {
196187 case ES3FIFOPageLocation::None:
197188 EraseGhost (page);
@@ -206,7 +197,7 @@ class TS3FIFOCache : public ICacheCache<TPage> {
206197 Y_ABORT (" Unknown page location" );
207198 }
208199
209- SetFrequency (page, 0 );
200+ TPageTraits:: SetFrequency (page, 0 );
210201 }
211202
212203 void UpdateLimit (ui64 limit) override {
@@ -223,9 +214,9 @@ class TS3FIFOCache : public ICacheCache<TPage> {
223214 for (auto it = queue.Queue .begin (); it != queue.Queue .end (); it++) {
224215 const TPage* page = &*it;
225216 if (count != 0 ) result << " , " ;
226- result << " {" << GetKey (page).ToString () << " " << GetFrequency (page) << " f " << GetSize (page) << " b}" ;
217+ result << " {" << TPageTraits:: GetKey (page).ToString () << " " << TPageTraits:: GetFrequency (page) << " f " << TPageTraits:: GetSize (page) << " b}" ;
227218 count++;
228- size += GetSize (page);
219+ size += TPageTraits:: GetSize (page);
229220 }
230221 Y_DEBUG_ABORT_UNLESS (queue.Size == size);
231222 };
@@ -245,17 +236,17 @@ class TS3FIFOCache : public ICacheCache<TPage> {
245236 while (true ) {
246237 if (!SmallQueue.Queue .Empty () && SmallQueue.Size > Limit.SmallQueueLimit ) {
247238 TPage* page = Pop (SmallQueue);
248- if (ui32 frequency = GetFrequency (page); frequency > 1 ) { // load inserts, first read touches, second read touches
239+ if (ui32 frequency = TPageTraits:: GetFrequency (page); frequency > 1 ) { // load inserts, first read touches, second read touches
249240 Push (MainQueue, page);
250241 } else {
251- if (frequency) SetFrequency (page, 0 );
242+ if (frequency) TPageTraits:: SetFrequency (page, 0 );
252243 AddGhost (page);
253244 return page;
254245 }
255246 } else if (!MainQueue.Queue .Empty () && MainQueue.Size > Limit.MainQueueLimit ) {
256247 TPage* page = Pop (MainQueue);
257- if (ui32 frequency = GetFrequency (page); frequency > 0 ) {
258- SetFrequency (page, frequency - 1 );
248+ if (ui32 frequency = TPageTraits:: GetFrequency (page); frequency > 0 ) {
249+ TPageTraits:: SetFrequency (page, frequency - 1 );
259250 Push (MainQueue, page);
260251 } else {
261252 return page;
@@ -269,19 +260,19 @@ class TS3FIFOCache : public ICacheCache<TPage> {
269260 }
270261
271262 void TouchFast (TPage* page) {
272- Y_DEBUG_ABORT_UNLESS (GetLocation (page) != ES3FIFOPageLocation::None);
263+ Y_DEBUG_ABORT_UNLESS (TPageTraits:: GetLocation (page) != ES3FIFOPageLocation::None);
273264
274- ui32 frequency = GetFrequency (page);
265+ ui32 frequency = TPageTraits:: GetFrequency (page);
275266 if (frequency < 3 ) {
276- SetFrequency (page, frequency + 1 );
267+ TPageTraits:: SetFrequency (page, frequency + 1 );
277268 }
278269 }
279270
280271 TIntrusiveList<TPage> Insert (TPage* page) {
281- Y_DEBUG_ABORT_UNLESS (GetLocation (page) == ES3FIFOPageLocation::None);
272+ Y_DEBUG_ABORT_UNLESS (TPageTraits:: GetLocation (page) == ES3FIFOPageLocation::None);
282273
283274 Push (EraseGhost (page) ? MainQueue : SmallQueue, page);
284- SetFrequency (page, 0 );
275+ TPageTraits:: SetFrequency (page, 0 );
285276
286277 TIntrusiveList<TPage> evictedList;
287278 while (TPage* evictedPage = EvictOneIfFull ()) {
@@ -293,70 +284,46 @@ class TS3FIFOCache : public ICacheCache<TPage> {
293284
294285 TPage* Pop (TQueue& queue) {
295286 Y_DEBUG_ABORT_UNLESS (!queue.Queue .Empty ());
296- Y_ABORT_UNLESS (GetLocation (queue.Queue .Front ()) == queue.Location );
297- Y_ABORT_UNLESS (queue.Size >= GetSize (queue.Queue .Front ()));
287+ Y_ABORT_UNLESS (TPageTraits:: GetLocation (queue.Queue .Front ()) == queue.Location );
288+ Y_ABORT_UNLESS (queue.Size >= TPageTraits:: GetSize (queue.Queue .Front ()));
298289
299290 TPage* page = queue.Queue .PopFront ();
300- queue.Size -= GetSize (page);
301- SetLocation (page, ES3FIFOPageLocation::None);
291+ queue.Size -= TPageTraits:: GetSize (page);
292+ TPageTraits:: SetLocation (page, ES3FIFOPageLocation::None);
302293
303294 return page;
304295 }
305296
306297 void Push (TQueue& queue, TPage* page) {
307- Y_ABORT_UNLESS (GetLocation (page) == ES3FIFOPageLocation::None);
298+ Y_ABORT_UNLESS (TPageTraits:: GetLocation (page) == ES3FIFOPageLocation::None);
308299
309300 queue.Queue .PushBack (page);
310- queue.Size += GetSize (page);
311- SetLocation (page, queue.Location );
301+ queue.Size += TPageTraits:: GetSize (page);
302+ TPageTraits:: SetLocation (page, queue.Location );
312303 }
313304
314305 void Erase (TQueue& queue, TPage* page) {
315- Y_ABORT_UNLESS (GetLocation (page) == queue.Location );
316- Y_ABORT_UNLESS (queue.Size >= GetSize (page));
306+ Y_ABORT_UNLESS (TPageTraits:: GetLocation (page) == queue.Location );
307+ Y_ABORT_UNLESS (queue.Size >= TPageTraits:: GetSize (page));
317308
318309 page->Unlink ();
319- queue.Size -= GetSize (page);
320- SetLocation (page, ES3FIFOPageLocation::None);
310+ queue.Size -= TPageTraits:: GetSize (page);
311+ TPageTraits:: SetLocation (page, ES3FIFOPageLocation::None);
321312 }
322313
323314 void AddGhost (const TPage* page) {
324- GhostQueue.Add (GetKey (page), GetSize (page));
315+ GhostQueue.Add (TPageTraits:: GetKey (page), TPageTraits:: GetSize (page));
325316 }
326317
327318 bool EraseGhost (const TPage* page) {
328- return GhostQueue.Erase (GetKey (page), GetSize (page));
329- }
330-
331- TPageKey GetKey (const TPage* page) const {
332- return TPageKey::Get (page);
333- }
334-
335- ui64 GetSize (const TPage* page) const {
336- return TPageSize::Get (page);
337- }
338-
339- ES3FIFOPageLocation GetLocation (const TPage* page) const {
340- return TPageLocation::Get (page);
341- }
342-
343- void SetLocation (TPage* page, ES3FIFOPageLocation location) const {
344- TPageLocation::Set (page, location);
345- }
346-
347- ui32 GetFrequency (const TPage* page) const {
348- return TPageFrequency::Get (page);
349- }
350-
351- void SetFrequency (TPage* page, ui32 frequency) const {
352- TPageFrequency::Set (page, frequency);
319+ return GhostQueue.Erase (TPageTraits::GetKey (page), TPageTraits::GetSize (page));
353320 }
354321
355322private:
356323 TLimit Limit;
357324 TQueue SmallQueue;
358325 TQueue MainQueue;
359- TS3FIFOGhostPageQueue<TPageKey, TPageKeyHash, TPageKeyEqual > GhostQueue;
326+ TS3FIFOGhostPageQueue<TPageKey, TPageTraits > GhostQueue;
360327
361328};
362329
0 commit comments