GroupStateCache.cpp 1.1 KB

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