This source file includes following definitions.
- gdCacheCreate
- gdCacheDelete
- gdCacheGet
- cacheTest
- cacheFetch
- cacheRelease
- main
1 #include "gd.h"
2 #include "gdhelpers.h"
3
4 #ifdef HAVE_LIBFREETYPE
5 #define NEED_CACHE 1
6 #endif
7
8 #ifdef NEED_CACHE
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #include "gdcache.h"
49
50
51
52
53
54
55
56 gdCache_head_t *
57 gdCacheCreate (
58 int size,
59 gdCacheTestFn_t gdCacheTest,
60 gdCacheFetchFn_t gdCacheFetch,
61 gdCacheReleaseFn_t gdCacheRelease)
62 {
63 gdCache_head_t *head;
64
65 head = (gdCache_head_t *) gdPMalloc(sizeof (gdCache_head_t));
66 head->mru = NULL;
67 head->size = size;
68 head->gdCacheTest = gdCacheTest;
69 head->gdCacheFetch = gdCacheFetch;
70 head->gdCacheRelease = gdCacheRelease;
71 return head;
72 }
73
74 void
75 gdCacheDelete (gdCache_head_t * head)
76 {
77 gdCache_element_t *elem, *prev;
78
79 elem = head->mru;
80 while (elem)
81 {
82 (*(head->gdCacheRelease)) (elem->userdata);
83 prev = elem;
84 elem = elem->next;
85 gdPFree ((char *) prev);
86 }
87 gdPFree ((char *) head);
88 }
89
90 void *
91 gdCacheGet (gdCache_head_t * head, void *keydata)
92 {
93 int i = 0;
94 gdCache_element_t *elem, *prev = NULL, *prevprev = NULL;
95 void *userdata;
96
97 elem = head->mru;
98 while (elem)
99 {
100 if ((*(head->gdCacheTest)) (elem->userdata, keydata))
101 {
102 if (i)
103 {
104
105 prev->next = elem->next;
106 elem->next = head->mru;
107 head->mru = elem;
108 }
109 return elem->userdata;
110 }
111 prevprev = prev;
112 prev = elem;
113 elem = elem->next;
114 i++;
115 }
116 userdata = (*(head->gdCacheFetch)) (&(head->error), keydata);
117 if (!userdata)
118 {
119
120 return NULL;
121 }
122 if (i < head->size)
123 {
124 elem = (gdCache_element_t *) gdPMalloc(sizeof (gdCache_element_t));
125 }
126 else
127 {
128
129 prevprev->next = NULL;
130 elem = prev;
131 (*(head->gdCacheRelease)) (elem->userdata);
132 }
133
134 elem->next = head->mru;
135 head->mru = elem;
136 elem->userdata = userdata;
137 return userdata;
138 }
139
140
141
142
143
144
145
146
147 #ifdef TEST
148
149 #include <stdio.h>
150
151 typedef struct
152 {
153 int key;
154 int value;
155 }
156 key_value_t;
157
158 static int
159 cacheTest (void *map, void *key)
160 {
161 return (((key_value_t *) map)->key == *(int *) key);
162 }
163
164 static void *
165 cacheFetch (char **error, void *key)
166 {
167 key_value_t *map;
168
169 map = (key_value_t *) gdMalloc (sizeof (key_value_t));
170 map->key = *(int *) key;
171 map->value = 3;
172
173 *error = NULL;
174 return (void *) map;
175 }
176
177 static void
178 cacheRelease (void *map)
179 {
180 gdFree ((char *) map);
181 }
182
183 int
184 main (char *argv[], int argc)
185 {
186 gdCache_head_t *cacheTable;
187 int elem, key;
188
189 cacheTable = gdCacheCreate (3, cacheTest, cacheFetch, cacheRelease);
190
191 key = 20;
192 elem = *(int *) gdCacheGet (cacheTable, &key);
193 key = 30;
194 elem = *(int *) gdCacheGet (cacheTable, &key);
195 key = 40;
196 elem = *(int *) gdCacheGet (cacheTable, &key);
197 key = 50;
198 elem = *(int *) gdCacheGet (cacheTable, &key);
199 key = 30;
200 elem = *(int *) gdCacheGet (cacheTable, &key);
201 key = 30;
202 elem = *(int *) gdCacheGet (cacheTable, &key);
203
204 gdCacheDelete (cacheTable);
205
206 return 0;
207 }
208
209 #endif
210 #endif