MCPcopy Create free account
hub / github.com/BohemiaInteractive/CWR / GetOperField

Method GetOperField

engine/Poseidon/IO/LockCache.cpp:361–418  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

359const int OperCacheMaxSize = 1024;
360
361OperField* OperCache::GetOperField(int x, int z, int mask)
362{
363 if (!InRange(z, x))
364 {
365 return nullptr;
366 }
367 OperField* fld;
368 fld = _index(x, z);
369 if (fld)
370 {
371 PoseidonAssert(fld->_x == x);
372 PoseidonAssert(fld->_z == z);
373 Ref<OperField> temp = fld;
374 _operFields.Delete(fld); // remove from current location
375 _operFields.Insert(fld); // insert as first
376 fld->_lastUsed = Glob.time;
377 return fld;
378 }
379
380 // _data is sorted by time when it was used
381 Ref<OperField> entry;
382 if (_count >= OperCacheMinSize)
383 {
384 // we have more entries than we would like - remove only very old entries
385 entry = RemoveOld(60, OperCacheMinSize);
386 if (_count >= OperCacheNormalSize)
387 {
388 // we have to much entries - remove more recent entries
389 entry = RemoveOld(5, OperCacheNormalSize);
390 if (_count >= OperCacheMaxSize)
391 {
392 // we must release something - memory usage critical
393 // we have to remove last field
394 // try to reuse entry if possible
395 // remove last entry
396 entry = _operFields.Last();
397 _index(entry->_x, entry->_z) = 0;
398 _operFields.Delete(entry);
399 _count--;
400 }
401 }
402 }
403 if (!entry)
404 {
405 entry = new OperField(x, z, mask);
406 }
407 else
408 {
409 entry->Init(x, z, mask);
410 }
411
412 // create a new entry
413 _operFields.Insert(entry);
414 _count++;
415 _index(x, z) = entry;
416 entry->_lastUsed = Glob.time;
417 return entry;
418}

Callers 2

DrawDiagsMethod · 0.80
CreateFieldMethod · 0.80

Calls 4

LastMethod · 0.80
DeleteMethod · 0.45
InsertMethod · 0.45
InitMethod · 0.45

Tested by

no test coverage detected