GroupStateCache.cpp 1007 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <GroupStateCache.h>
  2. GroupStateCache::GroupStateCache(const size_t maxSize)
  3. : maxSize(maxSize)
  4. { }
  5. const GroupState* GroupStateCache::get(const GroupId& id) {
  6. return getInternal(id);
  7. }
  8. void 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. cache.unshift(new GroupCacheNode(id, state));
  17. } else {
  18. pushedNode->id = id;
  19. pushedNode->state = state;
  20. cache.unshift(pushedNode);
  21. }
  22. } else {
  23. *cachedState = state;
  24. }
  25. }
  26. GroupState* GroupStateCache::getInternal(const GroupId& id) {
  27. ListNode<GroupCacheNode*>* cur = cache.getHead();
  28. while (cur != NULL) {
  29. if (cur->data->id == id) {
  30. GroupState* result = &cur->data->state;
  31. cache.spliceToFront(cur);
  32. return result;
  33. }
  34. cur = cur->next;
  35. }
  36. return NULL;
  37. }