GroupStateCache.cpp 1.3 KB

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