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 map, a binary tree.
39*d6b92ffaSHans Petter Selasky */
40*d6b92ffaSHans Petter Selasky
41*d6b92ffaSHans Petter Selasky #ifndef _CL_MAP_H_
42*d6b92ffaSHans Petter Selasky #define _CL_MAP_H_
43*d6b92ffaSHans Petter Selasky
44*d6b92ffaSHans Petter Selasky #include <complib/cl_qmap.h>
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/Map
57*d6b92ffaSHans Petter Selasky * NAME
58*d6b92ffaSHans Petter Selasky * Map
59*d6b92ffaSHans Petter Selasky *
60*d6b92ffaSHans Petter Selasky * DESCRIPTION
61*d6b92ffaSHans Petter Selasky * Map implements a binary tree that stores user objects. Each item stored
62*d6b92ffaSHans Petter Selasky * in a map has a unique 64-bit key (duplicates are not allowed). Map
63*d6b92ffaSHans Petter Selasky * provides the ability to efficiently search for an item given a key.
64*d6b92ffaSHans Petter Selasky *
65*d6b92ffaSHans Petter Selasky * Map may allocate memory when inserting objects, and can therefore fail
66*d6b92ffaSHans Petter Selasky * operations due to insufficient memory. Use quick map in situations
67*d6b92ffaSHans Petter Selasky * where such insertion failures cannot be tolerated.
68*d6b92ffaSHans Petter Selasky *
69*d6b92ffaSHans Petter Selasky * Map is not thread safe, and users must provide serialization when adding
70*d6b92ffaSHans Petter Selasky * and removing items from the map.
71*d6b92ffaSHans Petter Selasky *
72*d6b92ffaSHans Petter Selasky * The map functions operates on a cl_map_t structure which should be treated
73*d6b92ffaSHans Petter Selasky * as opaque and should be manipulated only through the provided functions.
74*d6b92ffaSHans Petter Selasky *
75*d6b92ffaSHans Petter Selasky * SEE ALSO
76*d6b92ffaSHans Petter Selasky * Types:
77*d6b92ffaSHans Petter Selasky * cl_map_iterator_t
78*d6b92ffaSHans Petter Selasky *
79*d6b92ffaSHans Petter Selasky * Structures:
80*d6b92ffaSHans Petter Selasky * cl_map_t, cl_map_item_t, cl_map_obj_t
81*d6b92ffaSHans Petter Selasky *
82*d6b92ffaSHans Petter Selasky * Item Manipulation:
83*d6b92ffaSHans Petter Selasky * cl_map_obj, cl_map_key
84*d6b92ffaSHans Petter Selasky *
85*d6b92ffaSHans Petter Selasky * Initialization:
86*d6b92ffaSHans Petter Selasky * cl_map_construct, cl_map_init, cl_map_destroy
87*d6b92ffaSHans Petter Selasky *
88*d6b92ffaSHans Petter Selasky * Iteration:
89*d6b92ffaSHans Petter Selasky * cl_map_end, cl_map_head, cl_map_tail, cl_map_next, cl_map_prev
90*d6b92ffaSHans Petter Selasky *
91*d6b92ffaSHans Petter Selasky * Manipulation
92*d6b92ffaSHans Petter Selasky * cl_map_insert, cl_map_get, cl_map_remove_item, cl_map_remove,
93*d6b92ffaSHans Petter Selasky * cl_map_remove_all, cl_map_merge, cl_map_delta, cl_map_get_next
94*d6b92ffaSHans Petter Selasky *
95*d6b92ffaSHans Petter Selasky * Attributes:
96*d6b92ffaSHans Petter Selasky * cl_map_count, cl_is_map_empty, cl_is_map_inited
97*d6b92ffaSHans Petter Selasky *********/
98*d6b92ffaSHans Petter Selasky /****s* Component Library: Map/cl_map_t
99*d6b92ffaSHans Petter Selasky * NAME
100*d6b92ffaSHans Petter Selasky * cl_map_t
101*d6b92ffaSHans Petter Selasky *
102*d6b92ffaSHans Petter Selasky * DESCRIPTION
103*d6b92ffaSHans Petter Selasky * Quick map structure.
104*d6b92ffaSHans Petter Selasky *
105*d6b92ffaSHans Petter Selasky * The cl_map_t structure should be treated as opaque and should
106*d6b92ffaSHans Petter Selasky * be manipulated only through the provided functions.
107*d6b92ffaSHans Petter Selasky *
108*d6b92ffaSHans Petter Selasky * SYNOPSIS
109*d6b92ffaSHans Petter Selasky */
110*d6b92ffaSHans Petter Selasky typedef struct _cl_map {
111*d6b92ffaSHans Petter Selasky cl_qmap_t qmap;
112*d6b92ffaSHans Petter Selasky cl_qpool_t pool;
113*d6b92ffaSHans Petter Selasky } cl_map_t;
114*d6b92ffaSHans Petter Selasky /*
115*d6b92ffaSHans Petter Selasky * FIELDS
116*d6b92ffaSHans Petter Selasky * qmap
117*d6b92ffaSHans Petter Selasky * Quick map object that maintains the map.
118*d6b92ffaSHans Petter Selasky *
119*d6b92ffaSHans Petter Selasky * pool
120*d6b92ffaSHans Petter Selasky * Pool of cl_map_obj_t structures used to store user objects
121*d6b92ffaSHans Petter Selasky * in the map.
122*d6b92ffaSHans Petter Selasky *
123*d6b92ffaSHans Petter Selasky * SEE ALSO
124*d6b92ffaSHans Petter Selasky * Map, cl_map_obj_t
125*d6b92ffaSHans Petter Selasky *********/
126*d6b92ffaSHans Petter Selasky
127*d6b92ffaSHans Petter Selasky /****d* Component Library: Map/cl_map_iterator_t
128*d6b92ffaSHans Petter Selasky * NAME
129*d6b92ffaSHans Petter Selasky * cl_map_iterator_t
130*d6b92ffaSHans Petter Selasky *
131*d6b92ffaSHans Petter Selasky * DESCRIPTION
132*d6b92ffaSHans Petter Selasky * Iterator type used to walk a map.
133*d6b92ffaSHans Petter Selasky *
134*d6b92ffaSHans Petter Selasky * SYNOPSIS
135*d6b92ffaSHans Petter Selasky */
136*d6b92ffaSHans Petter Selasky typedef const cl_map_item_t *cl_map_iterator_t;
137*d6b92ffaSHans Petter Selasky /*
138*d6b92ffaSHans Petter Selasky * NOTES
139*d6b92ffaSHans Petter Selasky * The iterator should be treated as opaque to prevent corrupting the map.
140*d6b92ffaSHans Petter Selasky *
141*d6b92ffaSHans Petter Selasky * SEE ALSO
142*d6b92ffaSHans Petter Selasky * Map, cl_map_head, cl_map_tail, cl_map_next, cl_map_prev, cl_map_key
143*d6b92ffaSHans Petter Selasky *********/
144*d6b92ffaSHans Petter Selasky
145*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_count
146*d6b92ffaSHans Petter Selasky * NAME
147*d6b92ffaSHans Petter Selasky * cl_map_count
148*d6b92ffaSHans Petter Selasky *
149*d6b92ffaSHans Petter Selasky * DESCRIPTION
150*d6b92ffaSHans Petter Selasky * The cl_map_count function returns the number of items stored
151*d6b92ffaSHans Petter Selasky * in a map.
152*d6b92ffaSHans Petter Selasky *
153*d6b92ffaSHans Petter Selasky * SYNOPSIS
154*d6b92ffaSHans Petter Selasky */
cl_map_count(IN const cl_map_t * const p_map)155*d6b92ffaSHans Petter Selasky static inline size_t cl_map_count(IN const cl_map_t * const p_map)
156*d6b92ffaSHans Petter Selasky {
157*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
158*d6b92ffaSHans Petter Selasky return (cl_qmap_count(&p_map->qmap));
159*d6b92ffaSHans Petter Selasky }
160*d6b92ffaSHans Petter Selasky
161*d6b92ffaSHans Petter Selasky /*
162*d6b92ffaSHans Petter Selasky * PARAMETERS
163*d6b92ffaSHans Petter Selasky * p_map
164*d6b92ffaSHans Petter Selasky * [in] Pointer to a map whose item count to return.
165*d6b92ffaSHans Petter Selasky *
166*d6b92ffaSHans Petter Selasky * RETURN VALUE
167*d6b92ffaSHans Petter Selasky * Returns the number of items stored in the map.
168*d6b92ffaSHans Petter Selasky *
169*d6b92ffaSHans Petter Selasky * SEE ALSO
170*d6b92ffaSHans Petter Selasky * Map, cl_is_map_empty
171*d6b92ffaSHans Petter Selasky *********/
172*d6b92ffaSHans Petter Selasky
173*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_is_map_empty
174*d6b92ffaSHans Petter Selasky * NAME
175*d6b92ffaSHans Petter Selasky * cl_is_map_empty
176*d6b92ffaSHans Petter Selasky *
177*d6b92ffaSHans Petter Selasky * DESCRIPTION
178*d6b92ffaSHans Petter Selasky * The cl_is_map_empty function returns whether a map is empty.
179*d6b92ffaSHans Petter Selasky *
180*d6b92ffaSHans Petter Selasky * SYNOPSIS
181*d6b92ffaSHans Petter Selasky */
cl_is_map_empty(IN const cl_map_t * const p_map)182*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_map_empty(IN const cl_map_t * const p_map)
183*d6b92ffaSHans Petter Selasky {
184*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
185*d6b92ffaSHans Petter Selasky return (cl_is_qmap_empty(&p_map->qmap));
186*d6b92ffaSHans Petter Selasky }
187*d6b92ffaSHans Petter Selasky
188*d6b92ffaSHans Petter Selasky /*
189*d6b92ffaSHans Petter Selasky * PARAMETERS
190*d6b92ffaSHans Petter Selasky * p_map
191*d6b92ffaSHans Petter Selasky * [in] Pointer to a map to test for emptiness.
192*d6b92ffaSHans Petter Selasky *
193*d6b92ffaSHans Petter Selasky * RETURN VALUES
194*d6b92ffaSHans Petter Selasky * TRUE if the map is empty.
195*d6b92ffaSHans Petter Selasky *
196*d6b92ffaSHans Petter Selasky * FALSE otherwise.
197*d6b92ffaSHans Petter Selasky *
198*d6b92ffaSHans Petter Selasky * SEE ALSO
199*d6b92ffaSHans Petter Selasky * Map, cl_map_count, cl_map_remove_all
200*d6b92ffaSHans Petter Selasky *********/
201*d6b92ffaSHans Petter Selasky
202*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_key
203*d6b92ffaSHans Petter Selasky * NAME
204*d6b92ffaSHans Petter Selasky * cl_map_key
205*d6b92ffaSHans Petter Selasky *
206*d6b92ffaSHans Petter Selasky * DESCRIPTION
207*d6b92ffaSHans Petter Selasky * The cl_map_key function retrieves the key value of a map item.
208*d6b92ffaSHans Petter Selasky *
209*d6b92ffaSHans Petter Selasky * SYNOPSIS
210*d6b92ffaSHans Petter Selasky */
cl_map_key(IN const cl_map_iterator_t itor)211*d6b92ffaSHans Petter Selasky static inline uint64_t cl_map_key(IN const cl_map_iterator_t itor)
212*d6b92ffaSHans Petter Selasky {
213*d6b92ffaSHans Petter Selasky return (cl_qmap_key(itor));
214*d6b92ffaSHans Petter Selasky }
215*d6b92ffaSHans Petter Selasky
216*d6b92ffaSHans Petter Selasky /*
217*d6b92ffaSHans Petter Selasky * PARAMETERS
218*d6b92ffaSHans Petter Selasky * itor
219*d6b92ffaSHans Petter Selasky * [in] Iterator for the item whose key to return.
220*d6b92ffaSHans Petter Selasky *
221*d6b92ffaSHans Petter Selasky * RETURN VALUE
222*d6b92ffaSHans Petter Selasky * Returns the 64-bit key value for the specified iterator.
223*d6b92ffaSHans Petter Selasky *
224*d6b92ffaSHans Petter Selasky * NOTES
225*d6b92ffaSHans Petter Selasky * The iterator specified by the itor parameter must have been retrived by
226*d6b92ffaSHans Petter Selasky * a previous call to cl_map_head, cl_map_tail, cl_map_next, or cl_map_prev.
227*d6b92ffaSHans Petter Selasky *
228*d6b92ffaSHans Petter Selasky * The key value is set in a call to cl_map_insert.
229*d6b92ffaSHans Petter Selasky *
230*d6b92ffaSHans Petter Selasky * SEE ALSO
231*d6b92ffaSHans Petter Selasky * Map, cl_map_insert, cl_map_head, cl_map_tail, cl_map_next, cl_map_prev
232*d6b92ffaSHans Petter Selasky *********/
233*d6b92ffaSHans Petter Selasky
234*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_construct
235*d6b92ffaSHans Petter Selasky * NAME
236*d6b92ffaSHans Petter Selasky * cl_map_construct
237*d6b92ffaSHans Petter Selasky *
238*d6b92ffaSHans Petter Selasky * DESCRIPTION
239*d6b92ffaSHans Petter Selasky * The cl_map_construct function constructs a map.
240*d6b92ffaSHans Petter Selasky *
241*d6b92ffaSHans Petter Selasky * SYNOPSIS
242*d6b92ffaSHans Petter Selasky */
243*d6b92ffaSHans Petter Selasky void cl_map_construct(IN cl_map_t * const p_map);
244*d6b92ffaSHans Petter Selasky /*
245*d6b92ffaSHans Petter Selasky * PARAMETERS
246*d6b92ffaSHans Petter Selasky * p_map
247*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_t structure to construct.
248*d6b92ffaSHans Petter Selasky *
249*d6b92ffaSHans Petter Selasky * RETURN VALUE
250*d6b92ffaSHans Petter Selasky * This function does not return a value.
251*d6b92ffaSHans Petter Selasky *
252*d6b92ffaSHans Petter Selasky * NOTES
253*d6b92ffaSHans Petter Selasky * Allows calling cl_map_init, cl_map_destroy, and cl_is_map_inited.
254*d6b92ffaSHans Petter Selasky *
255*d6b92ffaSHans Petter Selasky * Calling cl_map_construct is a prerequisite to calling any other
256*d6b92ffaSHans Petter Selasky * map function except cl_map_init.
257*d6b92ffaSHans Petter Selasky *
258*d6b92ffaSHans Petter Selasky * SEE ALSO
259*d6b92ffaSHans Petter Selasky * Map, cl_map_init, cl_map_destroy, cl_is_map_inited
260*d6b92ffaSHans Petter Selasky *********/
261*d6b92ffaSHans Petter Selasky
262*d6b92ffaSHans Petter Selasky /****f* Component Library: Event/cl_is_map_inited
263*d6b92ffaSHans Petter Selasky * NAME
264*d6b92ffaSHans Petter Selasky * cl_is_map_inited
265*d6b92ffaSHans Petter Selasky *
266*d6b92ffaSHans Petter Selasky * DESCRIPTION
267*d6b92ffaSHans Petter Selasky * The cl_is_map_inited function returns whether a map was
268*d6b92ffaSHans Petter Selasky * successfully initialized.
269*d6b92ffaSHans Petter Selasky *
270*d6b92ffaSHans Petter Selasky * SYNOPSIS
271*d6b92ffaSHans Petter Selasky */
cl_is_map_inited(IN const cl_map_t * const p_map)272*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_map_inited(IN const cl_map_t * const p_map)
273*d6b92ffaSHans Petter Selasky {
274*d6b92ffaSHans Petter Selasky /*
275*d6b92ffaSHans Petter Selasky * The map's pool of map items is the last thing initialized.
276*d6b92ffaSHans Petter Selasky * We can therefore use it to test for initialization.
277*d6b92ffaSHans Petter Selasky */
278*d6b92ffaSHans Petter Selasky return (cl_is_qpool_inited(&p_map->pool));
279*d6b92ffaSHans Petter Selasky }
280*d6b92ffaSHans Petter Selasky
281*d6b92ffaSHans Petter Selasky /*
282*d6b92ffaSHans Petter Selasky * PARAMETERS
283*d6b92ffaSHans Petter Selasky * p_map
284*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_t structure whose initialization state
285*d6b92ffaSHans Petter Selasky * to check.
286*d6b92ffaSHans Petter Selasky *
287*d6b92ffaSHans Petter Selasky * RETURN VALUES
288*d6b92ffaSHans Petter Selasky * TRUE if the map was initialized successfully.
289*d6b92ffaSHans Petter Selasky *
290*d6b92ffaSHans Petter Selasky * FALSE otherwise.
291*d6b92ffaSHans Petter Selasky *
292*d6b92ffaSHans Petter Selasky * NOTES
293*d6b92ffaSHans Petter Selasky * Allows checking the state of a map to determine if invoking
294*d6b92ffaSHans Petter Selasky * member functions is appropriate.
295*d6b92ffaSHans Petter Selasky *
296*d6b92ffaSHans Petter Selasky * SEE ALSO
297*d6b92ffaSHans Petter Selasky * Map
298*d6b92ffaSHans Petter Selasky *********/
299*d6b92ffaSHans Petter Selasky
300*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_init
301*d6b92ffaSHans Petter Selasky * NAME
302*d6b92ffaSHans Petter Selasky * cl_map_init
303*d6b92ffaSHans Petter Selasky *
304*d6b92ffaSHans Petter Selasky * DESCRIPTION
305*d6b92ffaSHans Petter Selasky * The cl_map_init function initialized a map for use.
306*d6b92ffaSHans Petter Selasky *
307*d6b92ffaSHans Petter Selasky * SYNOPSIS
308*d6b92ffaSHans Petter Selasky */
309*d6b92ffaSHans Petter Selasky cl_status_t cl_map_init(IN cl_map_t * const p_map, IN const uint32_t min_items);
310*d6b92ffaSHans Petter Selasky /*
311*d6b92ffaSHans Petter Selasky * PARAMETERS
312*d6b92ffaSHans Petter Selasky * p_map
313*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_t structure to initialize.
314*d6b92ffaSHans Petter Selasky *
315*d6b92ffaSHans Petter Selasky * min_items
316*d6b92ffaSHans Petter Selasky * [in] Minimum number of items that can be stored. All necessary
317*d6b92ffaSHans Petter Selasky * allocations to allow storing the minimum number of items is
318*d6b92ffaSHans Petter Selasky * performed at initialization time.
319*d6b92ffaSHans Petter Selasky *
320*d6b92ffaSHans Petter Selasky * RETURN VALUES
321*d6b92ffaSHans Petter Selasky * CL_SUCCESS if the map was initialized successfully.
322*d6b92ffaSHans Petter Selasky *
323*d6b92ffaSHans Petter Selasky * NOTES
324*d6b92ffaSHans Petter Selasky * Allows calling map manipulation functions.
325*d6b92ffaSHans Petter Selasky *
326*d6b92ffaSHans Petter Selasky * SEE ALSO
327*d6b92ffaSHans Petter Selasky * Map, cl_map_destroy, cl_map_insert, cl_map_remove
328*d6b92ffaSHans Petter Selasky *********/
329*d6b92ffaSHans Petter Selasky
330*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_destroy
331*d6b92ffaSHans Petter Selasky * NAME
332*d6b92ffaSHans Petter Selasky * cl_map_destroy
333*d6b92ffaSHans Petter Selasky *
334*d6b92ffaSHans Petter Selasky * DESCRIPTION
335*d6b92ffaSHans Petter Selasky * The cl_map_destroy function destroys a map.
336*d6b92ffaSHans Petter Selasky *
337*d6b92ffaSHans Petter Selasky * SYNOPSIS
338*d6b92ffaSHans Petter Selasky */
339*d6b92ffaSHans Petter Selasky void cl_map_destroy(IN cl_map_t * const p_map);
340*d6b92ffaSHans Petter Selasky /*
341*d6b92ffaSHans Petter Selasky * PARAMETERS
342*d6b92ffaSHans Petter Selasky * p_map
343*d6b92ffaSHans Petter Selasky * [in] Pointer to a map to destroy.
344*d6b92ffaSHans Petter Selasky *
345*d6b92ffaSHans Petter Selasky * RETURN VALUE
346*d6b92ffaSHans Petter Selasky * This function does not return a value.
347*d6b92ffaSHans Petter Selasky *
348*d6b92ffaSHans Petter Selasky * NOTES
349*d6b92ffaSHans Petter Selasky * Performs any necessary cleanup of the specified map. Further
350*d6b92ffaSHans Petter Selasky * operations should not be attempted on the map. cl_map_destroy does
351*d6b92ffaSHans Petter Selasky * not affect any of the objects stored in the map.
352*d6b92ffaSHans Petter Selasky * This function should only be called after a call to cl_map_construct.
353*d6b92ffaSHans Petter Selasky *
354*d6b92ffaSHans Petter Selasky * In debug builds, cl_map_destroy asserts that the map is empty.
355*d6b92ffaSHans Petter Selasky *
356*d6b92ffaSHans Petter Selasky * SEE ALSO
357*d6b92ffaSHans Petter Selasky * Map, cl_map_construct, cl_map_init
358*d6b92ffaSHans Petter Selasky *********/
359*d6b92ffaSHans Petter Selasky
360*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_end
361*d6b92ffaSHans Petter Selasky * NAME
362*d6b92ffaSHans Petter Selasky * cl_map_end
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky * DESCRIPTION
365*d6b92ffaSHans Petter Selasky * The cl_map_end function returns the iterator for the end of a map.
366*d6b92ffaSHans Petter Selasky *
367*d6b92ffaSHans Petter Selasky * SYNOPSIS
368*d6b92ffaSHans Petter Selasky */
cl_map_end(IN const cl_map_t * const p_map)369*d6b92ffaSHans Petter Selasky static inline cl_map_iterator_t cl_map_end(IN const cl_map_t * const p_map)
370*d6b92ffaSHans Petter Selasky {
371*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
372*d6b92ffaSHans Petter Selasky return (cl_qmap_end(&p_map->qmap));
373*d6b92ffaSHans Petter Selasky }
374*d6b92ffaSHans Petter Selasky
375*d6b92ffaSHans Petter Selasky /*
376*d6b92ffaSHans Petter Selasky * PARAMETERS
377*d6b92ffaSHans Petter Selasky * p_map
378*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_t structure whose end to return.
379*d6b92ffaSHans Petter Selasky *
380*d6b92ffaSHans Petter Selasky * RETURN VALUE
381*d6b92ffaSHans Petter Selasky * Iterator for the end of the map.
382*d6b92ffaSHans Petter Selasky *
383*d6b92ffaSHans Petter Selasky * NOTES
384*d6b92ffaSHans Petter Selasky * cl_map_end is useful for determining the validity of map items returned
385*d6b92ffaSHans Petter Selasky * by cl_map_head, cl_map_tail, cl_map_next, cl_map_prev. If the iterator
386*d6b92ffaSHans Petter Selasky * by any of these functions compares to the end, the end of the map was
387*d6b92ffaSHans Petter Selasky * encoutered.
388*d6b92ffaSHans Petter Selasky * When using cl_map_head or cl_map_tail, this condition indicates that
389*d6b92ffaSHans Petter Selasky * the map is empty.
390*d6b92ffaSHans Petter Selasky *
391*d6b92ffaSHans Petter Selasky * SEE ALSO
392*d6b92ffaSHans Petter Selasky * Map, cl_qmap_head, cl_qmap_tail, cl_qmap_next, cl_qmap_prev
393*d6b92ffaSHans Petter Selasky *********/
394*d6b92ffaSHans Petter Selasky
395*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_head
396*d6b92ffaSHans Petter Selasky * NAME
397*d6b92ffaSHans Petter Selasky * cl_map_head
398*d6b92ffaSHans Petter Selasky *
399*d6b92ffaSHans Petter Selasky * DESCRIPTION
400*d6b92ffaSHans Petter Selasky * The cl_map_head function returns the map item with the lowest key
401*d6b92ffaSHans Petter Selasky * value stored in a map.
402*d6b92ffaSHans Petter Selasky *
403*d6b92ffaSHans Petter Selasky * SYNOPSIS
404*d6b92ffaSHans Petter Selasky */
cl_map_head(IN const cl_map_t * const p_map)405*d6b92ffaSHans Petter Selasky static inline cl_map_iterator_t cl_map_head(IN const cl_map_t * const p_map)
406*d6b92ffaSHans Petter Selasky {
407*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
408*d6b92ffaSHans Petter Selasky return (cl_qmap_head(&p_map->qmap));
409*d6b92ffaSHans Petter Selasky }
410*d6b92ffaSHans Petter Selasky
411*d6b92ffaSHans Petter Selasky /*
412*d6b92ffaSHans Petter Selasky * PARAMETERS
413*d6b92ffaSHans Petter Selasky * p_map
414*d6b92ffaSHans Petter Selasky * [in] Pointer to a map whose item with the lowest key is returned.
415*d6b92ffaSHans Petter Selasky *
416*d6b92ffaSHans Petter Selasky * RETURN VALUES
417*d6b92ffaSHans Petter Selasky * Iterator for the object with the lowest key in the map.
418*d6b92ffaSHans Petter Selasky *
419*d6b92ffaSHans Petter Selasky * Iterator for the map end if the map was empty.
420*d6b92ffaSHans Petter Selasky *
421*d6b92ffaSHans Petter Selasky * NOTES
422*d6b92ffaSHans Petter Selasky * cl_map_head does not remove the object from the map.
423*d6b92ffaSHans Petter Selasky *
424*d6b92ffaSHans Petter Selasky * SEE ALSO
425*d6b92ffaSHans Petter Selasky * Map, cl_map_tail, cl_map_next, cl_map_prev, cl_map_end
426*d6b92ffaSHans Petter Selasky *********/
427*d6b92ffaSHans Petter Selasky
428*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_tail
429*d6b92ffaSHans Petter Selasky * NAME
430*d6b92ffaSHans Petter Selasky * cl_map_tail
431*d6b92ffaSHans Petter Selasky *
432*d6b92ffaSHans Petter Selasky * DESCRIPTION
433*d6b92ffaSHans Petter Selasky * The cl_map_tail function returns the map item with the highest key
434*d6b92ffaSHans Petter Selasky * value stored in a map.
435*d6b92ffaSHans Petter Selasky *
436*d6b92ffaSHans Petter Selasky * SYNOPSIS
437*d6b92ffaSHans Petter Selasky */
cl_map_tail(IN const cl_map_t * const p_map)438*d6b92ffaSHans Petter Selasky static inline cl_map_iterator_t cl_map_tail(IN const cl_map_t * const p_map)
439*d6b92ffaSHans Petter Selasky {
440*d6b92ffaSHans Petter Selasky CL_ASSERT(p_map);
441*d6b92ffaSHans Petter Selasky return (cl_qmap_tail(&p_map->qmap));
442*d6b92ffaSHans Petter Selasky }
443*d6b92ffaSHans Petter Selasky
444*d6b92ffaSHans Petter Selasky /*
445*d6b92ffaSHans Petter Selasky * PARAMETERS
446*d6b92ffaSHans Petter Selasky * p_map
447*d6b92ffaSHans Petter Selasky * [in] Pointer to a map whose item with the highest key
448*d6b92ffaSHans Petter Selasky * is returned.
449*d6b92ffaSHans Petter Selasky *
450*d6b92ffaSHans Petter Selasky * RETURN VALUES
451*d6b92ffaSHans Petter Selasky * Iterator for the object with the highest key in the map.
452*d6b92ffaSHans Petter Selasky *
453*d6b92ffaSHans Petter Selasky * Iterator for the map end if the map was empty.
454*d6b92ffaSHans Petter Selasky *
455*d6b92ffaSHans Petter Selasky * NOTES
456*d6b92ffaSHans Petter Selasky * cl_map_end does no remove the object from the map.
457*d6b92ffaSHans Petter Selasky *
458*d6b92ffaSHans Petter Selasky * SEE ALSO
459*d6b92ffaSHans Petter Selasky * Map, cl_map_head, cl_map_next, cl_map_prev, cl_map_end
460*d6b92ffaSHans Petter Selasky *********/
461*d6b92ffaSHans Petter Selasky
462*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_next
463*d6b92ffaSHans Petter Selasky * NAME
464*d6b92ffaSHans Petter Selasky * cl_map_next
465*d6b92ffaSHans Petter Selasky *
466*d6b92ffaSHans Petter Selasky * DESCRIPTION
467*d6b92ffaSHans Petter Selasky * The cl_map_next function returns the map item with the next higher
468*d6b92ffaSHans Petter Selasky * key value than a specified map item.
469*d6b92ffaSHans Petter Selasky *
470*d6b92ffaSHans Petter Selasky * SYNOPSIS
471*d6b92ffaSHans Petter Selasky */
cl_map_next(IN const cl_map_iterator_t itor)472*d6b92ffaSHans Petter Selasky static inline cl_map_iterator_t cl_map_next(IN const cl_map_iterator_t itor)
473*d6b92ffaSHans Petter Selasky {
474*d6b92ffaSHans Petter Selasky CL_ASSERT(itor);
475*d6b92ffaSHans Petter Selasky return (cl_qmap_next(itor));
476*d6b92ffaSHans Petter Selasky }
477*d6b92ffaSHans Petter Selasky
478*d6b92ffaSHans Petter Selasky /*
479*d6b92ffaSHans Petter Selasky * PARAMETERS
480*d6b92ffaSHans Petter Selasky * itor
481*d6b92ffaSHans Petter Selasky * [in] Iterator for an object in a map whose successor to return.
482*d6b92ffaSHans Petter Selasky *
483*d6b92ffaSHans Petter Selasky * RETURN VALUES
484*d6b92ffaSHans Petter Selasky * Iterator for the object with the next higher key value in a map.
485*d6b92ffaSHans Petter Selasky *
486*d6b92ffaSHans Petter Selasky * Iterator for the map end if the specified object was the last item in
487*d6b92ffaSHans Petter Selasky * the map.
488*d6b92ffaSHans Petter Selasky *
489*d6b92ffaSHans Petter Selasky * NOTES
490*d6b92ffaSHans Petter Selasky * The iterator must have been retrieved by a previous call to cl_map_head,
491*d6b92ffaSHans Petter Selasky * cl_map_tail, cl_map_next, or cl_map_prev.
492*d6b92ffaSHans Petter Selasky *
493*d6b92ffaSHans Petter Selasky * SEE ALSO
494*d6b92ffaSHans Petter Selasky * Map, cl_map_head, cl_map_tail, cl_map_prev, cl_map_end
495*d6b92ffaSHans Petter Selasky *********/
496*d6b92ffaSHans Petter Selasky
497*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_prev
498*d6b92ffaSHans Petter Selasky * NAME
499*d6b92ffaSHans Petter Selasky * cl_map_prev
500*d6b92ffaSHans Petter Selasky *
501*d6b92ffaSHans Petter Selasky * DESCRIPTION
502*d6b92ffaSHans Petter Selasky * The cl_map_prev function returns the map item with the next lower
503*d6b92ffaSHans Petter Selasky * key value than a precified map item.
504*d6b92ffaSHans Petter Selasky *
505*d6b92ffaSHans Petter Selasky * SYNOPSIS
506*d6b92ffaSHans Petter Selasky */
cl_map_prev(IN const cl_map_iterator_t itor)507*d6b92ffaSHans Petter Selasky static inline cl_map_iterator_t cl_map_prev(IN const cl_map_iterator_t itor)
508*d6b92ffaSHans Petter Selasky {
509*d6b92ffaSHans Petter Selasky CL_ASSERT(itor);
510*d6b92ffaSHans Petter Selasky return (cl_qmap_prev(itor));
511*d6b92ffaSHans Petter Selasky }
512*d6b92ffaSHans Petter Selasky
513*d6b92ffaSHans Petter Selasky /*
514*d6b92ffaSHans Petter Selasky * PARAMETERS
515*d6b92ffaSHans Petter Selasky * itor
516*d6b92ffaSHans Petter Selasky * [in] Iterator for an object in a map whose predecessor to return.
517*d6b92ffaSHans Petter Selasky *
518*d6b92ffaSHans Petter Selasky * RETURN VALUES
519*d6b92ffaSHans Petter Selasky * Iterator for the object with the next lower key value in a map.
520*d6b92ffaSHans Petter Selasky *
521*d6b92ffaSHans Petter Selasky * Iterator for the map end if the specified object was the first item in
522*d6b92ffaSHans Petter Selasky * the map.
523*d6b92ffaSHans Petter Selasky *
524*d6b92ffaSHans Petter Selasky * NOTES
525*d6b92ffaSHans Petter Selasky * The iterator must have been retrieved by a previous call to cl_map_head,
526*d6b92ffaSHans Petter Selasky * cl_map_tail, cl_map_next, or cl_map_prev.
527*d6b92ffaSHans Petter Selasky *
528*d6b92ffaSHans Petter Selasky * SEE ALSO
529*d6b92ffaSHans Petter Selasky * Map, cl_map_head, cl_map_tail, cl_map_next, cl_map_end
530*d6b92ffaSHans Petter Selasky *********/
531*d6b92ffaSHans Petter Selasky
532*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_insert
533*d6b92ffaSHans Petter Selasky * NAME
534*d6b92ffaSHans Petter Selasky * cl_map_insert
535*d6b92ffaSHans Petter Selasky *
536*d6b92ffaSHans Petter Selasky * DESCRIPTION
537*d6b92ffaSHans Petter Selasky * The cl_map_insert function inserts a map item into a map.
538*d6b92ffaSHans Petter Selasky *
539*d6b92ffaSHans Petter Selasky * SYNOPSIS
540*d6b92ffaSHans Petter Selasky */
541*d6b92ffaSHans Petter Selasky void *cl_map_insert(IN cl_map_t * const p_map,
542*d6b92ffaSHans Petter Selasky IN const uint64_t key, IN const void *const p_object);
543*d6b92ffaSHans Petter Selasky /*
544*d6b92ffaSHans Petter Selasky * PARAMETERS
545*d6b92ffaSHans Petter Selasky * p_map
546*d6b92ffaSHans Petter Selasky * [in] Pointer to a map into which to add the item.
547*d6b92ffaSHans Petter Selasky *
548*d6b92ffaSHans Petter Selasky * key
549*d6b92ffaSHans Petter Selasky * [in] Value to associate with the object.
550*d6b92ffaSHans Petter Selasky *
551*d6b92ffaSHans Petter Selasky * p_object
552*d6b92ffaSHans Petter Selasky * [in] Pointer to an object to insert into the map.
553*d6b92ffaSHans Petter Selasky *
554*d6b92ffaSHans Petter Selasky * RETURN VALUES
555*d6b92ffaSHans Petter Selasky * Pointer to the object in the map with the specified key after the call
556*d6b92ffaSHans Petter Selasky * completes.
557*d6b92ffaSHans Petter Selasky *
558*d6b92ffaSHans Petter Selasky * NULL if there was not enough memory to insert the desired item.
559*d6b92ffaSHans Petter Selasky *
560*d6b92ffaSHans Petter Selasky * NOTES
561*d6b92ffaSHans Petter Selasky * Insertion operations may cause the map to rebalance.
562*d6b92ffaSHans Petter Selasky *
563*d6b92ffaSHans Petter Selasky * If the map already contains an object already with the specified key,
564*d6b92ffaSHans Petter Selasky * that object will not be replaced and the pointer to that object is
565*d6b92ffaSHans Petter Selasky * returned.
566*d6b92ffaSHans Petter Selasky *
567*d6b92ffaSHans Petter Selasky * SEE ALSO
568*d6b92ffaSHans Petter Selasky * Map, cl_map_remove, cl_map_item_t
569*d6b92ffaSHans Petter Selasky *********/
570*d6b92ffaSHans Petter Selasky
571*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_get
572*d6b92ffaSHans Petter Selasky * NAME
573*d6b92ffaSHans Petter Selasky * cl_map_get
574*d6b92ffaSHans Petter Selasky *
575*d6b92ffaSHans Petter Selasky * DESCRIPTION
576*d6b92ffaSHans Petter Selasky * The cl_map_get function returns the object associated with a key.
577*d6b92ffaSHans Petter Selasky *
578*d6b92ffaSHans Petter Selasky * SYNOPSIS
579*d6b92ffaSHans Petter Selasky */
580*d6b92ffaSHans Petter Selasky void *cl_map_get(IN const cl_map_t * const p_map, IN const uint64_t key);
581*d6b92ffaSHans Petter Selasky /*
582*d6b92ffaSHans Petter Selasky * PARAMETERS
583*d6b92ffaSHans Petter Selasky * p_map
584*d6b92ffaSHans Petter Selasky * [in] Pointer to a map from which to retrieve the object with
585*d6b92ffaSHans Petter Selasky * the specified key.
586*d6b92ffaSHans Petter Selasky *
587*d6b92ffaSHans Petter Selasky * key
588*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired object.
589*d6b92ffaSHans Petter Selasky *
590*d6b92ffaSHans Petter Selasky * RETURN VALUES
591*d6b92ffaSHans Petter Selasky * Pointer to the object with the desired key value.
592*d6b92ffaSHans Petter Selasky *
593*d6b92ffaSHans Petter Selasky * NULL if there was no item with the desired key value stored in
594*d6b92ffaSHans Petter Selasky * the map.
595*d6b92ffaSHans Petter Selasky *
596*d6b92ffaSHans Petter Selasky * NOTES
597*d6b92ffaSHans Petter Selasky * cl_map_get does not remove the item from the map.
598*d6b92ffaSHans Petter Selasky *
599*d6b92ffaSHans Petter Selasky * SEE ALSO
600*d6b92ffaSHans Petter Selasky * Map, cl_map_remove, cl_map_get_next
601*d6b92ffaSHans Petter Selasky *********/
602*d6b92ffaSHans Petter Selasky
603*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_get_next
604*d6b92ffaSHans Petter Selasky * NAME
605*d6b92ffaSHans Petter Selasky * cl_map_get_next
606*d6b92ffaSHans Petter Selasky *
607*d6b92ffaSHans Petter Selasky * DESCRIPTION
608*d6b92ffaSHans Petter Selasky * The cl_qmap_get_next function returns the first object associated with a
609*d6b92ffaSHans Petter Selasky * key > the key specified.
610*d6b92ffaSHans Petter Selasky *
611*d6b92ffaSHans Petter Selasky * SYNOPSIS
612*d6b92ffaSHans Petter Selasky */
613*d6b92ffaSHans Petter Selasky void *cl_map_get_next(IN const cl_map_t * const p_map, IN const uint64_t key);
614*d6b92ffaSHans Petter Selasky /*
615*d6b92ffaSHans Petter Selasky * PARAMETERS
616*d6b92ffaSHans Petter Selasky * p_map
617*d6b92ffaSHans Petter Selasky * [in] Pointer to a map from which to retrieve the object with
618*d6b92ffaSHans Petter Selasky * the specified key.
619*d6b92ffaSHans Petter Selasky *
620*d6b92ffaSHans Petter Selasky * key
621*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the desired object.
622*d6b92ffaSHans Petter Selasky *
623*d6b92ffaSHans Petter Selasky * RETURN VALUES
624*d6b92ffaSHans Petter Selasky * Pointer to the first object with a key > the desired key value.
625*d6b92ffaSHans Petter Selasky *
626*d6b92ffaSHans Petter Selasky * NULL if there was no item with a key > the desired key
627*d6b92ffaSHans Petter Selasky * value stored in the map.
628*d6b92ffaSHans Petter Selasky *
629*d6b92ffaSHans Petter Selasky * NOTES
630*d6b92ffaSHans Petter Selasky * cl_map_get does not remove the item from the map.
631*d6b92ffaSHans Petter Selasky *
632*d6b92ffaSHans Petter Selasky * SEE ALSO
633*d6b92ffaSHans Petter Selasky * Map, cl_map_remove, cl_map_get
634*d6b92ffaSHans Petter Selasky *********/
635*d6b92ffaSHans Petter Selasky
636*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_remove_item
637*d6b92ffaSHans Petter Selasky * NAME
638*d6b92ffaSHans Petter Selasky * cl_map_remove_item
639*d6b92ffaSHans Petter Selasky *
640*d6b92ffaSHans Petter Selasky * DESCRIPTION
641*d6b92ffaSHans Petter Selasky * The cl_map_remove_item function removes the specified map item
642*d6b92ffaSHans Petter Selasky * from a map.
643*d6b92ffaSHans Petter Selasky *
644*d6b92ffaSHans Petter Selasky * SYNOPSIS
645*d6b92ffaSHans Petter Selasky */
646*d6b92ffaSHans Petter Selasky void
647*d6b92ffaSHans Petter Selasky cl_map_remove_item(IN cl_map_t * const p_map, IN const cl_map_iterator_t itor);
648*d6b92ffaSHans Petter Selasky /*
649*d6b92ffaSHans Petter Selasky * PARAMETERS
650*d6b92ffaSHans Petter Selasky * p_map
651*d6b92ffaSHans Petter Selasky * [in] Pointer to a map from which to remove the object associated
652*d6b92ffaSHans Petter Selasky * with the specified iterator.
653*d6b92ffaSHans Petter Selasky *
654*d6b92ffaSHans Petter Selasky * itor
655*d6b92ffaSHans Petter Selasky * [in] Iterator for an object to remove from its map.
656*d6b92ffaSHans Petter Selasky *
657*d6b92ffaSHans Petter Selasky * RETURN VALUE
658*d6b92ffaSHans Petter Selasky * This function does not return a value.
659*d6b92ffaSHans Petter Selasky *
660*d6b92ffaSHans Petter Selasky * NOTES
661*d6b92ffaSHans Petter Selasky * Removes the object associated with the specifid iterator from its map.
662*d6b92ffaSHans Petter Selasky *
663*d6b92ffaSHans Petter Selasky * The specified iterator is no longer valid after the call completes.
664*d6b92ffaSHans Petter Selasky *
665*d6b92ffaSHans Petter Selasky * The iterator must have been retrieved by a previous call to cl_map_head,
666*d6b92ffaSHans Petter Selasky * cl_map_tail, cl_map_next, or cl_map_prev.
667*d6b92ffaSHans Petter Selasky *
668*d6b92ffaSHans Petter Selasky * SEE ALSO
669*d6b92ffaSHans Petter Selasky * Map, cl_map_remove, cl_map_remove_all, cl_map_insert, cl_map_head,
670*d6b92ffaSHans Petter Selasky * cl_map_tail, cl_map_next, cl_map_prev
671*d6b92ffaSHans Petter Selasky *********/
672*d6b92ffaSHans Petter Selasky
673*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_remove
674*d6b92ffaSHans Petter Selasky * NAME
675*d6b92ffaSHans Petter Selasky * cl_map_remove
676*d6b92ffaSHans Petter Selasky *
677*d6b92ffaSHans Petter Selasky * DESCRIPTION
678*d6b92ffaSHans Petter Selasky * The cl_map_remove function removes the map item with the specified key
679*d6b92ffaSHans Petter Selasky * from a map.
680*d6b92ffaSHans Petter Selasky *
681*d6b92ffaSHans Petter Selasky * SYNOPSIS
682*d6b92ffaSHans Petter Selasky */
683*d6b92ffaSHans Petter Selasky void *cl_map_remove(IN cl_map_t * const p_map, IN const uint64_t key);
684*d6b92ffaSHans Petter Selasky /*
685*d6b92ffaSHans Petter Selasky * PARAMETERS
686*d6b92ffaSHans Petter Selasky * p_map
687*d6b92ffaSHans Petter Selasky * [in] Pointer to a cl_map_t structure from which to remove the
688*d6b92ffaSHans Petter Selasky * item with the specified key.
689*d6b92ffaSHans Petter Selasky *
690*d6b92ffaSHans Petter Selasky * key
691*d6b92ffaSHans Petter Selasky * [in] Key value used to search for the object to remove.
692*d6b92ffaSHans Petter Selasky *
693*d6b92ffaSHans Petter Selasky * RETURN VALUES
694*d6b92ffaSHans Petter Selasky * Pointer to the object associated with the specified key if
695*d6b92ffaSHans Petter Selasky * it was found and removed.
696*d6b92ffaSHans Petter Selasky *
697*d6b92ffaSHans Petter Selasky * NULL if no object with the specified key exists in the map.
698*d6b92ffaSHans Petter Selasky *
699*d6b92ffaSHans Petter Selasky * SEE ALSO
700*d6b92ffaSHans Petter Selasky * Map, cl_map_remove_item, cl_map_remove_all, cl_map_insert
701*d6b92ffaSHans Petter Selasky *********/
702*d6b92ffaSHans Petter Selasky
703*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_remove_all
704*d6b92ffaSHans Petter Selasky * NAME
705*d6b92ffaSHans Petter Selasky * cl_map_remove_all
706*d6b92ffaSHans Petter Selasky *
707*d6b92ffaSHans Petter Selasky * DESCRIPTION
708*d6b92ffaSHans Petter Selasky * The cl_map_remove_all function removes all objects from a map,
709*d6b92ffaSHans Petter Selasky * leaving it empty.
710*d6b92ffaSHans Petter Selasky *
711*d6b92ffaSHans Petter Selasky * SYNOPSIS
712*d6b92ffaSHans Petter Selasky */
713*d6b92ffaSHans Petter Selasky void cl_map_remove_all(IN cl_map_t * const p_map);
714*d6b92ffaSHans Petter Selasky /*
715*d6b92ffaSHans Petter Selasky * PARAMETERS
716*d6b92ffaSHans Petter Selasky * p_map
717*d6b92ffaSHans Petter Selasky * [in] Pointer to a map to empty.
718*d6b92ffaSHans Petter Selasky *
719*d6b92ffaSHans Petter Selasky * RETURN VALUE
720*d6b92ffaSHans Petter Selasky * This function does not return a value.
721*d6b92ffaSHans Petter Selasky *
722*d6b92ffaSHans Petter Selasky * SEE ALSO
723*d6b92ffaSHans Petter Selasky * Map, cl_map_remove, cl_map_remove_item
724*d6b92ffaSHans Petter Selasky *********/
725*d6b92ffaSHans Petter Selasky
726*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_obj
727*d6b92ffaSHans Petter Selasky * NAME
728*d6b92ffaSHans Petter Selasky * cl_map_obj
729*d6b92ffaSHans Petter Selasky *
730*d6b92ffaSHans Petter Selasky * DESCRIPTION
731*d6b92ffaSHans Petter Selasky * The cl_map_obj function returns the object associated with an iterator.
732*d6b92ffaSHans Petter Selasky *
733*d6b92ffaSHans Petter Selasky * SYNOPSIS
734*d6b92ffaSHans Petter Selasky */
cl_map_obj(IN const cl_map_iterator_t itor)735*d6b92ffaSHans Petter Selasky static inline void *cl_map_obj(IN const cl_map_iterator_t itor)
736*d6b92ffaSHans Petter Selasky {
737*d6b92ffaSHans Petter Selasky return (cl_qmap_obj(PARENT_STRUCT(itor, cl_map_obj_t, item)));
738*d6b92ffaSHans Petter Selasky }
739*d6b92ffaSHans Petter Selasky
740*d6b92ffaSHans Petter Selasky /*
741*d6b92ffaSHans Petter Selasky * PARAMETERS
742*d6b92ffaSHans Petter Selasky * itor
743*d6b92ffaSHans Petter Selasky * [in] Iterator whose object to return.
744*d6b92ffaSHans Petter Selasky *
745*d6b92ffaSHans Petter Selasky * RETURN VALUES
746*d6b92ffaSHans Petter Selasky * Returns the value of the object pointer associated with the iterator.
747*d6b92ffaSHans Petter Selasky *
748*d6b92ffaSHans Petter Selasky * The iterator must have been retrieved by a previous call to cl_map_head,
749*d6b92ffaSHans Petter Selasky * cl_map_tail, cl_map_next, or cl_map_prev.
750*d6b92ffaSHans Petter Selasky *
751*d6b92ffaSHans Petter Selasky * SEE ALSO
752*d6b92ffaSHans Petter Selasky * Map, cl_map_head, cl_map_tail, cl_map_next, cl_map_prev
753*d6b92ffaSHans Petter Selasky *********/
754*d6b92ffaSHans Petter Selasky
755*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_merge
756*d6b92ffaSHans Petter Selasky * NAME
757*d6b92ffaSHans Petter Selasky * cl_map_merge
758*d6b92ffaSHans Petter Selasky *
759*d6b92ffaSHans Petter Selasky * DESCRIPTION
760*d6b92ffaSHans Petter Selasky * The cl_map_merge function moves all items from one map to another,
761*d6b92ffaSHans Petter Selasky * excluding duplicates.
762*d6b92ffaSHans Petter Selasky *
763*d6b92ffaSHans Petter Selasky * SYNOPSIS
764*d6b92ffaSHans Petter Selasky */
765*d6b92ffaSHans Petter Selasky cl_status_t
766*d6b92ffaSHans Petter Selasky cl_map_merge(OUT cl_map_t * const p_dest_map,
767*d6b92ffaSHans Petter Selasky IN OUT cl_map_t * const p_src_map);
768*d6b92ffaSHans Petter Selasky /*
769*d6b92ffaSHans Petter Selasky * PARAMETERS
770*d6b92ffaSHans Petter Selasky * p_dest_map
771*d6b92ffaSHans Petter Selasky * [out] Pointer to a cl_map_t structure to which items should be added.
772*d6b92ffaSHans Petter Selasky *
773*d6b92ffaSHans Petter Selasky * p_src_map
774*d6b92ffaSHans Petter Selasky * [in/out] Pointer to a cl_map_t structure whose items to add
775*d6b92ffaSHans Petter Selasky * to p_dest_map.
776*d6b92ffaSHans Petter Selasky *
777*d6b92ffaSHans Petter Selasky * RETURN VALUES
778*d6b92ffaSHans Petter Selasky * CL_SUCCESS if the operation succeeded.
779*d6b92ffaSHans Petter Selasky *
780*d6b92ffaSHans Petter Selasky * CL_INSUFFICIENT_MEMORY if there was not enough memory for the operation
781*d6b92ffaSHans Petter Selasky * to succeed.
782*d6b92ffaSHans Petter Selasky *
783*d6b92ffaSHans Petter Selasky * NOTES
784*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys only.
785*d6b92ffaSHans Petter Selasky *
786*d6b92ffaSHans Petter Selasky * Upon return from cl_map_merge, the map referenced by p_src_map contains
787*d6b92ffaSHans Petter Selasky * all duplicate items.
788*d6b92ffaSHans Petter Selasky *
789*d6b92ffaSHans Petter Selasky * SEE ALSO
790*d6b92ffaSHans Petter Selasky * Map, cl_map_delta
791*d6b92ffaSHans Petter Selasky *********/
792*d6b92ffaSHans Petter Selasky
793*d6b92ffaSHans Petter Selasky /****f* Component Library: Map/cl_map_delta
794*d6b92ffaSHans Petter Selasky * NAME
795*d6b92ffaSHans Petter Selasky * cl_map_delta
796*d6b92ffaSHans Petter Selasky *
797*d6b92ffaSHans Petter Selasky * DESCRIPTION
798*d6b92ffaSHans Petter Selasky * The cl_map_delta function computes the differences between two maps.
799*d6b92ffaSHans Petter Selasky *
800*d6b92ffaSHans Petter Selasky * SYNOPSIS
801*d6b92ffaSHans Petter Selasky */
802*d6b92ffaSHans Petter Selasky cl_status_t
803*d6b92ffaSHans Petter Selasky cl_map_delta(IN OUT cl_map_t * const p_map1,
804*d6b92ffaSHans Petter Selasky IN OUT cl_map_t * const p_map2,
805*d6b92ffaSHans Petter Selasky OUT cl_map_t * const p_new, OUT cl_map_t * const p_old);
806*d6b92ffaSHans Petter Selasky /*
807*d6b92ffaSHans Petter Selasky * PARAMETERS
808*d6b92ffaSHans Petter Selasky * p_map1
809*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the first of two cl_map_t structures whose
810*d6b92ffaSHans Petter Selasky * differences to compute.
811*d6b92ffaSHans Petter Selasky *
812*d6b92ffaSHans Petter Selasky * p_map2
813*d6b92ffaSHans Petter Selasky * [in/out] Pointer to the second of two cl_map_t structures whose
814*d6b92ffaSHans Petter Selasky * differences to compute.
815*d6b92ffaSHans Petter Selasky *
816*d6b92ffaSHans Petter Selasky * p_new
817*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_map_t structure that contains the
818*d6b92ffaSHans Petter Selasky * items unique to p_map2 upon return from the function.
819*d6b92ffaSHans Petter Selasky *
820*d6b92ffaSHans Petter Selasky * p_old
821*d6b92ffaSHans Petter Selasky * [out] Pointer to an empty cl_map_t structure that contains the
822*d6b92ffaSHans Petter Selasky * items unique to p_map1 upon return from the function.
823*d6b92ffaSHans Petter Selasky *
824*d6b92ffaSHans Petter Selasky * RETURN VALUES
825*d6b92ffaSHans Petter Selasky * CL_SUCCESS if the operation succeeded.
826*d6b92ffaSHans Petter Selasky *
827*d6b92ffaSHans Petter Selasky * CL_INSUFFICIENT_MEMORY if there was not enough memory for the operation
828*d6b92ffaSHans Petter Selasky * to succeed.
829*d6b92ffaSHans Petter Selasky *
830*d6b92ffaSHans Petter Selasky * NOTES
831*d6b92ffaSHans Petter Selasky * Items are evaluated based on their keys. Items that exist in both
832*d6b92ffaSHans Petter Selasky * p_map1 and p_map2 remain in their respective maps. Items that
833*d6b92ffaSHans Petter Selasky * exist only p_map1 are moved to p_old. Likewise, items that exist only
834*d6b92ffaSHans Petter Selasky * in p_map2 are moved to p_new. This function can be useful in evaluating
835*d6b92ffaSHans Petter Selasky * changes between two maps.
836*d6b92ffaSHans Petter Selasky *
837*d6b92ffaSHans Petter Selasky * Both maps pointed to by p_new and p_old must be empty on input.
838*d6b92ffaSHans Petter Selasky *
839*d6b92ffaSHans Petter Selasky * Upon failure, all input maps are restored to their original state.
840*d6b92ffaSHans Petter Selasky *
841*d6b92ffaSHans Petter Selasky * SEE ALSO
842*d6b92ffaSHans Petter Selasky * Map, cl_map_merge
843*d6b92ffaSHans Petter Selasky *********/
844*d6b92ffaSHans Petter Selasky
845*d6b92ffaSHans Petter Selasky END_C_DECLS
846*d6b92ffaSHans Petter Selasky #endif /* _CL_MAP_H_ */
847