//キャッシュへの挿入 void insert(std::string key, DATA data){ mutex.lock(); //std::cout << "insert " << data << std::endl; //新データの場合(挿入しサイズをオーバーする場合は一番古いものを削除) if (mCacheMap.count(key) == 0) { //listの先頭にクエリ追加 mCacheList.push_front(std::make_pair(key, data)); //ポインタの位置を保持 mCacheMap[key] = mCacheList.begin(); entries++; if (entries > capacity) { //keyを基にlistの最後尾をさすポインタを消去 mCacheMap.erase(mCacheList.back().first); //キャッシュのLRU要素を削除 mCacheList.pop_back(); entries--; } } //既にあるデータの場合(位置を一番前にもってくるだけ) else { mCacheList.erase(mCacheMap[key]); mCacheList.push_front(std::make_pair(key, data)); //ポインタの位置を先頭に更新 mCacheMap[key] = mCacheList.begin(); } mutex.unlock(); }
//keyを基に値の取得 DATA get(std::string key){ if (mCacheMap.count(key) == 1){ mutex.lock(); EntryPair value = *mCacheMap[key]; //現在の位置から削除し、最初の位置に変更 mCacheList.erase(mCacheMap[key]); mCacheList.push_front(value); //ポインタの位置を先頭に更新 mCacheMap[key] = mCacheList.begin(); mutex.unlock(); return value.second; } //キャッシュに求める値が入っていない場合 (エラーを投げる) else { throw "NOT IN YOUR CACHE"; //値を返すようにする場合はこちら //if (typeid(DATA) == typeid(cv::Mat)) //{ // cv::Mat mtx(cv::Size(100,100), CV_16U,cv::Scalar(0,0,0)); // return mtx; //} //if (typeid(DATA) == typeid(int)) //{ // return -1; //} } }
bool Insert(const key_type& key, const value_type& value, value_type* erase_value) { typename CacheEntryMap::iterator found = m_entry_map.find(key); bool erased_old = false; if (found != m_entry_map.end()) { erased_old = true; if (NULL != erase_value) { (*erase_value) = (*found->second); } m_cache_list.erase(found->second); } m_cache_list.push_front(std::make_pair(key, value)); m_entry_map[key] = m_cache_list.begin(); if (m_entry_map.size() > m_max_size) { if (NULL != erase_value) { (*erase_value) = m_cache_list.back(); } m_entry_map.erase(m_cache_list.back().first); m_cache_list.pop_back(); erased_old = true; } return erased_old; }
bool Get(const key_type& key, value_type& value) { typename CacheEntryMap::iterator found = m_entry_map.find(key); if (found != m_entry_map.end()) { typename CacheList::iterator list_it = found->second; value = list_it->second; m_cache_list.erase(list_it); m_cache_list.push_front(std::make_pair(key, value)); m_entry_map[key] = m_cache_list.begin(); return true; } return false; }