1b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**************************************************************************
2b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
3b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Copyright 2008 VMware, Inc.
4b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * All Rights Reserved.
5b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
6b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * copy of this software and associated documentation files (the
8b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * "Software"), to deal in the Software without restriction, including
9b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * the following conditions:
13b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
14b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * The above copyright notice and this permission notice (including the
15b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * next paragraph) shall be included in all copies or substantial portions
16b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * of the Software.
17b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
18b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
26b901e1f212c11afda05f2628a522d86802f87c52José Fonseca **************************************************************************/
27b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
28b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**
29b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @file
30b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Simple cache.
31b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
32b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
33b901e1f212c11afda05f2628a522d86802f87c52José Fonseca */
34b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
35b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#ifndef U_CACHE_H_
36b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#define U_CACHE_H_
37b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
38b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
39b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#include "pipe/p_compiler.h"
40b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
41b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
42b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#ifdef __cplusplus
43b901e1f212c11afda05f2628a522d86802f87c52José Fonsecaextern "C" {
44b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#endif
45b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
46b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
47b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**
48b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Least Recently Used (LRU) cache.
49b901e1f212c11afda05f2628a522d86802f87c52José Fonseca */
50b901e1f212c11afda05f2628a522d86802f87c52José Fonsecastruct util_cache;
51b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
52b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
53b901e1f212c11afda05f2628a522d86802f87c52José Fonseca/**
54b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * Create a cache.
55b901e1f212c11afda05f2628a522d86802f87c52José Fonseca *
56b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @param hash hash function
57b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @param compare should return 0 for two equal keys
58b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @param destroy destruction callback (optional)
59b901e1f212c11afda05f2628a522d86802f87c52José Fonseca * @param size maximum number of entries
60b901e1f212c11afda05f2628a522d86802f87c52José Fonseca */
61b901e1f212c11afda05f2628a522d86802f87c52José Fonsecastruct util_cache *
62ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonsecautil_cache_create(uint32_t (*hash)(const void *key),
63ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca                  int (*compare)(const void *key1, const void *key2),
64ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca                  void (*destroy)(void *key, void *value),
65ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca                  uint32_t size);
66b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
67b901e1f212c11afda05f2628a522d86802f87c52José Fonsecavoid
68b901e1f212c11afda05f2628a522d86802f87c52José Fonsecautil_cache_set(struct util_cache *cache,
69ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca               void *key,
70ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca               void *value);
71b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
72b901e1f212c11afda05f2628a522d86802f87c52José Fonsecavoid *
73b901e1f212c11afda05f2628a522d86802f87c52José Fonsecautil_cache_get(struct util_cache *cache,
74ae7e75d6108e8621878083b35a13edc1aca893dfJosé Fonseca               const void *key);
75b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
76b901e1f212c11afda05f2628a522d86802f87c52José Fonsecavoid
77b901e1f212c11afda05f2628a522d86802f87c52José Fonsecautil_cache_clear(struct util_cache *cache);
78b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
79b901e1f212c11afda05f2628a522d86802f87c52José Fonsecavoid
80b901e1f212c11afda05f2628a522d86802f87c52José Fonsecautil_cache_destroy(struct util_cache *cache);
81b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
82d00cbf46cde0edee6d8f2c08e14458ef92ff0fbeAlex Corscaddenvoid
83d00cbf46cde0edee6d8f2c08e14458ef92ff0fbeAlex Corscaddenutil_cache_remove(struct util_cache *cache,
84d00cbf46cde0edee6d8f2c08e14458ef92ff0fbeAlex Corscadden                  const void *key);
85d00cbf46cde0edee6d8f2c08e14458ef92ff0fbeAlex Corscadden
86b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
87b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#ifdef __cplusplus
88b901e1f212c11afda05f2628a522d86802f87c52José Fonseca}
89b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#endif
90b901e1f212c11afda05f2628a522d86802f87c52José Fonseca
91b901e1f212c11afda05f2628a522d86802f87c52José Fonseca#endif /* U_CACHE_H_ */
92