예제 #1
0
 //キャッシュへの挿入
 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();
 }
예제 #2
0
 //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;
         //}
     }
 }
예제 #3
0
파일: lru.hpp 프로젝트: kouhate/ardb
			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;
			}
예제 #4
0
 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;
 }