xref: /freebsd/contrib/ofed/opensm/include/complib/cl_fleximap.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2009 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 flexi 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_FLEXIMAP_H_
43*d6b92ffaSHans Petter Selasky #define _CL_FLEXIMAP_H_
44*d6b92ffaSHans Petter Selasky 
45*d6b92ffaSHans Petter Selasky #include <complib/cl_qmap.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/Flexi Map
57*d6b92ffaSHans Petter Selasky * NAME
58*d6b92ffaSHans Petter Selasky *	Flexi Map
59*d6b92ffaSHans Petter Selasky *
60*d6b92ffaSHans Petter Selasky * DESCRIPTION
61*d6b92ffaSHans Petter Selasky *	Flexi map implements a binary tree that stores user provided cl_fmap_item_t
62*d6b92ffaSHans Petter Selasky *	structures.  Each item stored in a flexi map has a unique user defined
63*d6b92ffaSHans Petter Selasky *	key (duplicates are not allowed).  Flexi map provides the ability to
64*d6b92ffaSHans Petter Selasky *	efficiently search for an item given a key.  Flexi map allows user
65*d6b92ffaSHans Petter Selasky *	defined keys of any size.  Storage for keys and a comparison function
66*d6b92ffaSHans Petter Selasky *	are provided by users to allow flexi map to store items with arbitrary
67*d6b92ffaSHans Petter Selasky *	key values.
68*d6b92ffaSHans Petter Selasky *
69*d6b92ffaSHans Petter Selasky *	Flexi map does not allocate any memory, and can therefore not fail
70*d6b92ffaSHans Petter Selasky *	any operations due to insufficient memory.  Flexi map can thus be useful
71*d6b92ffaSHans Petter Selasky *	in minimizing the error paths in code.
72*d6b92ffaSHans Petter Selasky *
73*d6b92ffaSHans Petter Selasky *	Flexi map is not thread safe, and users must provide serialization when
74*d6b92ffaSHans Petter Selasky *	adding and removing items from the map.
75*d6b92ffaSHans Petter Selasky *
76*d6b92ffaSHans Petter Selasky *	The flexi map functions operate on a cl_fmap_t structure which should
77*d6b92ffaSHans Petter Selasky *	be treated as opaque and should be manipulated only through the provided
78*d6b92ffaSHans Petter Selasky *	functions.
79*d6b92ffaSHans Petter Selasky *
80*d6b92ffaSHans Petter Selasky * SEE ALSO
81*d6b92ffaSHans Petter Selasky *	Structures:
82*d6b92ffaSHans Petter Selasky *		cl_fmap_t, cl_fmap_item_t
83*d6b92ffaSHans Petter Selasky *
84*d6b92ffaSHans Petter Selasky *	Callbacks:
85*d6b92ffaSHans Petter Selasky *		cl_pfn_fmap_apply_t
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky *	Item Manipulation:
88*d6b92ffaSHans Petter Selasky *		cl_fmap_key
89*d6b92ffaSHans Petter Selasky *
90*d6b92ffaSHans Petter Selasky *	Initialization:
91*d6b92ffaSHans Petter Selasky *		cl_fmap_init
92*d6b92ffaSHans Petter Selasky *
93*d6b92ffaSHans Petter Selasky *	Iteration:
94*d6b92ffaSHans Petter Selasky *		cl_fmap_end, cl_fmap_head, cl_fmap_tail, cl_fmap_next, cl_fmap_prev
95*d6b92ffaSHans Petter Selasky *
96*d6b92ffaSHans Petter Selasky *	Manipulation:
97*d6b92ffaSHans Petter Selasky *		cl_fmap_insert, cl_fmap_get, cl_fmap_remove_item, cl_fmap_remove,
98*d6b92ffaSHans Petter Selasky *		cl_fmap_remove_all, cl_fmap_merge, cl_fmap_delta, cl_fmap_get_next
99*d6b92ffaSHans Petter Selasky *
100*d6b92ffaSHans Petter Selasky *	Search:
101*d6b92ffaSHans Petter Selasky *		cl_fmap_apply_func
102*d6b92ffaSHans Petter Selasky *
103*d6b92ffaSHans Petter Selasky *	Attributes:
104*d6b92ffaSHans Petter Selasky *		cl_fmap_count, cl_is_fmap_empty,
105*d6b92ffaSHans Petter Selasky *********/
106*d6b92ffaSHans Petter Selasky /****s* Component Library: Flexi Map/cl_fmap_item_t
107*d6b92ffaSHans Petter Selasky * NAME
108*d6b92ffaSHans Petter Selasky *	cl_fmap_item_t
109*d6b92ffaSHans Petter Selasky *
110*d6b92ffaSHans Petter Selasky * DESCRIPTION
111*d6b92ffaSHans Petter Selasky *	The cl_fmap_item_t structure is used by maps to store objects.
112*d6b92ffaSHans Petter Selasky *
113*d6b92ffaSHans Petter Selasky *	The cl_fmap_item_t structure should be treated as opaque and should
114*d6b92ffaSHans Petter Selasky *	be manipulated only through the provided functions.
115*d6b92ffaSHans Petter Selasky *
116*d6b92ffaSHans Petter Selasky * SYNOPSIS
117*d6b92ffaSHans Petter Selasky */
118*d6b92ffaSHans Petter Selasky typedef struct _cl_fmap_item {
119*d6b92ffaSHans Petter Selasky 	/* Must be first to allow casting. */
120*d6b92ffaSHans Petter Selasky 	cl_pool_item_t pool_item;
121*d6b92ffaSHans Petter Selasky 	struct _cl_fmap_item *p_left;
122*d6b92ffaSHans Petter Selasky 	struct _cl_fmap_item *p_right;
123*d6b92ffaSHans Petter Selasky 	struct _cl_fmap_item *p_up;
124*d6b92ffaSHans Petter Selasky 	cl_map_color_t color;
125*d6b92ffaSHans Petter Selasky 	const void *p_key;
126*d6b92ffaSHans Petter Selasky #ifdef _DEBUG_
127*d6b92ffaSHans Petter Selasky 	struct _cl_fmap *p_map;
128*d6b92ffaSHans Petter Selasky #endif
129*d6b92ffaSHans Petter Selasky } cl_fmap_item_t;
130*d6b92ffaSHans Petter Selasky /*
131*d6b92ffaSHans Petter Selasky * FIELDS
132*d6b92ffaSHans Petter Selasky *	pool_item
133*d6b92ffaSHans Petter Selasky *		Used to store the item in a doubly linked list, allowing more
134*d6b92ffaSHans Petter Selasky *		efficient map traversal.
135*d6b92ffaSHans Petter Selasky *
136*d6b92ffaSHans Petter Selasky *	p_left
137*d6b92ffaSHans Petter Selasky *		Pointer to the map item that is a child to the left of the node.
138*d6b92ffaSHans Petter Selasky *
139*d6b92ffaSHans Petter Selasky *	p_right
140*d6b92ffaSHans Petter Selasky *		Pointer to the map item that is a child to the right of the node.
141*d6b92ffaSHans Petter Selasky *
142*d6b92ffaSHans Petter Selasky *	p_up
143*d6b92ffaSHans Petter Selasky *		Pointer to the map item that is the parent of the node.
144*d6b92ffaSHans Petter Selasky *
145*d6b92ffaSHans Petter Selasky *	p_nil
146*d6b92ffaSHans Petter Selasky *		Pointer to the map's NIL item, used as a terminator for leaves.
147*d6b92ffaSHans Petter Selasky *		The NIL sentinel is in the cl_fmap_t structure.
148*d6b92ffaSHans Petter Selasky *
149*d6b92ffaSHans Petter Selasky *	color
150*d6b92ffaSHans Petter Selasky *		Indicates whether a node is red or black in the map.
151*d6b92ffaSHans Petter Selasky *
152*d6b92ffaSHans Petter Selasky *	p_key
153*d6b92ffaSHans Petter Selasky *		Pointer to the value that uniquely represents a node in a map.  This
154*d6b92ffaSHans Petter Selasky *		pointer is set by calling cl_fmap_insert and can be retrieved by
155*d6b92ffaSHans Petter Selasky *		calling cl_fmap_key.
156*d6b92ffaSHans Petter Selasky *
157*d6b92ffaSHans Petter Selasky * NOTES
158*d6b92ffaSHans Petter Selasky *	None of the fields of this structure should be manipulated by users, as
159*d6b92ffaSHans Petter Selasky *	they are crititcal to the proper operation of the map in which they
160*d6b92ffaSHans Petter Selasky *	are stored.
161*d6b92ffaSHans Petter Selasky *
162*d6b92ffaSHans Petter Selasky *	To allow storing items in either a quick list, a quick pool, or a flexi
163*d6b92ffaSHans Petter Selasky *	map, the map implementation guarantees that the map item can be safely
164*d6b92ffaSHans Petter Selasky *	cast to a pool item used for storing an object in a quick pool, or cast
165*d6b92ffaSHans Petter Selasky *	to a list item used for storing an object in a quick list.  This removes
166*d6b92ffaSHans Petter Selasky *	the need to embed a flexi map item, a list item, and a pool item in
167*d6b92ffaSHans Petter Selasky *	objects that need to be stored in a quick list, a quick pool, and a
168*d6b92ffaSHans Petter Selasky *	flexi map.
169*d6b92ffaSHans Petter Selasky *
170*d6b92ffaSHans Petter Selasky * SEE ALSO
171*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_insert, cl_fmap_key, cl_pool_item_t, cl_list_item_t
172*d6b92ffaSHans Petter Selasky *********/
173*d6b92ffaSHans Petter Selasky 
174*d6b92ffaSHans Petter Selasky /****d* Component Library: Flexi Map/cl_pfn_fmap_cmp_t
175*d6b92ffaSHans Petter Selasky * NAME
176*d6b92ffaSHans Petter Selasky *	cl_pfn_fmap_cmp_t
177*d6b92ffaSHans Petter Selasky *
178*d6b92ffaSHans Petter Selasky * DESCRIPTION
179*d6b92ffaSHans Petter Selasky *	The cl_pfn_fmap_cmp_t function type defines the prototype for functions
180*d6b92ffaSHans Petter Selasky *	used to compare item keys in a flexi map.
181*d6b92ffaSHans Petter Selasky *
182*d6b92ffaSHans Petter Selasky * SYNOPSIS
183*d6b92ffaSHans Petter Selasky */
184*d6b92ffaSHans Petter Selasky typedef int
185*d6b92ffaSHans Petter Selasky     (*cl_pfn_fmap_cmp_t) (IN const void *const p_key1,
186*d6b92ffaSHans Petter Selasky 			  IN const void *const p_key2);
187*d6b92ffaSHans Petter Selasky /*
188*d6b92ffaSHans Petter Selasky * PARAMETERS
189*d6b92ffaSHans Petter Selasky *	p_key1
190*d6b92ffaSHans Petter Selasky *		[in] Pointer to the first of two keys to compare.
191*d6b92ffaSHans Petter Selasky *
192*d6b92ffaSHans Petter Selasky *	p_key2
193*d6b92ffaSHans Petter Selasky *		[in] Pointer to the second of two keys to compare.
194*d6b92ffaSHans Petter Selasky *
195*d6b92ffaSHans Petter Selasky * RETURN VALUE
196*d6b92ffaSHans Petter Selasky *	Returns 0 if the keys match.
197*d6b92ffaSHans Petter Selasky *	Returns less than 0 if *p_key1 is less than *p_key2.
198*d6b92ffaSHans Petter Selasky *	Returns greater than 0 if *p_key1 is greater than *p_key2.
199*d6b92ffaSHans Petter Selasky *
200*d6b92ffaSHans Petter Selasky * NOTES
201*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
202*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the cl_fmap_init function.
203*d6b92ffaSHans Petter Selasky *
204*d6b92ffaSHans Petter Selasky * SEE ALSO
205*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_init
206*d6b92ffaSHans Petter Selasky *********/
207*d6b92ffaSHans Petter Selasky 
208*d6b92ffaSHans Petter Selasky /****s* Component Library: Flexi Map/cl_fmap_t
209*d6b92ffaSHans Petter Selasky * NAME
210*d6b92ffaSHans Petter Selasky *	cl_fmap_t
211*d6b92ffaSHans Petter Selasky *
212*d6b92ffaSHans Petter Selasky * DESCRIPTION
213*d6b92ffaSHans Petter Selasky *	Flexi map structure.
214*d6b92ffaSHans Petter Selasky *
215*d6b92ffaSHans Petter Selasky *	The cl_fmap_t structure should be treated as opaque and should
216*d6b92ffaSHans Petter Selasky *	be manipulated only through the provided functions.
217*d6b92ffaSHans Petter Selasky *
218*d6b92ffaSHans Petter Selasky * SYNOPSIS
219*d6b92ffaSHans Petter Selasky */
220*d6b92ffaSHans Petter Selasky typedef struct _cl_fmap {
221*d6b92ffaSHans Petter Selasky 	cl_fmap_item_t root;
222*d6b92ffaSHans Petter Selasky 	cl_fmap_item_t nil;
223*d6b92ffaSHans Petter Selasky 	cl_state_t state;
224*d6b92ffaSHans Petter Selasky 	size_t count;
225*d6b92ffaSHans Petter Selasky 	cl_pfn_fmap_cmp_t pfn_compare;
226*d6b92ffaSHans Petter Selasky } cl_fmap_t;
227*d6b92ffaSHans Petter Selasky /*
228*d6b92ffaSHans Petter Selasky * PARAMETERS
229*d6b92ffaSHans Petter Selasky *	root
230*d6b92ffaSHans Petter Selasky *		Map item that serves as root of the map.  The root is set up to
231*d6b92ffaSHans Petter Selasky *		always have itself as parent.  The left pointer is set to point
232*d6b92ffaSHans Petter Selasky *		to the item at the root.
233*d6b92ffaSHans Petter Selasky *
234*d6b92ffaSHans Petter Selasky *	nil
235*d6b92ffaSHans Petter Selasky *		Map item that serves as terminator for all leaves, as well as
236*d6b92ffaSHans Petter Selasky *		providing the list item used as quick list for storing map items
237*d6b92ffaSHans Petter Selasky *		in a list for faster traversal.
238*d6b92ffaSHans Petter Selasky *
239*d6b92ffaSHans Petter Selasky *	state
240*d6b92ffaSHans Petter Selasky *		State of the map, used to verify that operations are permitted.
241*d6b92ffaSHans Petter Selasky *
242*d6b92ffaSHans Petter Selasky *	count
243*d6b92ffaSHans Petter Selasky *		Number of items in the map.
244*d6b92ffaSHans Petter Selasky *
245*d6b92ffaSHans Petter Selasky *	pfn_compare
246*d6b92ffaSHans Petter Selasky *		Pointer to a compare function to invoke to compare the keys of
247*d6b92ffaSHans Petter Selasky *		items in the map.
248*d6b92ffaSHans Petter Selasky *
249*d6b92ffaSHans Petter Selasky * SEE ALSO
250*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_pfn_fmap_cmp_t
251*d6b92ffaSHans Petter Selasky *********/
252*d6b92ffaSHans Petter Selasky 
253*d6b92ffaSHans Petter Selasky /****d* Component Library: Flexi Map/cl_pfn_fmap_apply_t
254*d6b92ffaSHans Petter Selasky * NAME
255*d6b92ffaSHans Petter Selasky *	cl_pfn_fmap_apply_t
256*d6b92ffaSHans Petter Selasky *
257*d6b92ffaSHans Petter Selasky * DESCRIPTION
258*d6b92ffaSHans Petter Selasky *	The cl_pfn_fmap_apply_t function type defines the prototype for
259*d6b92ffaSHans Petter Selasky *	functions used to iterate items in a flexi map.
260*d6b92ffaSHans Petter Selasky *
261*d6b92ffaSHans Petter Selasky * SYNOPSIS
262*d6b92ffaSHans Petter Selasky */
263*d6b92ffaSHans Petter Selasky typedef void
264*d6b92ffaSHans Petter Selasky  (*cl_pfn_fmap_apply_t) (IN cl_fmap_item_t * const p_map_item,
265*d6b92ffaSHans Petter Selasky 			 IN void *context);
266*d6b92ffaSHans Petter Selasky /*
267*d6b92ffaSHans Petter Selasky * PARAMETERS
268*d6b92ffaSHans Petter Selasky *	p_map_item
269*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_item_t structure.
270*d6b92ffaSHans Petter Selasky *
271*d6b92ffaSHans Petter Selasky *	context
272*d6b92ffaSHans Petter Selasky *		[in] Value passed to the callback function.
273*d6b92ffaSHans Petter Selasky *
274*d6b92ffaSHans Petter Selasky * RETURN VALUE
275*d6b92ffaSHans Petter Selasky *	This function does not return a value.
276*d6b92ffaSHans Petter Selasky *
277*d6b92ffaSHans Petter Selasky * NOTES
278*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
279*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the cl_fmap_apply_func
280*d6b92ffaSHans Petter Selasky *	function.
281*d6b92ffaSHans Petter Selasky *
282*d6b92ffaSHans Petter Selasky * SEE ALSO
283*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_apply_func
284*d6b92ffaSHans Petter Selasky *********/
285*d6b92ffaSHans Petter Selasky 
286*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_count
287*d6b92ffaSHans Petter Selasky * NAME
288*d6b92ffaSHans Petter Selasky *	cl_fmap_count
289*d6b92ffaSHans Petter Selasky *
290*d6b92ffaSHans Petter Selasky * DESCRIPTION
291*d6b92ffaSHans Petter Selasky *	The cl_fmap_count function returns the number of items stored
292*d6b92ffaSHans Petter Selasky *	in a flexi map.
293*d6b92ffaSHans Petter Selasky *
294*d6b92ffaSHans Petter Selasky * SYNOPSIS
295*d6b92ffaSHans Petter Selasky */
cl_fmap_count(IN const cl_fmap_t * const p_map)296*d6b92ffaSHans Petter Selasky static inline size_t cl_fmap_count(IN const cl_fmap_t * const p_map)
297*d6b92ffaSHans Petter Selasky {
298*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
299*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
300*d6b92ffaSHans Petter Selasky 	return (p_map->count);
301*d6b92ffaSHans Petter Selasky }
302*d6b92ffaSHans Petter Selasky 
303*d6b92ffaSHans Petter Selasky /*
304*d6b92ffaSHans Petter Selasky * PARAMETERS
305*d6b92ffaSHans Petter Selasky *	p_map
306*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure whose item count to return.
307*d6b92ffaSHans Petter Selasky *
308*d6b92ffaSHans Petter Selasky * RETURN VALUE
309*d6b92ffaSHans Petter Selasky *	Returns the number of items stored in the map.
310*d6b92ffaSHans Petter Selasky *
311*d6b92ffaSHans Petter Selasky * SEE ALSO
312*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_is_fmap_empty
313*d6b92ffaSHans Petter Selasky *********/
314*d6b92ffaSHans Petter Selasky 
315*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_is_fmap_empty
316*d6b92ffaSHans Petter Selasky * NAME
317*d6b92ffaSHans Petter Selasky *	cl_is_fmap_empty
318*d6b92ffaSHans Petter Selasky *
319*d6b92ffaSHans Petter Selasky * DESCRIPTION
320*d6b92ffaSHans Petter Selasky *	The cl_is_fmap_empty function returns whether a flexi map is empty.
321*d6b92ffaSHans Petter Selasky *
322*d6b92ffaSHans Petter Selasky * SYNOPSIS
323*d6b92ffaSHans Petter Selasky */
cl_is_fmap_empty(IN const cl_fmap_t * const p_map)324*d6b92ffaSHans Petter Selasky static inline boolean_t cl_is_fmap_empty(IN const cl_fmap_t * const p_map)
325*d6b92ffaSHans Petter Selasky {
326*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
327*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
328*d6b92ffaSHans Petter Selasky 
329*d6b92ffaSHans Petter Selasky 	return (p_map->count == 0);
330*d6b92ffaSHans Petter Selasky }
331*d6b92ffaSHans Petter Selasky 
332*d6b92ffaSHans Petter Selasky /*
333*d6b92ffaSHans Petter Selasky * PARAMETERS
334*d6b92ffaSHans Petter Selasky *	p_map
335*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure to test for emptiness.
336*d6b92ffaSHans Petter Selasky *
337*d6b92ffaSHans Petter Selasky * RETURN VALUES
338*d6b92ffaSHans Petter Selasky *	TRUE if the flexi map is empty.
339*d6b92ffaSHans Petter Selasky *
340*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
341*d6b92ffaSHans Petter Selasky *
342*d6b92ffaSHans Petter Selasky * SEE ALSO
343*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_count, cl_fmap_remove_all
344*d6b92ffaSHans Petter Selasky *********/
345*d6b92ffaSHans Petter Selasky 
346*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_key
347*d6b92ffaSHans Petter Selasky * NAME
348*d6b92ffaSHans Petter Selasky *	cl_fmap_key
349*d6b92ffaSHans Petter Selasky *
350*d6b92ffaSHans Petter Selasky * DESCRIPTION
351*d6b92ffaSHans Petter Selasky *	The cl_fmap_key function retrieves the key value of a map item.
352*d6b92ffaSHans Petter Selasky *
353*d6b92ffaSHans Petter Selasky * SYNOPSIS
354*d6b92ffaSHans Petter Selasky */
cl_fmap_key(IN const cl_fmap_item_t * const p_item)355*d6b92ffaSHans Petter Selasky static inline const void *cl_fmap_key(IN const cl_fmap_item_t * const p_item)
356*d6b92ffaSHans Petter Selasky {
357*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_item);
358*d6b92ffaSHans Petter Selasky 	return (p_item->p_key);
359*d6b92ffaSHans Petter Selasky }
360*d6b92ffaSHans Petter Selasky 
361*d6b92ffaSHans Petter Selasky /*
362*d6b92ffaSHans Petter Selasky * PARAMETERS
363*d6b92ffaSHans Petter Selasky *	p_item
364*d6b92ffaSHans Petter Selasky *		[in] Pointer to a map item whose key value to return.
365*d6b92ffaSHans Petter Selasky *
366*d6b92ffaSHans Petter Selasky * RETURN VALUE
367*d6b92ffaSHans Petter Selasky *	Returns the a pointer to the key value for the specified map item.
368*d6b92ffaSHans Petter Selasky *	The key value should not be modified to insure proper flexi map operation.
369*d6b92ffaSHans Petter Selasky *
370*d6b92ffaSHans Petter Selasky * NOTES
371*d6b92ffaSHans Petter Selasky *	The key value is set in a call to cl_fmap_insert.
372*d6b92ffaSHans Petter Selasky *
373*d6b92ffaSHans Petter Selasky * SEE ALSO
374*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_insert
375*d6b92ffaSHans Petter Selasky *********/
376*d6b92ffaSHans Petter Selasky 
377*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_init
378*d6b92ffaSHans Petter Selasky * NAME
379*d6b92ffaSHans Petter Selasky *	cl_fmap_init
380*d6b92ffaSHans Petter Selasky *
381*d6b92ffaSHans Petter Selasky * DESCRIPTION
382*d6b92ffaSHans Petter Selasky *	The cl_fmap_init function initialized a flexi map for use.
383*d6b92ffaSHans Petter Selasky *
384*d6b92ffaSHans Petter Selasky * SYNOPSIS
385*d6b92ffaSHans Petter Selasky */
386*d6b92ffaSHans Petter Selasky void cl_fmap_init(IN cl_fmap_t * const p_map, IN cl_pfn_fmap_cmp_t pfn_compare);
387*d6b92ffaSHans Petter Selasky /*
388*d6b92ffaSHans Petter Selasky * PARAMETERS
389*d6b92ffaSHans Petter Selasky *	p_map
390*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure to initialize.
391*d6b92ffaSHans Petter Selasky *
392*d6b92ffaSHans Petter Selasky *	pfn_compare
393*d6b92ffaSHans Petter Selasky *		[in] Pointer to the compare function used to compare keys.
394*d6b92ffaSHans Petter Selasky *		See the cl_pfn_fmap_cmp_t function type declaration for details
395*d6b92ffaSHans Petter Selasky *		about the callback function.
396*d6b92ffaSHans Petter Selasky *
397*d6b92ffaSHans Petter Selasky * RETURN VALUES
398*d6b92ffaSHans Petter Selasky *	This function does not return a value.
399*d6b92ffaSHans Petter Selasky *
400*d6b92ffaSHans Petter Selasky * NOTES
401*d6b92ffaSHans Petter Selasky *	Allows calling flexi map manipulation functions.
402*d6b92ffaSHans Petter Selasky *
403*d6b92ffaSHans Petter Selasky * SEE ALSO
404*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_insert, cl_fmap_remove
405*d6b92ffaSHans Petter Selasky *********/
406*d6b92ffaSHans Petter Selasky 
407*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_end
408*d6b92ffaSHans Petter Selasky * NAME
409*d6b92ffaSHans Petter Selasky *	cl_fmap_end
410*d6b92ffaSHans Petter Selasky *
411*d6b92ffaSHans Petter Selasky * DESCRIPTION
412*d6b92ffaSHans Petter Selasky *	The cl_fmap_end function returns the end of a flexi map.
413*d6b92ffaSHans Petter Selasky *
414*d6b92ffaSHans Petter Selasky * SYNOPSIS
415*d6b92ffaSHans Petter Selasky */
cl_fmap_end(IN const cl_fmap_t * const p_map)416*d6b92ffaSHans Petter Selasky static inline const cl_fmap_item_t *cl_fmap_end(IN const cl_fmap_t *
417*d6b92ffaSHans Petter Selasky 						const p_map)
418*d6b92ffaSHans Petter Selasky {
419*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
420*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
421*d6b92ffaSHans Petter Selasky 	/* Nil is the end of the map. */
422*d6b92ffaSHans Petter Selasky 	return (&p_map->nil);
423*d6b92ffaSHans Petter Selasky }
424*d6b92ffaSHans Petter Selasky 
425*d6b92ffaSHans Petter Selasky /*
426*d6b92ffaSHans Petter Selasky * PARAMETERS
427*d6b92ffaSHans Petter Selasky *	p_map
428*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure whose end to return.
429*d6b92ffaSHans Petter Selasky *
430*d6b92ffaSHans Petter Selasky * RETURN VALUE
431*d6b92ffaSHans Petter Selasky *	Pointer to the end of the map.
432*d6b92ffaSHans Petter Selasky *
433*d6b92ffaSHans Petter Selasky * NOTES
434*d6b92ffaSHans Petter Selasky *	cl_fmap_end is useful for determining the validity of map items returned
435*d6b92ffaSHans Petter Selasky *	by cl_fmap_head, cl_fmap_tail, cl_fmap_next, or cl_fmap_prev.  If the
436*d6b92ffaSHans Petter Selasky *	map item pointer returned by any of these functions compares to the end,
437*d6b92ffaSHans Petter Selasky *	the end of the map was encoutered.
438*d6b92ffaSHans Petter Selasky *	When using cl_fmap_head or cl_fmap_tail, this condition indicates that
439*d6b92ffaSHans Petter Selasky *	the map is empty.
440*d6b92ffaSHans Petter Selasky *
441*d6b92ffaSHans Petter Selasky * SEE ALSO
442*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_head, cl_fmap_tail, cl_fmap_next, cl_fmap_prev
443*d6b92ffaSHans Petter Selasky *********/
444*d6b92ffaSHans Petter Selasky 
445*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_head
446*d6b92ffaSHans Petter Selasky * NAME
447*d6b92ffaSHans Petter Selasky *	cl_fmap_head
448*d6b92ffaSHans Petter Selasky *
449*d6b92ffaSHans Petter Selasky * DESCRIPTION
450*d6b92ffaSHans Petter Selasky *	The cl_fmap_head function returns the map item with the lowest key
451*d6b92ffaSHans Petter Selasky *	value stored in a flexi map.
452*d6b92ffaSHans Petter Selasky *
453*d6b92ffaSHans Petter Selasky * SYNOPSIS
454*d6b92ffaSHans Petter Selasky */
cl_fmap_head(IN const cl_fmap_t * const p_map)455*d6b92ffaSHans Petter Selasky static inline cl_fmap_item_t *cl_fmap_head(IN const cl_fmap_t * const p_map)
456*d6b92ffaSHans Petter Selasky {
457*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
458*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
459*d6b92ffaSHans Petter Selasky 	return ((cl_fmap_item_t *) p_map->nil.pool_item.list_item.p_next);
460*d6b92ffaSHans Petter Selasky }
461*d6b92ffaSHans Petter Selasky 
462*d6b92ffaSHans Petter Selasky /*
463*d6b92ffaSHans Petter Selasky * PARAMETERS
464*d6b92ffaSHans Petter Selasky *	p_map
465*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure whose item with the lowest
466*d6b92ffaSHans Petter Selasky *		key is returned.
467*d6b92ffaSHans Petter Selasky *
468*d6b92ffaSHans Petter Selasky * RETURN VALUES
469*d6b92ffaSHans Petter Selasky *	Pointer to the map item with the lowest key in the flexi map.
470*d6b92ffaSHans Petter Selasky *
471*d6b92ffaSHans Petter Selasky *	Pointer to the map end if the flexi map was empty.
472*d6b92ffaSHans Petter Selasky *
473*d6b92ffaSHans Petter Selasky * NOTES
474*d6b92ffaSHans Petter Selasky *	cl_fmap_head does not remove the item from the map.
475*d6b92ffaSHans Petter Selasky *
476*d6b92ffaSHans Petter Selasky * SEE ALSO
477*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_tail, cl_fmap_next, cl_fmap_prev, cl_fmap_end,
478*d6b92ffaSHans Petter Selasky *	cl_fmap_item_t
479*d6b92ffaSHans Petter Selasky *********/
480*d6b92ffaSHans Petter Selasky 
481*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_tail
482*d6b92ffaSHans Petter Selasky * NAME
483*d6b92ffaSHans Petter Selasky *	cl_fmap_tail
484*d6b92ffaSHans Petter Selasky *
485*d6b92ffaSHans Petter Selasky * DESCRIPTION
486*d6b92ffaSHans Petter Selasky *	The cl_fmap_tail function returns the map item with the highest key
487*d6b92ffaSHans Petter Selasky *	value stored in a flexi map.
488*d6b92ffaSHans Petter Selasky *
489*d6b92ffaSHans Petter Selasky * SYNOPSIS
490*d6b92ffaSHans Petter Selasky */
cl_fmap_tail(IN const cl_fmap_t * const p_map)491*d6b92ffaSHans Petter Selasky static inline cl_fmap_item_t *cl_fmap_tail(IN const cl_fmap_t * const p_map)
492*d6b92ffaSHans Petter Selasky {
493*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
494*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
495*d6b92ffaSHans Petter Selasky 	return ((cl_fmap_item_t *) p_map->nil.pool_item.list_item.p_prev);
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_fmap_t structure whose item with the highest key
502*d6b92ffaSHans Petter Selasky *		is returned.
503*d6b92ffaSHans Petter Selasky *
504*d6b92ffaSHans Petter Selasky * RETURN VALUES
505*d6b92ffaSHans Petter Selasky *	Pointer to the map item with the highest key in the flexi map.
506*d6b92ffaSHans Petter Selasky *
507*d6b92ffaSHans Petter Selasky *	Pointer to the map end if the flexi map was empty.
508*d6b92ffaSHans Petter Selasky *
509*d6b92ffaSHans Petter Selasky * NOTES
510*d6b92ffaSHans Petter Selasky *	cl_fmap_end does not remove the item from the map.
511*d6b92ffaSHans Petter Selasky *
512*d6b92ffaSHans Petter Selasky * SEE ALSO
513*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_head, cl_fmap_next, cl_fmap_prev, cl_fmap_end,
514*d6b92ffaSHans Petter Selasky *	cl_fmap_item_t
515*d6b92ffaSHans Petter Selasky *********/
516*d6b92ffaSHans Petter Selasky 
517*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_next
518*d6b92ffaSHans Petter Selasky * NAME
519*d6b92ffaSHans Petter Selasky *	cl_fmap_next
520*d6b92ffaSHans Petter Selasky *
521*d6b92ffaSHans Petter Selasky * DESCRIPTION
522*d6b92ffaSHans Petter Selasky *	The cl_fmap_next function returns the map item with the next higher
523*d6b92ffaSHans Petter Selasky *	key value than a specified map item.
524*d6b92ffaSHans Petter Selasky *
525*d6b92ffaSHans Petter Selasky * SYNOPSIS
526*d6b92ffaSHans Petter Selasky */
cl_fmap_next(IN const cl_fmap_item_t * const p_item)527*d6b92ffaSHans Petter Selasky static inline cl_fmap_item_t *cl_fmap_next(IN const cl_fmap_item_t *
528*d6b92ffaSHans Petter Selasky 					   const p_item)
529*d6b92ffaSHans Petter Selasky {
530*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_item);
531*d6b92ffaSHans Petter Selasky 	return ((cl_fmap_item_t *) p_item->pool_item.list_item.p_next);
532*d6b92ffaSHans Petter Selasky }
533*d6b92ffaSHans Petter Selasky 
534*d6b92ffaSHans Petter Selasky /*
535*d6b92ffaSHans Petter Selasky * PARAMETERS
536*d6b92ffaSHans Petter Selasky *	p_item
537*d6b92ffaSHans Petter Selasky *		[in] Pointer to a map item whose successor to return.
538*d6b92ffaSHans Petter Selasky *
539*d6b92ffaSHans Petter Selasky * RETURN VALUES
540*d6b92ffaSHans Petter Selasky *	Pointer to the map item with the next higher key value in a flexi map.
541*d6b92ffaSHans Petter Selasky *
542*d6b92ffaSHans Petter Selasky *	Pointer to the map end if the specified item was the last item in
543*d6b92ffaSHans Petter Selasky *	the flexi map.
544*d6b92ffaSHans Petter Selasky *
545*d6b92ffaSHans Petter Selasky * SEE ALSO
546*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_head, cl_fmap_tail, cl_fmap_prev, cl_fmap_end,
547*d6b92ffaSHans Petter Selasky *	cl_fmap_item_t
548*d6b92ffaSHans Petter Selasky *********/
549*d6b92ffaSHans Petter Selasky 
550*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_prev
551*d6b92ffaSHans Petter Selasky * NAME
552*d6b92ffaSHans Petter Selasky *	cl_fmap_prev
553*d6b92ffaSHans Petter Selasky *
554*d6b92ffaSHans Petter Selasky * DESCRIPTION
555*d6b92ffaSHans Petter Selasky *	The cl_fmap_prev function returns the map item with the next lower
556*d6b92ffaSHans Petter Selasky *	key value than a precified map item.
557*d6b92ffaSHans Petter Selasky *
558*d6b92ffaSHans Petter Selasky * SYNOPSIS
559*d6b92ffaSHans Petter Selasky */
cl_fmap_prev(IN const cl_fmap_item_t * const p_item)560*d6b92ffaSHans Petter Selasky static inline cl_fmap_item_t *cl_fmap_prev(IN const cl_fmap_item_t *
561*d6b92ffaSHans Petter Selasky 					   const p_item)
562*d6b92ffaSHans Petter Selasky {
563*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_item);
564*d6b92ffaSHans Petter Selasky 	return ((cl_fmap_item_t *) p_item->pool_item.list_item.p_prev);
565*d6b92ffaSHans Petter Selasky }
566*d6b92ffaSHans Petter Selasky 
567*d6b92ffaSHans Petter Selasky /*
568*d6b92ffaSHans Petter Selasky * PARAMETERS
569*d6b92ffaSHans Petter Selasky *	p_item
570*d6b92ffaSHans Petter Selasky *		[in] Pointer to a map item whose predecessor to return.
571*d6b92ffaSHans Petter Selasky *
572*d6b92ffaSHans Petter Selasky * RETURN VALUES
573*d6b92ffaSHans Petter Selasky *	Pointer to the map item with the next lower key value in a flexi map.
574*d6b92ffaSHans Petter Selasky *
575*d6b92ffaSHans Petter Selasky *	Pointer to the map end if the specifid item was the first item in
576*d6b92ffaSHans Petter Selasky *	the flexi map.
577*d6b92ffaSHans Petter Selasky *
578*d6b92ffaSHans Petter Selasky * SEE ALSO
579*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_head, cl_fmap_tail, cl_fmap_next, cl_fmap_end,
580*d6b92ffaSHans Petter Selasky *	cl_fmap_item_t
581*d6b92ffaSHans Petter Selasky *********/
582*d6b92ffaSHans Petter Selasky 
583*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_insert
584*d6b92ffaSHans Petter Selasky * NAME
585*d6b92ffaSHans Petter Selasky *	cl_fmap_insert
586*d6b92ffaSHans Petter Selasky *
587*d6b92ffaSHans Petter Selasky * DESCRIPTION
588*d6b92ffaSHans Petter Selasky *	The cl_fmap_insert function inserts a map item into a flexi map.
589*d6b92ffaSHans Petter Selasky *
590*d6b92ffaSHans Petter Selasky * SYNOPSIS
591*d6b92ffaSHans Petter Selasky */
592*d6b92ffaSHans Petter Selasky cl_fmap_item_t *cl_fmap_insert(IN cl_fmap_t * const p_map,
593*d6b92ffaSHans Petter Selasky 			       IN const void *const p_key,
594*d6b92ffaSHans Petter Selasky 			       IN cl_fmap_item_t * const p_item);
595*d6b92ffaSHans Petter Selasky /*
596*d6b92ffaSHans Petter Selasky * PARAMETERS
597*d6b92ffaSHans Petter Selasky *	p_map
598*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure into which to add the item.
599*d6b92ffaSHans Petter Selasky *
600*d6b92ffaSHans Petter Selasky *	p_key
601*d6b92ffaSHans Petter Selasky *		[in] Pointer to the key value to assign to the item.  Storage
602*d6b92ffaSHans Petter Selasky *		for the key must be persistant, as only the pointer is stored.
603*d6b92ffaSHans Petter Selasky *		Users are responsible for maintaining the validity of key
604*d6b92ffaSHans Petter Selasky *		pointers while they are in use.
605*d6b92ffaSHans Petter Selasky *
606*d6b92ffaSHans Petter Selasky *	p_item
607*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_item_t stucture to insert into the flexi map.
608*d6b92ffaSHans Petter Selasky *
609*d6b92ffaSHans Petter Selasky * RETURN VALUE
610*d6b92ffaSHans Petter Selasky *	Pointer to the item in the map with the specified key.  If insertion
611*d6b92ffaSHans Petter Selasky *	was successful, this is the pointer to the item.  If an item with the
612*d6b92ffaSHans Petter Selasky *	specified key already exists in the map, the pointer to that item is
613*d6b92ffaSHans Petter Selasky *	returned.
614*d6b92ffaSHans Petter Selasky *
615*d6b92ffaSHans Petter Selasky * NOTES
616*d6b92ffaSHans Petter Selasky *	Insertion operations may cause the flexi map to rebalance.
617*d6b92ffaSHans Petter Selasky *
618*d6b92ffaSHans Petter Selasky * SEE ALSO
619*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_item_t
620*d6b92ffaSHans Petter Selasky *********/
621*d6b92ffaSHans Petter Selasky 
622*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_match
623*d6b92ffaSHans Petter Selasky * NAME
624*d6b92ffaSHans Petter Selasky *	cl_fmap_match
625*d6b92ffaSHans Petter Selasky *
626*d6b92ffaSHans Petter Selasky * DESCRIPTION
627*d6b92ffaSHans Petter Selasky *	The cl_fmap_match function returns the map item matching a key.
628*d6b92ffaSHans Petter Selasky *
629*d6b92ffaSHans Petter Selasky * SYNOPSIS
630*d6b92ffaSHans Petter Selasky */
631*d6b92ffaSHans Petter Selasky cl_fmap_item_t *cl_fmap_match(IN const cl_fmap_t * const p_map,
632*d6b92ffaSHans Petter Selasky 			      IN const void *const p_key,
633*d6b92ffaSHans Petter Selasky 			      IN cl_pfn_fmap_cmp_t pfn_compare);
634*d6b92ffaSHans Petter Selasky /*
635*d6b92ffaSHans Petter Selasky * PARAMETERS
636*d6b92ffaSHans Petter Selasky *	p_map
637*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure from which to retrieve the
638*d6b92ffaSHans Petter Selasky *		item with the specified key.
639*d6b92ffaSHans Petter Selasky *
640*d6b92ffaSHans Petter Selasky *	p_key
641*d6b92ffaSHans Petter Selasky *		[in] Pointer to a key value used to search for the desired map item.
642*d6b92ffaSHans Petter Selasky *
643*d6b92ffaSHans Petter Selasky *	pfn_compare
644*d6b92ffaSHans Petter Selasky *		[in] Pointer to a compare function to invoke to compare the
645*d6b92ffaSHans Petter Selasky *		keys of items in the map. Passing NULL here makes such call
646*d6b92ffaSHans Petter Selasky *		to be equivalent to using cl_fmap_get().
647*d6b92ffaSHans Petter Selasky *
648*d6b92ffaSHans Petter Selasky * RETURN VALUES
649*d6b92ffaSHans Petter Selasky *	Pointer to the map item matching the desired key value.
650*d6b92ffaSHans Petter Selasky *
651*d6b92ffaSHans Petter Selasky *	Pointer to the map end if there was no item matching the desired key
652*d6b92ffaSHans Petter Selasky *	value stored in the flexi map.
653*d6b92ffaSHans Petter Selasky *
654*d6b92ffaSHans Petter Selasky * SEE ALSO
655*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_get
656*d6b92ffaSHans Petter Selasky *********/
657*d6b92ffaSHans Petter Selasky 
658*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_get
659*d6b92ffaSHans Petter Selasky * NAME
660*d6b92ffaSHans Petter Selasky *	cl_fmap_get
661*d6b92ffaSHans Petter Selasky *
662*d6b92ffaSHans Petter Selasky * DESCRIPTION
663*d6b92ffaSHans Petter Selasky *	The cl_fmap_get function returns the map item associated with a key.
664*d6b92ffaSHans Petter Selasky *
665*d6b92ffaSHans Petter Selasky * SYNOPSIS
666*d6b92ffaSHans Petter Selasky */
667*d6b92ffaSHans Petter Selasky cl_fmap_item_t *cl_fmap_get(IN const cl_fmap_t * const p_map,
668*d6b92ffaSHans Petter Selasky 			    IN const void *const p_key);
669*d6b92ffaSHans Petter Selasky /*
670*d6b92ffaSHans Petter Selasky * PARAMETERS
671*d6b92ffaSHans Petter Selasky *	p_map
672*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure from which to retrieve the
673*d6b92ffaSHans Petter Selasky *		item with the specified key.
674*d6b92ffaSHans Petter Selasky *
675*d6b92ffaSHans Petter Selasky *	p_key
676*d6b92ffaSHans Petter Selasky *		[in] Pointer to a key value used to search for the desired map item.
677*d6b92ffaSHans Petter Selasky *
678*d6b92ffaSHans Petter Selasky * RETURN VALUES
679*d6b92ffaSHans Petter Selasky *	Pointer to the map item with the desired key value.
680*d6b92ffaSHans Petter Selasky *
681*d6b92ffaSHans Petter Selasky *	Pointer to the map end if there was no item with the desired key value
682*d6b92ffaSHans Petter Selasky *	stored in the flexi map.
683*d6b92ffaSHans Petter Selasky *
684*d6b92ffaSHans Petter Selasky * NOTES
685*d6b92ffaSHans Petter Selasky *	cl_fmap_get does not remove the item from the flexi map.
686*d6b92ffaSHans Petter Selasky *
687*d6b92ffaSHans Petter Selasky * SEE ALSO
688*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_get_next
689*d6b92ffaSHans Petter Selasky *********/
690*d6b92ffaSHans Petter Selasky 
691*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_get_next
692*d6b92ffaSHans Petter Selasky * NAME
693*d6b92ffaSHans Petter Selasky *	cl_fmap_get_next
694*d6b92ffaSHans Petter Selasky *
695*d6b92ffaSHans Petter Selasky * DESCRIPTION
696*d6b92ffaSHans Petter Selasky *	The cl_fmap_get_next function returns the first map item associated with
697*d6b92ffaSHans Petter Selasky *	a key > the key specified.
698*d6b92ffaSHans Petter Selasky *
699*d6b92ffaSHans Petter Selasky * SYNOPSIS
700*d6b92ffaSHans Petter Selasky */
701*d6b92ffaSHans Petter Selasky cl_fmap_item_t *cl_fmap_get_next(IN const cl_fmap_t * const p_map,
702*d6b92ffaSHans Petter Selasky 				 IN const void *const p_key);
703*d6b92ffaSHans Petter Selasky /*
704*d6b92ffaSHans Petter Selasky * PARAMETERS
705*d6b92ffaSHans Petter Selasky *	p_map
706*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure from which to retrieve the
707*d6b92ffaSHans Petter Selasky *		item with the specified key.
708*d6b92ffaSHans Petter Selasky *
709*d6b92ffaSHans Petter Selasky *	p_key
710*d6b92ffaSHans Petter Selasky *		[in] Pointer to a key value used to search for the desired map item.
711*d6b92ffaSHans Petter Selasky *
712*d6b92ffaSHans Petter Selasky * RETURN VALUES
713*d6b92ffaSHans Petter Selasky *	Pointer to the first map item with a key > the  desired key value.
714*d6b92ffaSHans Petter Selasky *
715*d6b92ffaSHans Petter Selasky *	Pointer to the map end if there was no item with a key > the desired key
716*d6b92ffaSHans Petter Selasky *	value stored in the flexi map.
717*d6b92ffaSHans Petter Selasky *
718*d6b92ffaSHans Petter Selasky * NOTES
719*d6b92ffaSHans Petter Selasky *	cl_fmap_get_next does not remove the item from the flexi map.
720*d6b92ffaSHans Petter Selasky *
721*d6b92ffaSHans Petter Selasky * SEE ALSO
722*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_get
723*d6b92ffaSHans Petter Selasky *********/
724*d6b92ffaSHans Petter Selasky 
725*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_remove_item
726*d6b92ffaSHans Petter Selasky * NAME
727*d6b92ffaSHans Petter Selasky *	cl_fmap_remove_item
728*d6b92ffaSHans Petter Selasky *
729*d6b92ffaSHans Petter Selasky * DESCRIPTION
730*d6b92ffaSHans Petter Selasky *	The cl_fmap_remove_item function removes the specified map item
731*d6b92ffaSHans Petter Selasky *	from a flexi map.
732*d6b92ffaSHans Petter Selasky *
733*d6b92ffaSHans Petter Selasky * SYNOPSIS
734*d6b92ffaSHans Petter Selasky */
735*d6b92ffaSHans Petter Selasky void
736*d6b92ffaSHans Petter Selasky cl_fmap_remove_item(IN cl_fmap_t * const p_map,
737*d6b92ffaSHans Petter Selasky 		    IN cl_fmap_item_t * const p_item);
738*d6b92ffaSHans Petter Selasky /*
739*d6b92ffaSHans Petter Selasky * PARAMETERS
740*d6b92ffaSHans Petter Selasky *	p_item
741*d6b92ffaSHans Petter Selasky *		[in] Pointer to a map item to remove from its flexi map.
742*d6b92ffaSHans Petter Selasky *
743*d6b92ffaSHans Petter Selasky * RETURN VALUES
744*d6b92ffaSHans Petter Selasky *	This function does not return a value.
745*d6b92ffaSHans Petter Selasky *
746*d6b92ffaSHans Petter Selasky *	In a debug build, cl_fmap_remove_item asserts that the item being
747*d6b92ffaSHans Petter Selasky *	removed is in the specified map.
748*d6b92ffaSHans Petter Selasky *
749*d6b92ffaSHans Petter Selasky * NOTES
750*d6b92ffaSHans Petter Selasky *	Removes the map item pointed to by p_item from its flexi map.
751*d6b92ffaSHans Petter Selasky *
752*d6b92ffaSHans Petter Selasky * SEE ALSO
753*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_remove_all, cl_fmap_insert
754*d6b92ffaSHans Petter Selasky *********/
755*d6b92ffaSHans Petter Selasky 
756*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_remove
757*d6b92ffaSHans Petter Selasky * NAME
758*d6b92ffaSHans Petter Selasky *	cl_fmap_remove
759*d6b92ffaSHans Petter Selasky *
760*d6b92ffaSHans Petter Selasky * DESCRIPTION
761*d6b92ffaSHans Petter Selasky *	The cl_fmap_remove function removes the map item with the specified key
762*d6b92ffaSHans Petter Selasky *	from a flexi map.
763*d6b92ffaSHans Petter Selasky *
764*d6b92ffaSHans Petter Selasky * SYNOPSIS
765*d6b92ffaSHans Petter Selasky */
766*d6b92ffaSHans Petter Selasky cl_fmap_item_t *cl_fmap_remove(IN cl_fmap_t * const p_map,
767*d6b92ffaSHans Petter Selasky 			       IN const void *const p_key);
768*d6b92ffaSHans Petter Selasky /*
769*d6b92ffaSHans Petter Selasky * PARAMETERS
770*d6b92ffaSHans Petter Selasky *	p_map
771*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure from which to remove the
772*d6b92ffaSHans Petter Selasky *		item with the specified key.
773*d6b92ffaSHans Petter Selasky *
774*d6b92ffaSHans Petter Selasky *	p_key
775*d6b92ffaSHans Petter Selasky *		[in] Pointer to the key value used to search for the map item
776*d6b92ffaSHans Petter Selasky *		to remove.
777*d6b92ffaSHans Petter Selasky *
778*d6b92ffaSHans Petter Selasky * RETURN VALUES
779*d6b92ffaSHans Petter Selasky *	Pointer to the removed map item if it was found.
780*d6b92ffaSHans Petter Selasky *
781*d6b92ffaSHans Petter Selasky *	Pointer to the map end if no item with the specified key exists in the
782*d6b92ffaSHans Petter Selasky *	flexi map.
783*d6b92ffaSHans Petter Selasky *
784*d6b92ffaSHans Petter Selasky * SEE ALSO
785*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove_item, cl_fmap_remove_all, cl_fmap_insert
786*d6b92ffaSHans Petter Selasky *********/
787*d6b92ffaSHans Petter Selasky 
788*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_remove_all
789*d6b92ffaSHans Petter Selasky * NAME
790*d6b92ffaSHans Petter Selasky *	cl_fmap_remove_all
791*d6b92ffaSHans Petter Selasky *
792*d6b92ffaSHans Petter Selasky * DESCRIPTION
793*d6b92ffaSHans Petter Selasky *	The cl_fmap_remove_all function removes all items in a flexi map,
794*d6b92ffaSHans Petter Selasky *	leaving it empty.
795*d6b92ffaSHans Petter Selasky *
796*d6b92ffaSHans Petter Selasky * SYNOPSIS
797*d6b92ffaSHans Petter Selasky */
cl_fmap_remove_all(IN cl_fmap_t * const p_map)798*d6b92ffaSHans Petter Selasky static inline void cl_fmap_remove_all(IN cl_fmap_t * const p_map)
799*d6b92ffaSHans Petter Selasky {
800*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map);
801*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_map->state == CL_INITIALIZED);
802*d6b92ffaSHans Petter Selasky 
803*d6b92ffaSHans Petter Selasky 	p_map->root.p_left = &p_map->nil;
804*d6b92ffaSHans Petter Selasky 	p_map->nil.pool_item.list_item.p_next = &p_map->nil.pool_item.list_item;
805*d6b92ffaSHans Petter Selasky 	p_map->nil.pool_item.list_item.p_prev = &p_map->nil.pool_item.list_item;
806*d6b92ffaSHans Petter Selasky 	p_map->count = 0;
807*d6b92ffaSHans Petter Selasky }
808*d6b92ffaSHans Petter Selasky 
809*d6b92ffaSHans Petter Selasky /*
810*d6b92ffaSHans Petter Selasky * PARAMETERS
811*d6b92ffaSHans Petter Selasky *	p_map
812*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure to empty.
813*d6b92ffaSHans Petter Selasky *
814*d6b92ffaSHans Petter Selasky * RETURN VALUES
815*d6b92ffaSHans Petter Selasky *	This function does not return a value.
816*d6b92ffaSHans Petter Selasky *
817*d6b92ffaSHans Petter Selasky * SEE ALSO
818*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_remove, cl_fmap_remove_item
819*d6b92ffaSHans Petter Selasky *********/
820*d6b92ffaSHans Petter Selasky 
821*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_merge
822*d6b92ffaSHans Petter Selasky * NAME
823*d6b92ffaSHans Petter Selasky *	cl_fmap_merge
824*d6b92ffaSHans Petter Selasky *
825*d6b92ffaSHans Petter Selasky * DESCRIPTION
826*d6b92ffaSHans Petter Selasky *	The cl_fmap_merge function moves all items from one map to another,
827*d6b92ffaSHans Petter Selasky *	excluding duplicates.
828*d6b92ffaSHans Petter Selasky *
829*d6b92ffaSHans Petter Selasky * SYNOPSIS
830*d6b92ffaSHans Petter Selasky */
831*d6b92ffaSHans Petter Selasky void
832*d6b92ffaSHans Petter Selasky cl_fmap_merge(OUT cl_fmap_t * const p_dest_map,
833*d6b92ffaSHans Petter Selasky 	      IN OUT cl_fmap_t * const p_src_map);
834*d6b92ffaSHans Petter Selasky /*
835*d6b92ffaSHans Petter Selasky * PARAMETERS
836*d6b92ffaSHans Petter Selasky *	p_dest_map
837*d6b92ffaSHans Petter Selasky *		[out] Pointer to a cl_fmap_t structure to which items should be added.
838*d6b92ffaSHans Petter Selasky *
839*d6b92ffaSHans Petter Selasky *	p_src_map
840*d6b92ffaSHans Petter Selasky *		[in/out] Pointer to a cl_fmap_t structure whose items to add
841*d6b92ffaSHans Petter Selasky *		to p_dest_map.
842*d6b92ffaSHans Petter Selasky *
843*d6b92ffaSHans Petter Selasky * RETURN VALUES
844*d6b92ffaSHans Petter Selasky *	This function does not return a value.
845*d6b92ffaSHans Petter Selasky *
846*d6b92ffaSHans Petter Selasky * NOTES
847*d6b92ffaSHans Petter Selasky *	Items are evaluated based on their keys only.
848*d6b92ffaSHans Petter Selasky *
849*d6b92ffaSHans Petter Selasky *	Upon return from cl_fmap_merge, the flexi map referenced by p_src_map
850*d6b92ffaSHans Petter Selasky *	contains all duplicate items.
851*d6b92ffaSHans Petter Selasky *
852*d6b92ffaSHans Petter Selasky * SEE ALSO
853*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_delta
854*d6b92ffaSHans Petter Selasky *********/
855*d6b92ffaSHans Petter Selasky 
856*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_delta
857*d6b92ffaSHans Petter Selasky * NAME
858*d6b92ffaSHans Petter Selasky *	cl_fmap_delta
859*d6b92ffaSHans Petter Selasky *
860*d6b92ffaSHans Petter Selasky * DESCRIPTION
861*d6b92ffaSHans Petter Selasky *	The cl_fmap_delta function computes the differences between two maps.
862*d6b92ffaSHans Petter Selasky *
863*d6b92ffaSHans Petter Selasky * SYNOPSIS
864*d6b92ffaSHans Petter Selasky */
865*d6b92ffaSHans Petter Selasky void
866*d6b92ffaSHans Petter Selasky cl_fmap_delta(IN OUT cl_fmap_t * const p_map1,
867*d6b92ffaSHans Petter Selasky 	      IN OUT cl_fmap_t * const p_map2,
868*d6b92ffaSHans Petter Selasky 	      OUT cl_fmap_t * const p_new, OUT cl_fmap_t * const p_old);
869*d6b92ffaSHans Petter Selasky /*
870*d6b92ffaSHans Petter Selasky * PARAMETERS
871*d6b92ffaSHans Petter Selasky *	p_map1
872*d6b92ffaSHans Petter Selasky *		[in/out] Pointer to the first of two cl_fmap_t structures whose
873*d6b92ffaSHans Petter Selasky *		differences to compute.
874*d6b92ffaSHans Petter Selasky *
875*d6b92ffaSHans Petter Selasky *	p_map2
876*d6b92ffaSHans Petter Selasky *		[in/out] Pointer to the second of two cl_fmap_t structures whose
877*d6b92ffaSHans Petter Selasky *		differences to compute.
878*d6b92ffaSHans Petter Selasky *
879*d6b92ffaSHans Petter Selasky *	p_new
880*d6b92ffaSHans Petter Selasky *		[out] Pointer to an empty cl_fmap_t structure that contains the
881*d6b92ffaSHans Petter Selasky *		items unique to p_map2 upon return from the function.
882*d6b92ffaSHans Petter Selasky *
883*d6b92ffaSHans Petter Selasky *	p_old
884*d6b92ffaSHans Petter Selasky *		[out] Pointer to an empty cl_fmap_t structure that contains the
885*d6b92ffaSHans Petter Selasky *		items unique to p_map1 upon return from the function.
886*d6b92ffaSHans Petter Selasky *
887*d6b92ffaSHans Petter Selasky * RETURN VALUES
888*d6b92ffaSHans Petter Selasky *	This function does not return a value.
889*d6b92ffaSHans Petter Selasky *
890*d6b92ffaSHans Petter Selasky * NOTES
891*d6b92ffaSHans Petter Selasky *	Items are evaluated based on their keys.  Items that exist in both
892*d6b92ffaSHans Petter Selasky *	p_map1 and p_map2 remain in their respective maps.  Items that
893*d6b92ffaSHans Petter Selasky *	exist only p_map1 are moved to p_old.  Likewise, items that exist only
894*d6b92ffaSHans Petter Selasky *	in p_map2 are moved to p_new.  This function can be useful in evaluating
895*d6b92ffaSHans Petter Selasky *	changes between two maps.
896*d6b92ffaSHans Petter Selasky *
897*d6b92ffaSHans Petter Selasky *	Both maps pointed to by p_new and p_old must be empty on input.  This
898*d6b92ffaSHans Petter Selasky *	requirement removes the possibility of failures.
899*d6b92ffaSHans Petter Selasky *
900*d6b92ffaSHans Petter Selasky * SEE ALSO
901*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_fmap_merge
902*d6b92ffaSHans Petter Selasky *********/
903*d6b92ffaSHans Petter Selasky 
904*d6b92ffaSHans Petter Selasky /****f* Component Library: Flexi Map/cl_fmap_apply_func
905*d6b92ffaSHans Petter Selasky * NAME
906*d6b92ffaSHans Petter Selasky *	cl_fmap_apply_func
907*d6b92ffaSHans Petter Selasky *
908*d6b92ffaSHans Petter Selasky * DESCRIPTION
909*d6b92ffaSHans Petter Selasky *	The cl_fmap_apply_func function executes a specified function
910*d6b92ffaSHans Petter Selasky *	for every item stored in a flexi map.
911*d6b92ffaSHans Petter Selasky *
912*d6b92ffaSHans Petter Selasky * SYNOPSIS
913*d6b92ffaSHans Petter Selasky */
914*d6b92ffaSHans Petter Selasky void
915*d6b92ffaSHans Petter Selasky cl_fmap_apply_func(IN const cl_fmap_t * const p_map,
916*d6b92ffaSHans Petter Selasky 		   IN cl_pfn_fmap_apply_t pfn_func,
917*d6b92ffaSHans Petter Selasky 		   IN const void *const context);
918*d6b92ffaSHans Petter Selasky /*
919*d6b92ffaSHans Petter Selasky * PARAMETERS
920*d6b92ffaSHans Petter Selasky *	p_map
921*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_fmap_t structure.
922*d6b92ffaSHans Petter Selasky *
923*d6b92ffaSHans Petter Selasky *	pfn_func
924*d6b92ffaSHans Petter Selasky *		[in] Function invoked for every item in the flexi map.
925*d6b92ffaSHans Petter Selasky *		See the cl_pfn_fmap_apply_t function type declaration for
926*d6b92ffaSHans Petter Selasky *		details about the callback function.
927*d6b92ffaSHans Petter Selasky *
928*d6b92ffaSHans Petter Selasky *	context
929*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
930*d6b92ffaSHans Petter Selasky *
931*d6b92ffaSHans Petter Selasky * RETURN VALUE
932*d6b92ffaSHans Petter Selasky *	This function does not return a value.
933*d6b92ffaSHans Petter Selasky *
934*d6b92ffaSHans Petter Selasky * NOTES
935*d6b92ffaSHans Petter Selasky *	The function provided must not perform any map operations, as these
936*d6b92ffaSHans Petter Selasky *	would corrupt the flexi map.
937*d6b92ffaSHans Petter Selasky *
938*d6b92ffaSHans Petter Selasky * SEE ALSO
939*d6b92ffaSHans Petter Selasky *	Flexi Map, cl_pfn_fmap_apply_t
940*d6b92ffaSHans Petter Selasky *********/
941*d6b92ffaSHans Petter Selasky 
942*d6b92ffaSHans Petter Selasky END_C_DECLS
943*d6b92ffaSHans Petter Selasky #endif				/* _CL_FLEXIMAP_H_ */
944