1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky *
6*d6b92ffaSHans Petter Selasky * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky *
12*d6b92ffaSHans Petter Selasky * Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky * without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky * conditions are met:
15*d6b92ffaSHans Petter Selasky *
16*d6b92ffaSHans Petter Selasky * - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky * disclaimer.
19*d6b92ffaSHans Petter Selasky *
20*d6b92ffaSHans Petter Selasky * - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky * copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky * disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky * provided with the distribution.
24*d6b92ffaSHans Petter Selasky *
25*d6b92ffaSHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky * SOFTWARE.
33*d6b92ffaSHans Petter Selasky *
34*d6b92ffaSHans Petter Selasky */
35*d6b92ffaSHans Petter Selasky
36*d6b92ffaSHans Petter Selasky /*
37*d6b92ffaSHans Petter Selasky * Abstract:
38*d6b92ffaSHans Petter Selasky * Declaration of quick map, a binary tree where the caller always provides
39*d6b92ffaSHans Petter Selasky * all necessary storage.
40*d6b92ffaSHans Petter Selasky */
41*d6b92ffaSHans Petter Selasky
42*d6b92ffaSHans Petter Selasky #ifndef _CL_QMAP_H_
43*d6b92ffaSHans Petter Selasky #define _CL_QMAP_H_
44*d6b92ffaSHans Petter Selasky
45*d6b92ffaSHans Petter Selasky #include <complib/cl_qpool.h>
46*d6b92ffaSHans Petter Selasky
47*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
48*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS extern "C" {
49*d6b92ffaSHans Petter Selasky # define END_C_DECLS }
50*d6b92ffaSHans Petter Selasky #else /* !__cplusplus */
51*d6b92ffaSHans Petter Selasky # define BEGIN_C_DECLS
52*d6b92ffaSHans Petter Selasky # define END_C_DECLS
53*d6b92ffaSHans Petter Selasky #endif /* __cplusplus */
54*d6b92ffaSHans Petter Selasky
55*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
56*d6b92ffaSHans Petter Selasky /****h* Component Library/Quick Map
57*d6b92ffaSHans Petter Selasky * NAME
58*d6b92ffaSHans Petter Selasky * Quick Map
59*d6b92ffaSHans Petter Selasky *
60*d6b92ffaSHans Petter Selasky * DESCRIPTION
61*d6b92ffaSHans Petter Selasky * Quick map implements a binary tree that stores user provided cl_map_item_t
62*d6b92ffaSHans Petter Selasky * structures. Each item stored in a quick map has a unique 64-bit key
63*d6b92ffaSHans Petter Selasky * (duplicates are not allowed). Quick map provides the ability to
64*d6b92ffaSHans Petter Selasky * efficiently search for an item given a key.
65*d6b92ffaSHans Petter Selasky *
66*d6b92ffaSHans Petter Selasky * Quick map does not allocate any memory, and can therefore not fail
67*d6b92ffaSHans Petter Selasky * any operations due to insufficient memory. Quick map can thus be useful
68*d6b92ffaSHans Petter Selasky * in minimizing the error paths in code.
69*d6b92ffaSHans Petter Selasky *
70*d6b92ffaSHans Petter Selasky * Quick map is not thread safe, and users must provide serialization when
71*d6b92ffaSHans Petter Selasky * adding and removing items from the map.
72*d6b92ffaSHans Petter Selasky *
73*d6b92ffaSHans Petter Selasky * The quick map functions operate on a cl_qmap_t structure which should be
74*d6b92ffaSHans Petter Selasky * treated as opaque and should be manipulated only through the provided
75*d6b92ffaSHans Petter Selasky * functions.
76*d6b92ffaSHans Petter Selasky *
77*d6b92ffaSHans Petter Selasky * SEE ALSO
78*d6b92ffaSHans Petter Selasky * Structures:
79*d6b92ffaSHans Petter Selasky * cl_qmap_t, cl_map_item_t, cl_map_obj_t
80*d6b92ffaSHans Petter Selasky *
81*d6b92ffaSHans Petter Selasky * Callbacks:
82*d6b92ffaSHans Petter Selasky * cl_pfn_qmap_apply_t
83*d6b92ffaSHans Petter Selasky *
84*d6b92ffaSHans Petter Selasky * Item Manipulation:
85*d6b92ffaSHans Petter Selasky * cl_qmap_set_obj, cl_qmap_obj, cl_qmap_key
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky * Initialization:
88*d6b92ffaSHans Petter Selasky * cl_qmap_init
89*d6b92ffaSHans Petter Selasky *
90*d6b92ffaSHans Petter Selasky * Iteration:
91*d6b92ffaSHans Petter Selasky * cl_qmap_end, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_prev
92*d6b92ffaSHans Petter Selasky *
93*d6b92ffaSHans Petter Selasky * Manipulation:
94*d6b92ffaSHans Petter Selasky * cl_qmap_insert, cl_qmap_get, cl_qmap_remove_item, cl_qmap_remove,
95*d6b92ffaSHans Petter Selasky * cl_qmap_remove_all, cl_qmap_merge, cl_qmap_delta, cl_qmap_get_next
96*d6b92ffaSHans Petter Selasky *
97*d6b92ffaSHans Petter Selasky * Search:
98*d6b92ffaSHans Petter Selasky * cl_qmap_apply_func
99*d6b92ffaSHans Petter Selasky *
100*d6b92ffaSHans Petter Selasky * Attributes:
101*d6b92ffaSHans Petter Selasky * cl_qmap_count, cl_is_qmap_empty,
102*d6b92ffaSHans Petter Selasky *********/
103*d6b92ffaSHans Petter Selasky /****i* Component Library: Quick Map/cl_map_color_t
104*d6b92ffaSHans Petter Selasky * NAME
105*d6b92ffaSHans Petter Selasky * cl_map_color_t
106*d6b92ffaSHans Petter Selasky *
107*d6b92ffaSHans Petter Selasky * DESCRIPTION
108*d6b92ffaSHans Petter Selasky * The cl_map_color_t enumerated type is used to note the color of
109*d6b92ffaSHans Petter Selasky * nodes in a map.
110*d6b92ffaSHans Petter Selasky *
111*d6b92ffaSHans Petter Selasky * SYNOPSIS
112*d6b92ffaSHans Petter Selasky */
113*d6b92ffaSHans Petter Selasky typedef enum _cl_map_color {
114*d6b92ffaSHans Petter Selasky CL_MAP_RED,
115*d6b92ffaSHans Petter Selasky CL_MAP_BLACK
116*d6b92ffaSHans Petter Selasky } cl_map_color_t;
117*d6b92ffaSHans Petter Selasky /*
118*d6b92ffaSHans Petter Selasky * VALUES
119*d6b92ffaSHans Petter Selasky * CL_MAP_RED
120*d6b92ffaSHans Petter Selasky * The node in the map is red.
121*d6b92ffaSHans Petter Selasky *
122*d6b92ffaSHans Petter Selasky * CL_MAP_BLACK
123*d6b92ffaSHans Petter Selasky * The node in the map is black.
124*d6b92ffaSHans Petter Selasky *
125*d6b92ffaSHans Petter Selasky * SEE ALSO
126*d6b92ffaSHans Petter Selasky * Quick Map, cl_map_item_t
127*d6b92ffaSHans Petter Selasky *********/
128*d6b92ffaSHans Petter Selasky
129*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_map_item_t
130*d6b92ffaSHans Petter Selasky * NAME
131*d6b92ffaSHans Petter Selasky * cl_map_item_t
132*d6b92ffaSHans Petter Selasky *
133*d6b92ffaSHans Petter Selasky * DESCRIPTION
134*d6b92ffaSHans Petter Selasky * The cl_map_item_t structure is used by maps to store objects.
135*d6b92ffaSHans Petter Selasky *
136*d6b92ffaSHans Petter Selasky * The cl_map_item_t structure should be treated as opaque and should
137*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions.
138*d6b92ffaSHans Petter Selasky *
139*d6b92ffaSHans Petter Selasky * SYNOPSIS
140*d6b92ffaSHans Petter Selasky */
141*d6b92ffaSHans Petter Selasky typedef struct _cl_map_item {
142*d6b92ffaSHans Petter Selasky /* Must be first to allow casting. */
143*d6b92ffaSHans Petter Selasky cl_pool_item_t pool_item;
144*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_left;
145*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_right;
146*d6b92ffaSHans Petter Selasky struct _cl_map_item *p_up;
147*d6b92ffaSHans Petter Selasky cl_map_color_t color;
148*d6b92ffaSHans Petter Selasky uint64_t key;
149*d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
150*d6b92ffaSHans Petter Selasky struct _cl_qmap *p_map;
151*d6b92ffaSHans Petter Selasky #endif
152*d6b92ffaSHans Petter Selasky } cl_map_item_t;
153*d6b92ffaSHans Petter Selasky /*
154*d6b92ffaSHans Petter Selasky * FIELDS
155*d6b92ffaSHans Petter Selasky * pool_item
156*d6b92ffaSHans Petter Selasky * Used to store the item in a doubly linked list, allowing more
157*d6b92ffaSHans Petter Selasky * efficient map traversal.
158*d6b92ffaSHans Petter Selasky *
159*d6b92ffaSHans Petter Selasky * p_left
160*d6b92ffaSHans Petter Selasky * Pointer to the map item that is a child to the left of the node.
161*d6b92ffaSHans Petter Selasky *
162*d6b92ffaSHans Petter Selasky * p_right
163*d6b92ffaSHans Petter Selasky * Pointer to the map item that is a child to the right of the node.
164*d6b92ffaSHans Petter Selasky *
165*d6b92ffaSHans Petter Selasky * p_up
166*d6b92ffaSHans Petter Selasky * Pointer to the map item that is the parent of the node.
167*d6b92ffaSHans Petter Selasky *
168*d6b92ffaSHans Petter Selasky * p_nil
169*d6b92ffaSHans Petter Selasky * Pointer to the map's NIL item, used as a terminator for leaves.
170*d6b92ffaSHans Petter Selasky * The NIL sentinel is in the cl_qmap_t structure.
171*d6b92ffaSHans Petter Selasky *
172*d6b92ffaSHans Petter Selasky * color
173*d6b92ffaSHans Petter Selasky * Indicates whether a node is red or black in the map.
174*d6b92ffaSHans Petter Selasky *
175*d6b92ffaSHans Petter Selasky * key
176*d6b92ffaSHans Petter Selasky * Value that uniquely represents a node in a map. This value is
177*d6b92ffaSHans Petter Selasky * set by calling cl_qmap_insert and can be retrieved by calling
178*d6b92ffaSHans Petter Selasky * cl_qmap_key.
179*d6b92ffaSHans Petter Selasky *
180*d6b92ffaSHans Petter Selasky * NOTES
181*d6b92ffaSHans Petter Selasky * None of the fields of this structure should be manipulated by users, as
182*d6b92ffaSHans Petter Selasky * they are crititcal to the proper operation of the map in which they
183*d6b92ffaSHans Petter Selasky * are stored.
184*d6b92ffaSHans Petter Selasky *
185*d6b92ffaSHans Petter Selasky * To allow storing items in either a quick list, a quick pool, or a quick
186*d6b92ffaSHans Petter Selasky * map, the map implementation guarantees that the map item can be safely
187*d6b92ffaSHans Petter Selasky * cast to a pool item used for storing an object in a quick pool, or cast
188*d6b92ffaSHans Petter Selasky * to a list item used for storing an object in a quick list. This removes
189*d6b92ffaSHans Petter Selasky * the need to embed a map item, a list item, and a pool item in objects
190*d6b92ffaSHans Petter Selasky * that need to be stored in a quick list, a quick pool, and a quick map.
191*d6b92ffaSHans Petter Selasky *
192*d6b92ffaSHans Petter Selasky * SEE ALSO
193*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert, cl_qmap_key, cl_pool_item_t, cl_list_item_t
194*d6b92ffaSHans Petter Selasky *********/
195*d6b92ffaSHans Petter Selasky
196*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_map_obj_t
197*d6b92ffaSHans Petter Selasky * NAME
198*d6b92ffaSHans Petter Selasky * cl_map_obj_t
199*d6b92ffaSHans Petter Selasky *
200*d6b92ffaSHans Petter Selasky * DESCRIPTION
201*d6b92ffaSHans Petter Selasky * The cl_map_obj_t structure is used to store objects in maps.
202*d6b92ffaSHans Petter Selasky *
203*d6b92ffaSHans Petter Selasky * The cl_map_obj_t structure should be treated as opaque and should
204*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions.
205*d6b92ffaSHans Petter Selasky *
206*d6b92ffaSHans Petter Selasky * SYNOPSIS
207*d6b92ffaSHans Petter Selasky */
208*d6b92ffaSHans Petter Selasky typedef struct _cl_map_obj {
209*d6b92ffaSHans Petter Selasky cl_map_item_t item;
210*d6b92ffaSHans Petter Selasky const void *p_object;
211*d6b92ffaSHans Petter Selasky } cl_map_obj_t;
212*d6b92ffaSHans Petter Selasky /*
213*d6b92ffaSHans Petter Selasky * FIELDS
214*d6b92ffaSHans Petter Selasky * item
215*d6b92ffaSHans Petter Selasky * Map item used by internally by the map to store an object.
216*d6b92ffaSHans Petter Selasky *
217*d6b92ffaSHans Petter Selasky * p_object
218*d6b92ffaSHans Petter Selasky * User defined context. Users should not access this field directly.
219*d6b92ffaSHans Petter Selasky * Use cl_qmap_set_obj and cl_qmap_obj to set and retrieve the value
220*d6b92ffaSHans Petter Selasky * of this field.
221*d6b92ffaSHans Petter Selasky *
222*d6b92ffaSHans Petter Selasky * NOTES
223*d6b92ffaSHans Petter Selasky * None of the fields of this structure should be manipulated by users, as
224*d6b92ffaSHans Petter Selasky * they are crititcal to the proper operation of the map in which they
225*d6b92ffaSHans Petter Selasky * are stored.
226*d6b92ffaSHans Petter Selasky *
227*d6b92ffaSHans Petter Selasky * Use cl_qmap_set_obj and cl_qmap_obj to set and retrieve the object
228*d6b92ffaSHans Petter Selasky * stored in a map item, respectively.
229*d6b92ffaSHans Petter Selasky *
230*d6b92ffaSHans Petter Selasky * SEE ALSO
231*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_set_obj, cl_qmap_obj, cl_map_item_t
232*d6b92ffaSHans Petter Selasky *********/
233*d6b92ffaSHans Petter Selasky
234*d6b92ffaSHans Petter Selasky /****s* Component Library: Quick Map/cl_qmap_t
235*d6b92ffaSHans Petter Selasky * NAME
236*d6b92ffaSHans Petter Selasky * cl_qmap_t
237*d6b92ffaSHans Petter Selasky *
238*d6b92ffaSHans Petter Selasky * DESCRIPTION
239*d6b92ffaSHans Petter Selasky * Quick map structure.
240*d6b92ffaSHans Petter Selasky *
241*d6b92ffaSHans Petter Selasky * The cl_qmap_t structure should be treated as opaque and should
242*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions.
243*d6b92ffaSHans Petter Selasky *
244*d6b92ffaSHans Petter Selasky * SYNOPSIS
245*d6b92ffaSHans Petter Selasky */
246*d6b92ffaSHans Petter Selasky typedef struct _cl_qmap {
247*d6b92ffaSHans Petter Selasky cl_map_item_t root;
248*d6b92ffaSHans Petter Selasky cl_map_item_t nil;
249*d6b92ffaSHans Petter Selasky cl_state_t state;
250*d6b92ffaSHans Petter Selasky size_t count;
251*d6b92ffaSHans Petter Selasky } cl_qmap_t;
252*d6b92ffaSHans Petter Selasky /*
253*d6b92ffaSHans Petter Selasky * PARAMETERS
254*d6b92ffaSHans Petter Selasky * root
255*d6b92ffaSHans Petter Selasky * Map item that serves as root of the map. The root is set up to
256*d6b92ffaSHans Petter Selasky * always have itself as parent. The left pointer is set to point
257*d6b92ffaSHans Petter Selasky * to the item at the root.
258*d6b92ffaSHans Petter Selasky *
259*d6b92ffaSHans Petter Selasky * nil
260*d6b92ffaSHans Petter Selasky * Map item that serves as terminator for all leaves, as well as
261*d6b92ffaSHans Petter Selasky * providing the list item used as quick list for storing map items
262*d6b92ffaSHans Petter Selasky * in a list for faster traversal.
263*d6b92ffaSHans Petter Selasky *
264*d6b92ffaSHans Petter Selasky * state
265*d6b92ffaSHans Petter Selasky * State of the map, used to verify that operations are permitted.
266*d6b92ffaSHans Petter Selasky *
267*d6b92ffaSHans Petter Selasky * count
268*d6b92ffaSHans Petter Selasky * Number of items in the map.
269*d6b92ffaSHans Petter Selasky *
270*d6b92ffaSHans Petter Selasky * SEE ALSO
271*d6b92ffaSHans Petter Selasky * Quick Map
272*d6b92ffaSHans Petter Selasky *********/
273*d6b92ffaSHans Petter Selasky
274*d6b92ffaSHans Petter Selasky /****d* Component Library: Quick Map/cl_pfn_qmap_apply_t
275*d6b92ffaSHans Petter Selasky * NAME
276*d6b92ffaSHans Petter Selasky * cl_pfn_qmap_apply_t
277*d6b92ffaSHans Petter Selasky *
278*d6b92ffaSHans Petter Selasky * DESCRIPTION
279*d6b92ffaSHans Petter Selasky * The cl_pfn_qmap_apply_t function type defines the prototype for
280*d6b92ffaSHans Petter Selasky * functions used to iterate items in a quick map.
281*d6b92ffaSHans Petter Selasky *
282*d6b92ffaSHans Petter Selasky * SYNOPSIS
283*d6b92ffaSHans Petter Selasky */
284*d6b92ffaSHans Petter Selasky typedef void
285*d6b92ffaSHans Petter Selasky (*cl_pfn_qmap_apply_t) (IN cl_map_item_t * const p_map_item, IN void *context);
286*d6b92ffaSHans Petter Selasky /*
287*d6b92ffaSHans Petter Selasky * PARAMETERS
288*d6b92ffaSHans Petter Selasky * p_map_item
289*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_item_t structure.
290*d6b92ffaSHans Petter Selasky *
291*d6b92ffaSHans Petter Selasky * context
292*d6b92ffaSHans Petter Selasky * [in] Value passed to the callback function.
293*d6b92ffaSHans Petter Selasky *
294*d6b92ffaSHans Petter Selasky * RETURN VALUE
295*d6b92ffaSHans Petter Selasky * This function does not return a value.
296*d6b92ffaSHans Petter Selasky *
297*d6b92ffaSHans Petter Selasky * NOTES
298*d6b92ffaSHans Petter Selasky * This function type is provided as function prototype reference for the
299*d6b92ffaSHans Petter Selasky * function provided by users as a parameter to the cl_qmap_apply_func
300*d6b92ffaSHans Petter Selasky * function.
301*d6b92ffaSHans Petter Selasky *
302*d6b92ffaSHans Petter Selasky * SEE ALSO
303*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_apply_func
304*d6b92ffaSHans Petter Selasky *********/
305*d6b92ffaSHans Petter Selasky
306*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_count
307*d6b92ffaSHans Petter Selasky * NAME
308*d6b92ffaSHans Petter Selasky * cl_qmap_count
309*d6b92ffaSHans Petter Selasky *
310*d6b92ffaSHans Petter Selasky * DESCRIPTION
311*d6b92ffaSHans Petter Selasky * The cl_qmap_count function returns the number of items stored
312*d6b92ffaSHans Petter Selasky * in a quick map.
313*d6b92ffaSHans Petter Selasky *
314*d6b92ffaSHans Petter Selasky * SYNOPSIS
315*d6b92ffaSHans Petter Selasky */
cl_qmap_count(IN const cl_qmap_t * const p_map)316*d6b92ffaSHans Petter Selasky static inline uint32_t cl_qmap_count(IN const cl_qmap_t * const p_map)
317*d6b92ffaSHans Petter Selasky {
318*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
319*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
320*d6b92ffaSHans Petter Selasky return ((uint32_t) p_map->count);
321*d6b92ffaSHans Petter Selasky }
322*d6b92ffaSHans Petter Selasky
323*d6b92ffaSHans Petter Selasky /*
324*d6b92ffaSHans Petter Selasky * PARAMETERS
325*d6b92ffaSHans Petter Selasky * p_map
326*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item count to return.
327*d6b92ffaSHans Petter Selasky *
328*d6b92ffaSHans Petter Selasky * RETURN VALUE
329*d6b92ffaSHans Petter Selasky * Returns the number of items stored in the map.
330*d6b92ffaSHans Petter Selasky *
331*d6b92ffaSHans Petter Selasky * SEE ALSO
332*d6b92ffaSHans Petter Selasky * Quick Map, cl_is_qmap_empty
333*d6b92ffaSHans Petter Selasky *********/
334*d6b92ffaSHans Petter Selasky
335*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_is_qmap_empty
336*d6b92ffaSHans Petter Selasky * NAME
337*d6b92ffaSHans Petter Selasky * cl_is_qmap_empty
338*d6b92ffaSHans Petter Selasky *
339*d6b92ffaSHans Petter Selasky * DESCRIPTION
340*d6b92ffaSHans Petter Selasky * The cl_is_qmap_empty function returns whether a quick map is empty.
341*d6b92ffaSHans Petter Selasky *
342*d6b92ffaSHans Petter Selasky * SYNOPSIS
343*d6b92ffaSHans Petter Selasky */
cl_is_qmap_empty(IN const cl_qmap_t * const p_map)344*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_qmap_empty(IN const cl_qmap_t * const p_map)
345*d6b92ffaSHans Petter Selasky {
346*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
347*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
348*d6b92ffaSHans Petter Selasky
349*d6b92ffaSHans Petter Selasky return (p_map->count == 0);
350*d6b92ffaSHans Petter Selasky }
351*d6b92ffaSHans Petter Selasky
352*d6b92ffaSHans Petter Selasky /*
353*d6b92ffaSHans Petter Selasky * PARAMETERS
354*d6b92ffaSHans Petter Selasky * p_map
355*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to test for emptiness.
356*d6b92ffaSHans Petter Selasky *
357*d6b92ffaSHans Petter Selasky * RETURN VALUES
358*d6b92ffaSHans Petter Selasky * TRUE if the quick map is empty.
359*d6b92ffaSHans Petter Selasky *
360*d6b92ffaSHans Petter Selasky * FALSE otherwise.
361*d6b92ffaSHans Petter Selasky *
362*d6b92ffaSHans Petter Selasky * SEE ALSO
363*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_count, cl_qmap_remove_all
364*d6b92ffaSHans Petter Selasky *********/
365*d6b92ffaSHans Petter Selasky
366*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_set_obj
367*d6b92ffaSHans Petter Selasky * NAME
368*d6b92ffaSHans Petter Selasky * cl_qmap_set_obj
369*d6b92ffaSHans Petter Selasky *
370*d6b92ffaSHans Petter Selasky * DESCRIPTION
371*d6b92ffaSHans Petter Selasky * The cl_qmap_set_obj function sets the object stored in a map object.
372*d6b92ffaSHans Petter Selasky *
373*d6b92ffaSHans Petter Selasky * SYNOPSIS
374*d6b92ffaSHans Petter Selasky */
375*d6b92ffaSHans Petter Selasky static inline void
cl_qmap_set_obj(IN cl_map_obj_t * const p_map_obj,IN const void * const p_object)376*d6b92ffaSHans Petter Selasky cl_qmap_set_obj(IN cl_map_obj_t * const p_map_obj,
377*d6b92ffaSHans Petter Selasky IN const void *const p_object)
378*d6b92ffaSHans Petter Selasky {
379*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map_obj);
380*d6b92ffaSHans Petter Selasky p_map_obj->p_object = p_object;
381*d6b92ffaSHans Petter Selasky }
382*d6b92ffaSHans Petter Selasky
383*d6b92ffaSHans Petter Selasky /*
384*d6b92ffaSHans Petter Selasky * PARAMETERS
385*d6b92ffaSHans Petter Selasky * p_map_obj
386*d6b92ffaSHans Petter Selasky * [in] Pointer to a map object stucture whose object pointer
387*d6b92ffaSHans Petter Selasky * is to be set.
388*d6b92ffaSHans Petter Selasky *
389*d6b92ffaSHans Petter Selasky * p_object
390*d6b92ffaSHans Petter Selasky * [in] User defined context.
391*d6b92ffaSHans Petter Selasky *
392*d6b92ffaSHans Petter Selasky * RETURN VALUE
393*d6b92ffaSHans Petter Selasky * This function does not return a value.
394*d6b92ffaSHans Petter Selasky *
395*d6b92ffaSHans Petter Selasky * SEE ALSO
396*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_obj
397*d6b92ffaSHans Petter Selasky *********/
398*d6b92ffaSHans Petter Selasky
399*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_obj
400*d6b92ffaSHans Petter Selasky * NAME
401*d6b92ffaSHans Petter Selasky * cl_qmap_obj
402*d6b92ffaSHans Petter Selasky *
403*d6b92ffaSHans Petter Selasky * DESCRIPTION
404*d6b92ffaSHans Petter Selasky * The cl_qmap_obj function returns the object stored in a map object.
405*d6b92ffaSHans Petter Selasky *
406*d6b92ffaSHans Petter Selasky * SYNOPSIS
407*d6b92ffaSHans Petter Selasky */
cl_qmap_obj(IN const cl_map_obj_t * const p_map_obj)408*d6b92ffaSHans Petter Selasky static inline void *cl_qmap_obj(IN const cl_map_obj_t * const p_map_obj)
409*d6b92ffaSHans Petter Selasky {
410*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map_obj);
411*d6b92ffaSHans Petter Selasky return ((void *)p_map_obj->p_object);
412*d6b92ffaSHans Petter Selasky }
413*d6b92ffaSHans Petter Selasky
414*d6b92ffaSHans Petter Selasky /*
415*d6b92ffaSHans Petter Selasky * PARAMETERS
416*d6b92ffaSHans Petter Selasky * p_map_obj
417*d6b92ffaSHans Petter Selasky * [in] Pointer to a map object stucture whose object pointer to return.
418*d6b92ffaSHans Petter Selasky *
419*d6b92ffaSHans Petter Selasky * RETURN VALUE
420*d6b92ffaSHans Petter Selasky * Returns the value of the object pointer stored in the map object.
421*d6b92ffaSHans Petter Selasky *
422*d6b92ffaSHans Petter Selasky * SEE ALSO
423*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_set_obj
424*d6b92ffaSHans Petter Selasky *********/
425*d6b92ffaSHans Petter Selasky
426*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_key
427*d6b92ffaSHans Petter Selasky * NAME
428*d6b92ffaSHans Petter Selasky * cl_qmap_key
429*d6b92ffaSHans Petter Selasky *
430*d6b92ffaSHans Petter Selasky * DESCRIPTION
431*d6b92ffaSHans Petter Selasky * The cl_qmap_key function retrieves the key value of a map item.
432*d6b92ffaSHans Petter Selasky *
433*d6b92ffaSHans Petter Selasky * SYNOPSIS
434*d6b92ffaSHans Petter Selasky */
cl_qmap_key(IN const cl_map_item_t * const p_item)435*d6b92ffaSHans Petter Selasky static inline uint64_t cl_qmap_key(IN const cl_map_item_t * const p_item)
436*d6b92ffaSHans Petter Selasky {
437*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item);
438*d6b92ffaSHans Petter Selasky return (p_item->key);
439*d6b92ffaSHans Petter Selasky }
440*d6b92ffaSHans Petter Selasky
441*d6b92ffaSHans Petter Selasky /*
442*d6b92ffaSHans Petter Selasky * PARAMETERS
443*d6b92ffaSHans Petter Selasky * p_item
444*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose key value to return.
445*d6b92ffaSHans Petter Selasky *
446*d6b92ffaSHans Petter Selasky * RETURN VALUE
447*d6b92ffaSHans Petter Selasky * Returns the 64-bit key value for the specified map item.
448*d6b92ffaSHans Petter Selasky *
449*d6b92ffaSHans Petter Selasky * NOTES
450*d6b92ffaSHans Petter Selasky * The key value is set in a call to cl_qmap_insert.
451*d6b92ffaSHans Petter Selasky *
452*d6b92ffaSHans Petter Selasky * SEE ALSO
453*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert
454*d6b92ffaSHans Petter Selasky *********/
455*d6b92ffaSHans Petter Selasky
456*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_init
457*d6b92ffaSHans Petter Selasky * NAME
458*d6b92ffaSHans Petter Selasky * cl_qmap_init
459*d6b92ffaSHans Petter Selasky *
460*d6b92ffaSHans Petter Selasky * DESCRIPTION
461*d6b92ffaSHans Petter Selasky * The cl_qmap_init function initialized a quick map for use.
462*d6b92ffaSHans Petter Selasky *
463*d6b92ffaSHans Petter Selasky * SYNOPSIS
464*d6b92ffaSHans Petter Selasky */
465*d6b92ffaSHans Petter Selasky void cl_qmap_init(IN cl_qmap_t * const p_map);
466*d6b92ffaSHans Petter Selasky /*
467*d6b92ffaSHans Petter Selasky * PARAMETERS
468*d6b92ffaSHans Petter Selasky * p_map
469*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to initialize.
470*d6b92ffaSHans Petter Selasky *
471*d6b92ffaSHans Petter Selasky * RETURN VALUES
472*d6b92ffaSHans Petter Selasky * This function does not return a value.
473*d6b92ffaSHans Petter Selasky *
474*d6b92ffaSHans Petter Selasky * NOTES
475*d6b92ffaSHans Petter Selasky * Allows calling quick map manipulation functions.
476*d6b92ffaSHans Petter Selasky *
477*d6b92ffaSHans Petter Selasky * SEE ALSO
478*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_insert, cl_qmap_remove
479*d6b92ffaSHans Petter Selasky *********/
480*d6b92ffaSHans Petter Selasky
481*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_end
482*d6b92ffaSHans Petter Selasky * NAME
483*d6b92ffaSHans Petter Selasky * cl_qmap_end
484*d6b92ffaSHans Petter Selasky *
485*d6b92ffaSHans Petter Selasky * DESCRIPTION
486*d6b92ffaSHans Petter Selasky * The cl_qmap_end function returns the end of a quick map.
487*d6b92ffaSHans Petter Selasky *
488*d6b92ffaSHans Petter Selasky * SYNOPSIS
489*d6b92ffaSHans Petter Selasky */
cl_qmap_end(IN const cl_qmap_t * const p_map)490*d6b92ffaSHans Petter Selasky static inline const cl_map_item_t *cl_qmap_end(IN const cl_qmap_t * const p_map)
491*d6b92ffaSHans Petter Selasky {
492*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
493*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
494*d6b92ffaSHans Petter Selasky /* Nil is the end of the map. */
495*d6b92ffaSHans Petter Selasky return (&p_map->nil);
496*d6b92ffaSHans Petter Selasky }
497*d6b92ffaSHans Petter Selasky
498*d6b92ffaSHans Petter Selasky /*
499*d6b92ffaSHans Petter Selasky * PARAMETERS
500*d6b92ffaSHans Petter Selasky * p_map
501*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose end to return.
502*d6b92ffaSHans Petter Selasky *
503*d6b92ffaSHans Petter Selasky * RETURN VALUE
504*d6b92ffaSHans Petter Selasky * Pointer to the end of the map.
505*d6b92ffaSHans Petter Selasky *
506*d6b92ffaSHans Petter Selasky * NOTES
507*d6b92ffaSHans Petter Selasky * cl_qmap_end is useful for determining the validity of map items returned
508*d6b92ffaSHans Petter Selasky * by cl_qmap_head, cl_qmap_tail, cl_qmap_next, or cl_qmap_prev. If the
509*d6b92ffaSHans Petter Selasky * map item pointer returned by any of these functions compares to the end,
510*d6b92ffaSHans Petter Selasky * the end of the map was encoutered.
511*d6b92ffaSHans Petter Selasky * When using cl_qmap_head or cl_qmap_tail, this condition indicates that
512*d6b92ffaSHans Petter Selasky * the map is empty.
513*d6b92ffaSHans Petter Selasky *
514*d6b92ffaSHans Petter Selasky * SEE ALSO
515*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_prev
516*d6b92ffaSHans Petter Selasky *********/
517*d6b92ffaSHans Petter Selasky
518*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_head
519*d6b92ffaSHans Petter Selasky * NAME
520*d6b92ffaSHans Petter Selasky * cl_qmap_head
521*d6b92ffaSHans Petter Selasky *
522*d6b92ffaSHans Petter Selasky * DESCRIPTION
523*d6b92ffaSHans Petter Selasky * The cl_qmap_head function returns the map item with the lowest key
524*d6b92ffaSHans Petter Selasky * value stored in a quick map.
525*d6b92ffaSHans Petter Selasky *
526*d6b92ffaSHans Petter Selasky * SYNOPSIS
527*d6b92ffaSHans Petter Selasky */
cl_qmap_head(IN const cl_qmap_t * const p_map)528*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_head(IN const cl_qmap_t * const p_map)
529*d6b92ffaSHans Petter Selasky {
530*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
531*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
532*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_map->nil.pool_item.list_item.p_next);
533*d6b92ffaSHans Petter Selasky }
534*d6b92ffaSHans Petter Selasky
535*d6b92ffaSHans Petter Selasky /*
536*d6b92ffaSHans Petter Selasky * PARAMETERS
537*d6b92ffaSHans Petter Selasky * p_map
538*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item with the lowest
539*d6b92ffaSHans Petter Selasky * key is returned.
540*d6b92ffaSHans Petter Selasky *
541*d6b92ffaSHans Petter Selasky * RETURN VALUES
542*d6b92ffaSHans Petter Selasky * Pointer to the map item with the lowest key in the quick map.
543*d6b92ffaSHans Petter Selasky *
544*d6b92ffaSHans Petter Selasky * Pointer to the map end if the quick map was empty.
545*d6b92ffaSHans Petter Selasky *
546*d6b92ffaSHans Petter Selasky * NOTES
547*d6b92ffaSHans Petter Selasky * cl_qmap_head does not remove the item from the map.
548*d6b92ffaSHans Petter Selasky *
549*d6b92ffaSHans Petter Selasky * SEE ALSO
550*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_tail, cl_qmap_next, cl_qmap_prev, cl_qmap_end,
551*d6b92ffaSHans Petter Selasky * cl_qmap_item_t
552*d6b92ffaSHans Petter Selasky *********/
553*d6b92ffaSHans Petter Selasky
554*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_tail
555*d6b92ffaSHans Petter Selasky * NAME
556*d6b92ffaSHans Petter Selasky * cl_qmap_tail
557*d6b92ffaSHans Petter Selasky *
558*d6b92ffaSHans Petter Selasky * DESCRIPTION
559*d6b92ffaSHans Petter Selasky * The cl_qmap_tail function returns the map item with the highest key
560*d6b92ffaSHans Petter Selasky * value stored in a quick map.
561*d6b92ffaSHans Petter Selasky *
562*d6b92ffaSHans Petter Selasky * SYNOPSIS
563*d6b92ffaSHans Petter Selasky */
cl_qmap_tail(IN const cl_qmap_t * const p_map)564*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_tail(IN const cl_qmap_t * const p_map)
565*d6b92ffaSHans Petter Selasky {
566*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
567*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
568*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_map->nil.pool_item.list_item.p_prev);
569*d6b92ffaSHans Petter Selasky }
570*d6b92ffaSHans Petter Selasky
571*d6b92ffaSHans Petter Selasky /*
572*d6b92ffaSHans Petter Selasky * PARAMETERS
573*d6b92ffaSHans Petter Selasky * p_map
574*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure whose item with the
575*d6b92ffaSHans Petter Selasky * highest key is returned.
576*d6b92ffaSHans Petter Selasky *
577*d6b92ffaSHans Petter Selasky * RETURN VALUES
578*d6b92ffaSHans Petter Selasky * Pointer to the map item with the highest key in the quick map.
579*d6b92ffaSHans Petter Selasky *
580*d6b92ffaSHans Petter Selasky * Pointer to the map end if the quick map was empty.
581*d6b92ffaSHans Petter Selasky *
582*d6b92ffaSHans Petter Selasky * NOTES
583*d6b92ffaSHans Petter Selasky * cl_qmap_end does not remove the item from the map.
584*d6b92ffaSHans Petter Selasky *
585*d6b92ffaSHans Petter Selasky * SEE ALSO
586*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_next, cl_qmap_prev, cl_qmap_end,
587*d6b92ffaSHans Petter Selasky * cl_qmap_item_t
588*d6b92ffaSHans Petter Selasky *********/
589*d6b92ffaSHans Petter Selasky
590*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_next
591*d6b92ffaSHans Petter Selasky * NAME
592*d6b92ffaSHans Petter Selasky * cl_qmap_next
593*d6b92ffaSHans Petter Selasky *
594*d6b92ffaSHans Petter Selasky * DESCRIPTION
595*d6b92ffaSHans Petter Selasky * The cl_qmap_next function returns the map item with the next higher
596*d6b92ffaSHans Petter Selasky * key value than a specified map item.
597*d6b92ffaSHans Petter Selasky *
598*d6b92ffaSHans Petter Selasky * SYNOPSIS
599*d6b92ffaSHans Petter Selasky */
cl_qmap_next(IN const cl_map_item_t * const p_item)600*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_next(IN const cl_map_item_t * const p_item)
601*d6b92ffaSHans Petter Selasky {
602*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item);
603*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_item->pool_item.list_item.p_next);
604*d6b92ffaSHans Petter Selasky }
605*d6b92ffaSHans Petter Selasky
606*d6b92ffaSHans Petter Selasky /*
607*d6b92ffaSHans Petter Selasky * PARAMETERS
608*d6b92ffaSHans Petter Selasky * p_item
609*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose successor to return.
610*d6b92ffaSHans Petter Selasky *
611*d6b92ffaSHans Petter Selasky * RETURN VALUES
612*d6b92ffaSHans Petter Selasky * Pointer to the map item with the next higher key value in a quick map.
613*d6b92ffaSHans Petter Selasky *
614*d6b92ffaSHans Petter Selasky * Pointer to the map end if the specified item was the last item in
615*d6b92ffaSHans Petter Selasky * the quick map.
616*d6b92ffaSHans Petter Selasky *
617*d6b92ffaSHans Petter Selasky * SEE ALSO
618*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_prev, cl_qmap_end,
619*d6b92ffaSHans Petter Selasky * cl_map_item_t
620*d6b92ffaSHans Petter Selasky *********/
621*d6b92ffaSHans Petter Selasky
622*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_prev
623*d6b92ffaSHans Petter Selasky * NAME
624*d6b92ffaSHans Petter Selasky * cl_qmap_prev
625*d6b92ffaSHans Petter Selasky *
626*d6b92ffaSHans Petter Selasky * DESCRIPTION
627*d6b92ffaSHans Petter Selasky * The cl_qmap_prev function returns the map item with the next lower
628*d6b92ffaSHans Petter Selasky * key value than a precified map item.
629*d6b92ffaSHans Petter Selasky *
630*d6b92ffaSHans Petter Selasky * SYNOPSIS
631*d6b92ffaSHans Petter Selasky */
cl_qmap_prev(IN const cl_map_item_t * const p_item)632*d6b92ffaSHans Petter Selasky static inline cl_map_item_t *cl_qmap_prev(IN const cl_map_item_t * const p_item)
633*d6b92ffaSHans Petter Selasky {
634*d6b92ffaSHans Petter Selasky CL_ASSERT(p_item);
635*d6b92ffaSHans Petter Selasky return ((cl_map_item_t *) p_item->pool_item.list_item.p_prev);
636*d6b92ffaSHans Petter Selasky }
637*d6b92ffaSHans Petter Selasky
638*d6b92ffaSHans Petter Selasky /*
639*d6b92ffaSHans Petter Selasky * PARAMETERS
640*d6b92ffaSHans Petter Selasky * p_item
641*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item whose predecessor to return.
642*d6b92ffaSHans Petter Selasky *
643*d6b92ffaSHans Petter Selasky * RETURN VALUES
644*d6b92ffaSHans Petter Selasky * Pointer to the map item with the next lower key value in a quick map.
645*d6b92ffaSHans Petter Selasky *
646*d6b92ffaSHans Petter Selasky * Pointer to the map end if the specifid item was the first item in
647*d6b92ffaSHans Petter Selasky * the quick map.
648*d6b92ffaSHans Petter Selasky *
649*d6b92ffaSHans Petter Selasky * SEE ALSO
650*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_end,
651*d6b92ffaSHans Petter Selasky * cl_map_item_t
652*d6b92ffaSHans Petter Selasky *********/
653*d6b92ffaSHans Petter Selasky
654*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_insert
655*d6b92ffaSHans Petter Selasky * NAME
656*d6b92ffaSHans Petter Selasky * cl_qmap_insert
657*d6b92ffaSHans Petter Selasky *
658*d6b92ffaSHans Petter Selasky * DESCRIPTION
659*d6b92ffaSHans Petter Selasky * The cl_qmap_insert function inserts a map item into a quick map.
660*d6b92ffaSHans Petter Selasky * NOTE: Only if such a key does not alerady exist in the map !!!!
661*d6b92ffaSHans Petter Selasky *
662*d6b92ffaSHans Petter Selasky * SYNOPSIS
663*d6b92ffaSHans Petter Selasky */
664*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_insert(IN cl_qmap_t * const p_map,
665*d6b92ffaSHans Petter Selasky IN const uint64_t key,
666*d6b92ffaSHans Petter Selasky IN cl_map_item_t * const p_item);
667*d6b92ffaSHans Petter Selasky /*
668*d6b92ffaSHans Petter Selasky * PARAMETERS
669*d6b92ffaSHans Petter Selasky * p_map
670*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure into which to add the item.
671*d6b92ffaSHans Petter Selasky *
672*d6b92ffaSHans Petter Selasky * key
673*d6b92ffaSHans Petter Selasky * [in] Value to assign to the item.
674*d6b92ffaSHans Petter Selasky *
675*d6b92ffaSHans Petter Selasky * p_item
676*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_item_t stucture to insert into the quick map.
677*d6b92ffaSHans Petter Selasky *
678*d6b92ffaSHans Petter Selasky * RETURN VALUE
679*d6b92ffaSHans Petter Selasky * Pointer to the item in the map with the specified key. If insertion
680*d6b92ffaSHans Petter Selasky * was successful, this is the pointer to the item. If an item with the
681*d6b92ffaSHans Petter Selasky * specified key already exists in the map, the pointer to that item is
682*d6b92ffaSHans Petter Selasky * returned - but the new key is NOT inserted...
683*d6b92ffaSHans Petter Selasky *
684*d6b92ffaSHans Petter Selasky * NOTES
685*d6b92ffaSHans Petter Selasky * Insertion operations may cause the quick map to rebalance.
686*d6b92ffaSHans Petter Selasky *
687*d6b92ffaSHans Petter Selasky * SEE ALSO
688*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_map_item_t
689*d6b92ffaSHans Petter Selasky *********/
690*d6b92ffaSHans Petter Selasky
691*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_get
692*d6b92ffaSHans Petter Selasky * NAME
693*d6b92ffaSHans Petter Selasky * cl_qmap_get
694*d6b92ffaSHans Petter Selasky *
695*d6b92ffaSHans Petter Selasky * DESCRIPTION
696*d6b92ffaSHans Petter Selasky * The cl_qmap_get function returns the map item associated with a key.
697*d6b92ffaSHans Petter Selasky *
698*d6b92ffaSHans Petter Selasky * SYNOPSIS
699*d6b92ffaSHans Petter Selasky */
700*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_get(IN const cl_qmap_t * const p_map,
701*d6b92ffaSHans Petter Selasky IN const uint64_t key);
702*d6b92ffaSHans Petter Selasky /*
703*d6b92ffaSHans Petter Selasky * PARAMETERS
704*d6b92ffaSHans Petter Selasky * p_map
705*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to retrieve the
706*d6b92ffaSHans Petter Selasky * item with the specified key.
707*d6b92ffaSHans Petter Selasky *
708*d6b92ffaSHans Petter Selasky * key
709*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired map item.
710*d6b92ffaSHans Petter Selasky *
711*d6b92ffaSHans Petter Selasky * RETURN VALUES
712*d6b92ffaSHans Petter Selasky * Pointer to the map item with the desired key value.
713*d6b92ffaSHans Petter Selasky *
714*d6b92ffaSHans Petter Selasky * Pointer to the map end if there was no item with the desired key value
715*d6b92ffaSHans Petter Selasky * stored in the quick map.
716*d6b92ffaSHans Petter Selasky *
717*d6b92ffaSHans Petter Selasky * NOTES
718*d6b92ffaSHans Petter Selasky * cl_qmap_get does not remove the item from the quick map.
719*d6b92ffaSHans Petter Selasky *
720*d6b92ffaSHans Petter Selasky * SEE ALSO
721*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_get_next, cl_qmap_remove
722*d6b92ffaSHans Petter Selasky *********/
723*d6b92ffaSHans Petter Selasky
724*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_get_next
725*d6b92ffaSHans Petter Selasky * NAME
726*d6b92ffaSHans Petter Selasky * cl_qmap_get_next
727*d6b92ffaSHans Petter Selasky *
728*d6b92ffaSHans Petter Selasky * DESCRIPTION
729*d6b92ffaSHans Petter Selasky * The cl_qmap_get_next function returns the first map item associated with a
730*d6b92ffaSHans Petter Selasky * key > the key specified.
731*d6b92ffaSHans Petter Selasky *
732*d6b92ffaSHans Petter Selasky * SYNOPSIS
733*d6b92ffaSHans Petter Selasky */
734*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_get_next(IN const cl_qmap_t * const p_map,
735*d6b92ffaSHans Petter Selasky IN const uint64_t key);
736*d6b92ffaSHans Petter Selasky /*
737*d6b92ffaSHans Petter Selasky * PARAMETERS
738*d6b92ffaSHans Petter Selasky * p_map
739*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to retrieve the
740*d6b92ffaSHans Petter Selasky * first item with a key > the specified key.
741*d6b92ffaSHans Petter Selasky *
742*d6b92ffaSHans Petter Selasky * key
743*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired map item.
744*d6b92ffaSHans Petter Selasky *
745*d6b92ffaSHans Petter Selasky * RETURN VALUES
746*d6b92ffaSHans Petter Selasky * Pointer to the first map item with a key > the desired key value.
747*d6b92ffaSHans Petter Selasky *
748*d6b92ffaSHans Petter Selasky * Pointer to the map end if there was no item with a key > the desired key
749*d6b92ffaSHans Petter Selasky * value stored in the quick map.
750*d6b92ffaSHans Petter Selasky *
751*d6b92ffaSHans Petter Selasky * NOTES
752*d6b92ffaSHans Petter Selasky * cl_qmap_get_next does not remove the item from the quick map.
753*d6b92ffaSHans Petter Selasky *
754*d6b92ffaSHans Petter Selasky * SEE ALSO
755*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_get, cl_qmap_remove
756*d6b92ffaSHans Petter Selasky *********/
757*d6b92ffaSHans Petter Selasky
758*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove_item
759*d6b92ffaSHans Petter Selasky * NAME
760*d6b92ffaSHans Petter Selasky * cl_qmap_remove_item
761*d6b92ffaSHans Petter Selasky *
762*d6b92ffaSHans Petter Selasky * DESCRIPTION
763*d6b92ffaSHans Petter Selasky * The cl_qmap_remove_item function removes the specified map item
764*d6b92ffaSHans Petter Selasky * from a quick map.
765*d6b92ffaSHans Petter Selasky *
766*d6b92ffaSHans Petter Selasky * SYNOPSIS
767*d6b92ffaSHans Petter Selasky */
768*d6b92ffaSHans Petter Selasky void
769*d6b92ffaSHans Petter Selasky cl_qmap_remove_item(IN cl_qmap_t * const p_map,
770*d6b92ffaSHans Petter Selasky IN cl_map_item_t * const p_item);
771*d6b92ffaSHans Petter Selasky /*
772*d6b92ffaSHans Petter Selasky * PARAMETERS
773*d6b92ffaSHans Petter Selasky * p_item
774*d6b92ffaSHans Petter Selasky * [in] Pointer to a map item to remove from its quick map.
775*d6b92ffaSHans Petter Selasky *
776*d6b92ffaSHans Petter Selasky * RETURN VALUES
777*d6b92ffaSHans Petter Selasky * This function does not return a value.
778*d6b92ffaSHans Petter Selasky *
779*d6b92ffaSHans Petter Selasky * In a debug build, cl_qmap_remove_item asserts that the item being removed
780*d6b92ffaSHans Petter Selasky * is in the specified map.
781*d6b92ffaSHans Petter Selasky *
782*d6b92ffaSHans Petter Selasky * NOTES
783*d6b92ffaSHans Petter Selasky * Removes the map item pointed to by p_item from its quick map.
784*d6b92ffaSHans Petter Selasky *
785*d6b92ffaSHans Petter Selasky * SEE ALSO
786*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_qmap_remove_all, cl_qmap_insert
787*d6b92ffaSHans Petter Selasky *********/
788*d6b92ffaSHans Petter Selasky
789*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove
790*d6b92ffaSHans Petter Selasky * NAME
791*d6b92ffaSHans Petter Selasky * cl_qmap_remove
792*d6b92ffaSHans Petter Selasky *
793*d6b92ffaSHans Petter Selasky * DESCRIPTION
794*d6b92ffaSHans Petter Selasky * The cl_qmap_remove function removes the map item with the specified key
795*d6b92ffaSHans Petter Selasky * from a quick map.
796*d6b92ffaSHans Petter Selasky *
797*d6b92ffaSHans Petter Selasky * SYNOPSIS
798*d6b92ffaSHans Petter Selasky */
799*d6b92ffaSHans Petter Selasky cl_map_item_t *cl_qmap_remove(IN cl_qmap_t * const p_map,
800*d6b92ffaSHans Petter Selasky IN const uint64_t key);
801*d6b92ffaSHans Petter Selasky /*
802*d6b92ffaSHans Petter Selasky * PARAMETERS
803*d6b92ffaSHans Petter Selasky * p_map
804*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure from which to remove the item
805*d6b92ffaSHans Petter Selasky * with the specified key.
806*d6b92ffaSHans Petter Selasky *
807*d6b92ffaSHans Petter Selasky * key
808*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the map item to remove.
809*d6b92ffaSHans Petter Selasky *
810*d6b92ffaSHans Petter Selasky * RETURN VALUES
811*d6b92ffaSHans Petter Selasky * Pointer to the removed map item if it was found.
812*d6b92ffaSHans Petter Selasky *
813*d6b92ffaSHans Petter Selasky * Pointer to the map end if no item with the specified key exists in the
814*d6b92ffaSHans Petter Selasky * quick map.
815*d6b92ffaSHans Petter Selasky *
816*d6b92ffaSHans Petter Selasky * SEE ALSO
817*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove_item, cl_qmap_remove_all, cl_qmap_insert
818*d6b92ffaSHans Petter Selasky *********/
819*d6b92ffaSHans Petter Selasky
820*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_remove_all
821*d6b92ffaSHans Petter Selasky * NAME
822*d6b92ffaSHans Petter Selasky * cl_qmap_remove_all
823*d6b92ffaSHans Petter Selasky *
824*d6b92ffaSHans Petter Selasky * DESCRIPTION
825*d6b92ffaSHans Petter Selasky * The cl_qmap_remove_all function removes all items in a quick map,
826*d6b92ffaSHans Petter Selasky * leaving it empty.
827*d6b92ffaSHans Petter Selasky *
828*d6b92ffaSHans Petter Selasky * SYNOPSIS
829*d6b92ffaSHans Petter Selasky */
cl_qmap_remove_all(IN cl_qmap_t * const p_map)830*d6b92ffaSHans Petter Selasky static inline void cl_qmap_remove_all(IN cl_qmap_t * const p_map)
831*d6b92ffaSHans Petter Selasky {
832*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
833*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map->state == CL_INITIALIZED);
834*d6b92ffaSHans Petter Selasky
835*d6b92ffaSHans Petter Selasky p_map->root.p_left = &p_map->nil;
836*d6b92ffaSHans Petter Selasky p_map->nil.pool_item.list_item.p_next = &p_map->nil.pool_item.list_item;
837*d6b92ffaSHans Petter Selasky p_map->nil.pool_item.list_item.p_prev = &p_map->nil.pool_item.list_item;
838*d6b92ffaSHans Petter Selasky p_map->count = 0;
839*d6b92ffaSHans Petter Selasky }
840*d6b92ffaSHans Petter Selasky
841*d6b92ffaSHans Petter Selasky /*
842*d6b92ffaSHans Petter Selasky * PARAMETERS
843*d6b92ffaSHans Petter Selasky * p_map
844*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure to empty.
845*d6b92ffaSHans Petter Selasky *
846*d6b92ffaSHans Petter Selasky * RETURN VALUES
847*d6b92ffaSHans Petter Selasky * This function does not return a value.
848*d6b92ffaSHans Petter Selasky *
849*d6b92ffaSHans Petter Selasky * SEE ALSO
850*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_remove, cl_qmap_remove_item
851*d6b92ffaSHans Petter Selasky *********/
852*d6b92ffaSHans Petter Selasky
853*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_merge
854*d6b92ffaSHans Petter Selasky * NAME
855*d6b92ffaSHans Petter Selasky * cl_qmap_merge
856*d6b92ffaSHans Petter Selasky *
857*d6b92ffaSHans Petter Selasky * DESCRIPTION
858*d6b92ffaSHans Petter Selasky * The cl_qmap_merge function moves all items from one map to another,
859*d6b92ffaSHans Petter Selasky * excluding duplicates.
860*d6b92ffaSHans Petter Selasky *
861*d6b92ffaSHans Petter Selasky * SYNOPSIS
862*d6b92ffaSHans Petter Selasky */
863*d6b92ffaSHans Petter Selasky void
864*d6b92ffaSHans Petter Selasky cl_qmap_merge(OUT cl_qmap_t * const p_dest_map,
865*d6b92ffaSHans Petter Selasky IN OUT cl_qmap_t * const p_src_map);
866*d6b92ffaSHans Petter Selasky /*
867*d6b92ffaSHans Petter Selasky * PARAMETERS
868*d6b92ffaSHans Petter Selasky * p_dest_map
869*d6b92ffaSHans Petter Selasky * [out] Pointer to a cl_qmap_t structure to which items should be added.
870*d6b92ffaSHans Petter Selasky *
871*d6b92ffaSHans Petter Selasky * p_src_map
872*d6b92ffaSHans Petter Selasky * [in/out] Pointer to a cl_qmap_t structure whose items to add
873*d6b92ffaSHans Petter Selasky * to p_dest_map.
874*d6b92ffaSHans Petter Selasky *
875*d6b92ffaSHans Petter Selasky * RETURN VALUES
876*d6b92ffaSHans Petter Selasky * This function does not return a value.
877*d6b92ffaSHans Petter Selasky *
878*d6b92ffaSHans Petter Selasky * NOTES
879*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys only.
880*d6b92ffaSHans Petter Selasky *
881*d6b92ffaSHans Petter Selasky * Upon return from cl_qmap_merge, the quick map referenced by p_src_map
882*d6b92ffaSHans Petter Selasky * contains all duplicate items.
883*d6b92ffaSHans Petter Selasky *
884*d6b92ffaSHans Petter Selasky * SEE ALSO
885*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_delta
886*d6b92ffaSHans Petter Selasky *********/
887*d6b92ffaSHans Petter Selasky
888*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_delta
889*d6b92ffaSHans Petter Selasky * NAME
890*d6b92ffaSHans Petter Selasky * cl_qmap_delta
891*d6b92ffaSHans Petter Selasky *
892*d6b92ffaSHans Petter Selasky * DESCRIPTION
893*d6b92ffaSHans Petter Selasky * The cl_qmap_delta function computes the differences between two maps.
894*d6b92ffaSHans Petter Selasky *
895*d6b92ffaSHans Petter Selasky * SYNOPSIS
896*d6b92ffaSHans Petter Selasky */
897*d6b92ffaSHans Petter Selasky void
898*d6b92ffaSHans Petter Selasky cl_qmap_delta(IN OUT cl_qmap_t * const p_map1,
899*d6b92ffaSHans Petter Selasky IN OUT cl_qmap_t * const p_map2,
900*d6b92ffaSHans Petter Selasky OUT cl_qmap_t * const p_new, OUT cl_qmap_t * const p_old);
901*d6b92ffaSHans Petter Selasky /*
902*d6b92ffaSHans Petter Selasky * PARAMETERS
903*d6b92ffaSHans Petter Selasky * p_map1
904*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the first of two cl_qmap_t structures whose
905*d6b92ffaSHans Petter Selasky * differences to compute.
906*d6b92ffaSHans Petter Selasky *
907*d6b92ffaSHans Petter Selasky * p_map2
908*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the second of two cl_qmap_t structures whose
909*d6b92ffaSHans Petter Selasky * differences to compute.
910*d6b92ffaSHans Petter Selasky *
911*d6b92ffaSHans Petter Selasky * p_new
912*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_qmap_t structure that contains the
913*d6b92ffaSHans Petter Selasky * items unique to p_map2 upon return from the function.
914*d6b92ffaSHans Petter Selasky *
915*d6b92ffaSHans Petter Selasky * p_old
916*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_qmap_t structure that contains the
917*d6b92ffaSHans Petter Selasky * items unique to p_map1 upon return from the function.
918*d6b92ffaSHans Petter Selasky *
919*d6b92ffaSHans Petter Selasky * RETURN VALUES
920*d6b92ffaSHans Petter Selasky * This function does not return a value.
921*d6b92ffaSHans Petter Selasky *
922*d6b92ffaSHans Petter Selasky * NOTES
923*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys. Items that exist in both
924*d6b92ffaSHans Petter Selasky * p_map1 and p_map2 remain in their respective maps. Items that
925*d6b92ffaSHans Petter Selasky * exist only p_map1 are moved to p_old. Likewise, items that exist only
926*d6b92ffaSHans Petter Selasky * in p_map2 are moved to p_new. This function can be useful in evaluating
927*d6b92ffaSHans Petter Selasky * changes between two maps.
928*d6b92ffaSHans Petter Selasky *
929*d6b92ffaSHans Petter Selasky * Both maps pointed to by p_new and p_old must be empty on input. This
930*d6b92ffaSHans Petter Selasky * requirement removes the possibility of failures.
931*d6b92ffaSHans Petter Selasky *
932*d6b92ffaSHans Petter Selasky * SEE ALSO
933*d6b92ffaSHans Petter Selasky * Quick Map, cl_qmap_merge
934*d6b92ffaSHans Petter Selasky *********/
935*d6b92ffaSHans Petter Selasky
936*d6b92ffaSHans Petter Selasky /****f* Component Library: Quick Map/cl_qmap_apply_func
937*d6b92ffaSHans Petter Selasky * NAME
938*d6b92ffaSHans Petter Selasky * cl_qmap_apply_func
939*d6b92ffaSHans Petter Selasky *
940*d6b92ffaSHans Petter Selasky * DESCRIPTION
941*d6b92ffaSHans Petter Selasky * The cl_qmap_apply_func function executes a specified function
942*d6b92ffaSHans Petter Selasky * for every item stored in a quick map.
943*d6b92ffaSHans Petter Selasky *
944*d6b92ffaSHans Petter Selasky * SYNOPSIS
945*d6b92ffaSHans Petter Selasky */
946*d6b92ffaSHans Petter Selasky void
947*d6b92ffaSHans Petter Selasky cl_qmap_apply_func(IN const cl_qmap_t * const p_map,
948*d6b92ffaSHans Petter Selasky IN cl_pfn_qmap_apply_t pfn_func,
949*d6b92ffaSHans Petter Selasky IN const void *const context);
950*d6b92ffaSHans Petter Selasky /*
951*d6b92ffaSHans Petter Selasky * PARAMETERS
952*d6b92ffaSHans Petter Selasky * p_map
953*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_qmap_t structure.
954*d6b92ffaSHans Petter Selasky *
955*d6b92ffaSHans Petter Selasky * pfn_func
956*d6b92ffaSHans Petter Selasky * [in] Function invoked for every item in the quick map.
957*d6b92ffaSHans Petter Selasky * See the cl_pfn_qmap_apply_t function type declaration for
958*d6b92ffaSHans Petter Selasky * details about the callback function.
959*d6b92ffaSHans Petter Selasky *
960*d6b92ffaSHans Petter Selasky * context
961*d6b92ffaSHans Petter Selasky * [in] Value to pass to the callback functions to provide context.
962*d6b92ffaSHans Petter Selasky *
963*d6b92ffaSHans Petter Selasky * RETURN VALUE
964*d6b92ffaSHans Petter Selasky * This function does not return a value.
965*d6b92ffaSHans Petter Selasky *
966*d6b92ffaSHans Petter Selasky * NOTES
967*d6b92ffaSHans Petter Selasky * The function provided must not perform any map operations, as these
968*d6b92ffaSHans Petter Selasky * would corrupt the quick map.
969*d6b92ffaSHans Petter Selasky *
970*d6b92ffaSHans Petter Selasky * SEE ALSO
971*d6b92ffaSHans Petter Selasky * Quick Map, cl_pfn_qmap_apply_t
972*d6b92ffaSHans Petter Selasky *********/
973*d6b92ffaSHans Petter Selasky
974*d6b92ffaSHans Petter Selasky END_C_DECLS
975*d6b92ffaSHans Petter Selasky #endif /* _CL_QMAP_H_ */
976