Advertisement
999ms

Untitled

Apr 15th, 2020
423
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1.  
  2. template<typename DataValue>
  3. class Cache {
  4. private:
  5.    
  6.     class Data {
  7.     public:
  8.         DataValue dataValue;
  9.         std::list<std::string>::iterator it;
  10.    
  11.         Data(const DataValue& dataValue, std::list<std::string>::iterator newIterator)
  12.             : dataValue(dataValue)
  13.             , it(newIterator)
  14.         {}
  15.    
  16.         Data() {}
  17.     };
  18.    
  19.     std::unordered_map<std::string, Data> map;
  20.     std::list<std::string> listOfKeys;
  21.     std::function<DataValue(std::string)> GetFromServer;
  22.     int MAX_SIZE;
  23.    
  24.     void RemoveMostNotRelevant() {
  25.         const std::string& mostNotRelevantKey = listOfKeys.front();
  26.         map.erase(mostNotRelevantKey);
  27.         listOfKeys.pop_front();
  28.     }
  29.    
  30. public:
  31.     Cache(int maxSize = 1, std::function<DataValue(std::string)> getFromServer)
  32.         : MAX_SIZE(maxSize)
  33.         , GetFromServer(getFromServer)
  34.     {}
  35.        
  36.     Data operator () (const std::string& key) {
  37.         if (std::size(map) == MAX_SIZE) {
  38.             if (map.count(key)) {
  39.                 Data& data = map[key];
  40.                
  41.                 listOfKeys.erase(data.it);
  42.                 listOfKeys.push(key);
  43.                 data.it = std::prev(listOfKeys.end());
  44.                
  45.                 return data.dataValue;
  46.             } else {
  47.                 RemoveMostNotRelevant();
  48.                
  49.                 DataValue dataValue = GetFromServer(key);
  50.                 listOfKeys.push(key);
  51.                
  52.                 Data data(dataValue, std::prev(listOfKeys.end()));
  53.                 map[key] = data;
  54.                
  55.                 return dataValue;
  56.             }
  57.         } else {
  58.             auto [it, inserted] = map.insert({key, Data()});
  59.             Data& data = it->second;
  60.            
  61.             if (inserted) {
  62.                 data.dataValue = GetFromServer(key);
  63.                 listOfKeys.push(key);
  64.                 data.it = std::prev(listOfKeys.end());
  65.             } else {
  66.                 listOfKeys.erase(data.it);
  67.                 listOfKeys.push(key);
  68.                 data.it = std::prev(listOfKeys.end());
  69.             }  
  70.            
  71.             return data.dataValue;
  72.         }
  73.     }
  74.    
  75. };
  76.  
  77.  
  78. class MyClass
  79. {
  80.  
  81. };
  82.  
  83. int myFunc()
  84. {
  85.     Cache<double> myCache(10, [&] (std::string key) { return DataValue(key); });
  86.     Cache<MyClass> myCache(10);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement