GroupStateCache.cpp 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. Serial.println(state->getBrightness());
  10. return state;
  11. } else {
  12. return state;
  13. }
  14. }
  15. GroupState* GroupStateCache::set(const GroupId& 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. GroupState* GroupStateCache::getInternal(const GroupId& id) {
  38. ListNode<GroupCacheNode*>* cur = cache.getHead();
  39. while (cur != NULL) {
  40. if (cur->data->id == id) {
  41. GroupState* result = &cur->data->state;
  42. cache.spliceToFront(cur);
  43. return result;
  44. }
  45. cur = cur->next;
  46. }
  47. return NULL;
  48. }