GroupStateCache.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <GroupStateCache.h>
  2. GroupStateCache::GroupStateCache(const size_t maxSize)
  3. : maxSize(maxSize)
  4. { }
  5. GroupState* GroupStateCache::get(const GroupId& id) {
  6. return getInternal(id);
  7. }
  8. GroupState* GroupStateCache::set(const GroupId& id, const GroupState& state) {
  9. GroupCacheNode* pushedNode = NULL;
  10. if (cache.size() >= maxSize) {
  11. pushedNode = cache.pop();
  12. }
  13. GroupState* cachedState = getInternal(id);
  14. if (cachedState == NULL) {
  15. if (pushedNode == NULL) {
  16. GroupCacheNode* newNode = new GroupCacheNode(id, state);
  17. cachedState = &newNode->state;
  18. cache.unshift(newNode);
  19. } else {
  20. pushedNode->id = id;
  21. pushedNode->state = state;
  22. cachedState = &pushedNode->state;
  23. cache.unshift(pushedNode);
  24. }
  25. } else {
  26. *cachedState = state;
  27. }
  28. return cachedState;
  29. }
  30. GroupId GroupStateCache::getLru() {
  31. GroupCacheNode* node = cache.getLast();
  32. return node->id;
  33. }
  34. bool GroupStateCache::isFull() const {
  35. return cache.size() >= maxSize;
  36. }
  37. ListNode<GroupCacheNode*>* GroupStateCache::getHead() {
  38. return cache.getHead();
  39. }
  40. GroupState* GroupStateCache::getInternal(const GroupId& id) {
  41. ListNode<GroupCacheNode*>* cur = cache.getHead();
  42. while (cur != NULL) {
  43. if (cur->data->id == id) {
  44. GroupState* result = &cur->data->state;
  45. cache.spliceToFront(cur);
  46. return result;
  47. }
  48. cur = cur->next;
  49. }
  50. return NULL;
  51. }