//////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany /// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// Portions of the code are: /// /// Copyright (c) 2014, lamerman /// All rights reserved. /// /// Redistribution and use in source and binary forms, with or without /// modification, are permitted provided that the following conditions are met: /// /// * Redistributions of source code must retain the above copyright notice, /// this /// list of conditions and the following disclaimer. /// /// * Redistributions in binary form must reproduce the above copyright notice, /// this list of conditions and the following disclaimer in the documentation /// and/or other materials provided with the distribution. /// /// * Neither the name of lamerman nor the names of its /// contributors may be used to endorse or promote products derived from /// this software without specific prior written permission. /// /// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" /// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE /// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE /// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE /// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR /// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF /// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS /// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN /// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) /// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE /// POSSIBILITY OF SUCH DAMAGE. /// ////////////////////////////////////////////////////////////////////////////////// #ifndef ARANGODB_LRUCACHE_H #define ARANGODB_LRUCACHE_H 1 #include #include #include #include namespace arangodb { namespace basics { template class LruCache { public: typedef typename std::pair key_value_pair_t; typedef typename std::list::iterator list_iterator_t; LruCache(size_t max_size) : _max_size(max_size) {} void put(const key_t& key, const value_t& value) { auto it = _cache_items_map.find(key); _cache_items_list.push_front(key_value_pair_t(key, value)); if (it != _cache_items_map.end()) { _cache_items_list.erase(it->second); _cache_items_map.erase(it); } _cache_items_map[key] = _cache_items_list.begin(); if (_cache_items_map.size() > _max_size) { auto last = _cache_items_list.end(); last--; _cache_items_map.erase(last->first); _cache_items_list.pop_back(); } } value_t const* get(const key_t& key) { auto it = _cache_items_map.find(key); if (it == _cache_items_map.end()) { return nullptr; } else { _cache_items_list.splice(_cache_items_list.begin(), _cache_items_list, it->second); return &it->second->second; } } bool remove(key_t const& key) { auto it = _cache_items_map.find(key); if (it == _cache_items_map.end()) { return false; } else { _cache_items_list.erase(it->second); _cache_items_map.erase(it); return true; } } void clear() { _cache_items_map.clear(); _cache_items_list.clear(); } bool exists(const key_t& key) const { return _cache_items_map.find(key) != _cache_items_map.end(); } size_t size() const { return _cache_items_map.size(); } private: std::list _cache_items_list; std::unordered_map _cache_items_map; size_t _max_size; }; } // namespace basics } // namespace arangodb #endif