source: trunk/GDE/SINA/builddir/src/cache.h

Last change on this file was 19170, checked in by westram, 2 years ago
  • sina source
    • unpack + remove tarball
    • no longer ignore sina builddir.
File size: 2.7 KB
Line 
1/*
2Copyright (c) 2006-2018 Elmar Pruesse <elmar.pruesse@ucdenver.edu>
3
4This file is part of SINA.
5SINA is free software: you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free
7Software Foundation, either version 3 of the License, or (at your
8option) any later version.
9
10SINA is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or
12FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13for more details.
14
15You should have received a copy of the GNU General Public License
16along with SINA.  If not, see <http://www.gnu.org/licenses/>.
17
18Additional permission under GNU GPL version 3 section 7
19
20If you modify SINA, or any covered work, by linking or combining it
21with components of ARB (or a modified version of that software),
22containing parts covered by the terms of the
23ARB-public-library-license, the licensors of SINA grant you additional
24permission to convey the resulting work. Corresponding Source for a
25non-source form of such a combination shall include the source code
26for the parts of ARB used as well as that of the covered work.
27*/
28
29#ifndef _CACHE_H_
30#define _CACHE_H_
31
32#include <mutex>
33#include <list>
34#include <unordered_map>
35
36namespace sina {
37
38template<typename KEY, typename VALUE>
39class fifo_cache {
40public:
41    explicit fifo_cache(size_t size) : _size(size) {}
42    void store(KEY&& key, VALUE&& value) {
43        std::lock_guard<std::mutex> lock(_mutex);
44        auto it = _keys.find(key);
45        if (it != _keys.end()) {
46            _items.erase(it->second);
47            _keys.erase(it);
48        }
49        _items.emplace_front(std::make_pair(KEY(key), value));
50        _keys.emplace(key, _items.begin());
51        if (_keys.size() > _size) {
52            _keys.erase(_items.back().first);
53            _items.pop_back();
54        }
55    }
56
57    bool try_get(const KEY& key, VALUE& val) {
58        std::lock_guard<std::mutex> lock(_mutex);
59        auto it = _keys.find(key);
60        if (it == _keys.end()) {
61            return false;
62        }
63        val = std::move(it->second->second);
64        _items.erase(it->second);
65        _keys.erase(it);
66        return true;
67    }
68
69private:
70    size_t _size;
71    using list_type = std::list<std::pair<KEY, VALUE>>;
72    list_type _items;
73    std::unordered_map<KEY, typename list_type::iterator> _keys;
74    std::mutex _mutex;
75};
76
77
78
79} // namespace SINA
80
81#endif
82
83/*
84  Local Variables:
85  mode:c++
86  c-file-style:"stroustrup"
87  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
88  indent-tabs-mode:nil
89  fill-column:99
90  End:
91*/
92// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
93
Note: See TracBrowser for help on using the repository browser.