GroupStateCache.cpp 1.5 KB

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