1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2008 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
16bf215546Sopenharmony_ci * of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci/**
29bf215546Sopenharmony_ci * @file
30bf215546Sopenharmony_ci * Generic handle table.
31bf215546Sopenharmony_ci *
32bf215546Sopenharmony_ci * @author José Fonseca <jfonseca@vmware.com>
33bf215546Sopenharmony_ci */
34bf215546Sopenharmony_ci
35bf215546Sopenharmony_ci#ifndef U_HANDLE_TABLE_H_
36bf215546Sopenharmony_ci#define U_HANDLE_TABLE_H_
37bf215546Sopenharmony_ci
38bf215546Sopenharmony_ci
39bf215546Sopenharmony_ci#ifdef __cplusplus
40bf215546Sopenharmony_ciextern "C" {
41bf215546Sopenharmony_ci#endif
42bf215546Sopenharmony_ci
43bf215546Sopenharmony_ci
44bf215546Sopenharmony_ci/**
45bf215546Sopenharmony_ci * Abstract data type to map integer handles to objects.
46bf215546Sopenharmony_ci *
47bf215546Sopenharmony_ci * Also referred as "pointer array".
48bf215546Sopenharmony_ci */
49bf215546Sopenharmony_cistruct handle_table;
50bf215546Sopenharmony_ci
51bf215546Sopenharmony_ci
52bf215546Sopenharmony_cistruct handle_table *
53bf215546Sopenharmony_cihandle_table_create(void);
54bf215546Sopenharmony_ci
55bf215546Sopenharmony_ci
56bf215546Sopenharmony_ci/**
57bf215546Sopenharmony_ci * Set an optional destructor callback.
58bf215546Sopenharmony_ci *
59bf215546Sopenharmony_ci * If set, it will be called during handle_table_remove and
60bf215546Sopenharmony_ci * handle_table_destroy calls.
61bf215546Sopenharmony_ci */
62bf215546Sopenharmony_civoid
63bf215546Sopenharmony_cihandle_table_set_destroy(struct handle_table *ht,
64bf215546Sopenharmony_ci                         void (*destroy)(void *object));
65bf215546Sopenharmony_ci
66bf215546Sopenharmony_ci
67bf215546Sopenharmony_ci/**
68bf215546Sopenharmony_ci * Add a new object.
69bf215546Sopenharmony_ci *
70bf215546Sopenharmony_ci * Returns a zero handle on failure (out of memory).
71bf215546Sopenharmony_ci */
72bf215546Sopenharmony_ciunsigned
73bf215546Sopenharmony_cihandle_table_add(struct handle_table *ht,
74bf215546Sopenharmony_ci                 void *object);
75bf215546Sopenharmony_ci
76bf215546Sopenharmony_ci/**
77bf215546Sopenharmony_ci * Returns zero on failure (out of memory).
78bf215546Sopenharmony_ci */
79bf215546Sopenharmony_ciunsigned
80bf215546Sopenharmony_cihandle_table_set(struct handle_table *ht,
81bf215546Sopenharmony_ci                 unsigned handle,
82bf215546Sopenharmony_ci                 void *object);
83bf215546Sopenharmony_ci
84bf215546Sopenharmony_ci/**
85bf215546Sopenharmony_ci * Fetch an existing object.
86bf215546Sopenharmony_ci *
87bf215546Sopenharmony_ci * Returns NULL for an invalid handle.
88bf215546Sopenharmony_ci */
89bf215546Sopenharmony_civoid *
90bf215546Sopenharmony_cihandle_table_get(struct handle_table *ht,
91bf215546Sopenharmony_ci                 unsigned handle);
92bf215546Sopenharmony_ci
93bf215546Sopenharmony_ci
94bf215546Sopenharmony_civoid
95bf215546Sopenharmony_cihandle_table_remove(struct handle_table *ht,
96bf215546Sopenharmony_ci                    unsigned handle);
97bf215546Sopenharmony_ci
98bf215546Sopenharmony_ci
99bf215546Sopenharmony_civoid
100bf215546Sopenharmony_cihandle_table_destroy(struct handle_table *ht);
101bf215546Sopenharmony_ci
102bf215546Sopenharmony_ci
103bf215546Sopenharmony_ciunsigned
104bf215546Sopenharmony_cihandle_table_get_first_handle(struct handle_table *ht);
105bf215546Sopenharmony_ci
106bf215546Sopenharmony_ci
107bf215546Sopenharmony_ciunsigned
108bf215546Sopenharmony_cihandle_table_get_next_handle(struct handle_table *ht,
109bf215546Sopenharmony_ci                             unsigned handle);
110bf215546Sopenharmony_ci
111bf215546Sopenharmony_ci
112bf215546Sopenharmony_ci#ifdef __cplusplus
113bf215546Sopenharmony_ci}
114bf215546Sopenharmony_ci#endif
115bf215546Sopenharmony_ci
116bf215546Sopenharmony_ci#endif /* U_HANDLE_TABLE_H_ */
117