Imported version 0.2-1
[mstardict] / src / lib / netdictcache.cpp
1 #include "netdictcache.h"
2 #include "netdictplugin.h"
3
4 #include <string>
5 #include <vector>
6 #include <map>
7
8 class RespCache {
9 public:
10         RespCache();
11         ~RespCache();
12         NetDictResponse *get_cache_resp(const char *key);
13         void save_cache_resp(const char *key, NetDictResponse *resp);
14 private:
15         static const unsigned int resp_pool_size = 50;
16         struct RespElement {
17                 std::string key;
18                 NetDictResponse *resp;
19         };
20         std::vector<RespElement *> resp_pool;
21         size_t cur_resp_pool_pos;
22 };
23
24 static std::map<std::string, RespCache> dictresp_map;
25
26 RespCache::RespCache()
27 {
28         resp_pool.resize(resp_pool_size);
29         for (size_t i = 0; i< resp_pool_size; i++) {
30                 resp_pool[i] = NULL;
31         }
32         cur_resp_pool_pos = 0;
33 }
34
35 RespCache::~RespCache()
36 {
37         for (std::vector<RespElement *>::iterator i = resp_pool.begin(); i != resp_pool.end(); ++i) {
38                 if (*i) {
39                         delete (*i)->resp;
40                         delete *i;
41                 }
42         }
43 }
44
45 NetDictResponse *RespCache::get_cache_resp(const char *key)
46 {
47         for (std::vector<RespElement *>::iterator i = resp_pool.begin(); i != resp_pool.end(); ++i) {
48                 if (*i) {
49                         if ((*i)->key == key) {
50                                 return (*i)->resp;
51                         }
52                 }
53         }
54         return NULL;
55 }
56
57 void RespCache::save_cache_resp(const char *key, NetDictResponse *resp)
58 {
59         if (resp_pool[cur_resp_pool_pos]) {
60                 delete resp_pool[cur_resp_pool_pos]->resp;
61                 delete resp_pool[cur_resp_pool_pos];
62         }
63         resp_pool[cur_resp_pool_pos] = new RespElement();
64         resp_pool[cur_resp_pool_pos]->key = key;
65         resp_pool[cur_resp_pool_pos]->resp = resp;
66         cur_resp_pool_pos++;
67         if (cur_resp_pool_pos == resp_pool_size) {
68                 cur_resp_pool_pos = 0;
69         }
70 }
71
72 static RespCache &get_response_cache(const char *dict)
73 {
74         std::map<std::string, RespCache>::iterator i = dictresp_map.find(dict);
75         if (i == dictresp_map.end()) {
76                 std::pair<std::map<std::string, RespCache>::iterator, bool> result;
77                 result = dictresp_map.insert(std::pair<std::string, RespCache>(dict, RespCache()));
78                 return result.first->second;
79         } else {
80                 return i->second;
81         }
82 }
83
84 NetDictResponse *netdict_get_cache_resp(const char *dict, const char *key)
85 {
86         RespCache &resp_cache = get_response_cache(dict);
87         return resp_cache.get_cache_resp(key);
88 }
89
90 void netdict_save_cache_resp(const char *dict, const char *key, NetDictResponse *resp)
91 {
92         RespCache &resp_cache = get_response_cache(dict);
93         resp_cache.save_cache_resp(key, resp);
94 }