xref: /freebsd-src/contrib/ofed/opensm/include/complib/cl_ptr_vector.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
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  *	This file contains pointer vector definitions.  Pointer Vector provides
39*d6b92ffaSHans Petter Selasky  *  dynmically resizable array functionality.
40*d6b92ffaSHans Petter Selasky  */
41*d6b92ffaSHans Petter Selasky 
42*d6b92ffaSHans Petter Selasky #ifndef _CL_PTR_VECTOR_H_
43*d6b92ffaSHans Petter Selasky #define _CL_PTR_VECTOR_H_
44*d6b92ffaSHans Petter Selasky 
45*d6b92ffaSHans Petter Selasky #include <complib/cl_types.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/Pointer Vector
57*d6b92ffaSHans Petter Selasky * NAME
58*d6b92ffaSHans Petter Selasky *	Pointer Vector
59*d6b92ffaSHans Petter Selasky *
60*d6b92ffaSHans Petter Selasky * DESCRIPTION
61*d6b92ffaSHans Petter Selasky *	The Pointer Vector is a self-sizing array of pointers. Like a traditonal
62*d6b92ffaSHans Petter Selasky *	array, a pointer vector allows efficient constant time access to elements
63*d6b92ffaSHans Petter Selasky *	with a specified index.  A pointer vector grows transparently as the
64*d6b92ffaSHans Petter Selasky *	user adds elements to the array.
65*d6b92ffaSHans Petter Selasky *
66*d6b92ffaSHans Petter Selasky *	The cl_pointer vector_t structure should be treated as opaque and should be
67*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
68*d6b92ffaSHans Petter Selasky *
69*d6b92ffaSHans Petter Selasky * SEE ALSO
70*d6b92ffaSHans Petter Selasky *	Structures:
71*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_t
72*d6b92ffaSHans Petter Selasky *
73*d6b92ffaSHans Petter Selasky *	Callbacks:
74*d6b92ffaSHans Petter Selasky *		cl_pfn_ptr_vec_apply_t, cl_pfn_ptr_vec_find_t
75*d6b92ffaSHans Petter Selasky *
76*d6b92ffaSHans Petter Selasky *	Item Manipulation:
77*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_set, cl_ptr_vector_obj
78*d6b92ffaSHans Petter Selasky *
79*d6b92ffaSHans Petter Selasky *	Initialization:
80*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_construct, cl_ptr_vector_init, cl_ptr_vector_destroy
81*d6b92ffaSHans Petter Selasky *
82*d6b92ffaSHans Petter Selasky *	Manipulation:
83*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_get_capacity, cl_ptr_vector_set_capacity,
84*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_get_size, cl_ptr_vector_set_size, cl_ptr_vector_set_min_size
85*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_get_ptr, cl_ptr_vector_get, cl_ptr_vector_at, cl_ptr_vector_set
86*d6b92ffaSHans Petter Selasky *
87*d6b92ffaSHans Petter Selasky *	Search:
88*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_find_from_start, cl_ptr_vector_find_from_end
89*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_apply_func
90*d6b92ffaSHans Petter Selasky *********/
91*d6b92ffaSHans Petter Selasky /****d* Component Library: Pointer Vector/cl_pfn_ptr_vec_apply_t
92*d6b92ffaSHans Petter Selasky * NAME
93*d6b92ffaSHans Petter Selasky *	cl_pfn_ptr_vec_apply_t
94*d6b92ffaSHans Petter Selasky *
95*d6b92ffaSHans Petter Selasky * DESCRIPTION
96*d6b92ffaSHans Petter Selasky *	The cl_pfn_ptr_vec_apply_t function type defines the prototype for
97*d6b92ffaSHans Petter Selasky *	functions used to iterate elements in a pointer vector.
98*d6b92ffaSHans Petter Selasky *
99*d6b92ffaSHans Petter Selasky * SYNOPSIS
100*d6b92ffaSHans Petter Selasky */
101*d6b92ffaSHans Petter Selasky typedef void
102*d6b92ffaSHans Petter Selasky  (*cl_pfn_ptr_vec_apply_t) (IN const size_t index,
103*d6b92ffaSHans Petter Selasky 			    IN void *const element, IN void *context);
104*d6b92ffaSHans Petter Selasky /*
105*d6b92ffaSHans Petter Selasky * PARAMETERS
106*d6b92ffaSHans Petter Selasky *	index
107*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
108*d6b92ffaSHans Petter Selasky *
109*d6b92ffaSHans Petter Selasky *	p_element
110*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element at the specified index in the pointer vector.
111*d6b92ffaSHans Petter Selasky *
112*d6b92ffaSHans Petter Selasky *	context
113*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_ptr_vector_apply_func.
114*d6b92ffaSHans Petter Selasky *
115*d6b92ffaSHans Petter Selasky * RETURN VALUE
116*d6b92ffaSHans Petter Selasky *	This function does not return a value.
117*d6b92ffaSHans Petter Selasky *
118*d6b92ffaSHans Petter Selasky * NOTES
119*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
120*d6b92ffaSHans Petter Selasky *	the function passed by users as a parameter to the cl_ptr_vector_apply_func
121*d6b92ffaSHans Petter Selasky *	function.
122*d6b92ffaSHans Petter Selasky *
123*d6b92ffaSHans Petter Selasky * SEE ALSO
124*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_apply_func
125*d6b92ffaSHans Petter Selasky *********/
126*d6b92ffaSHans Petter Selasky 
127*d6b92ffaSHans Petter Selasky /****d* Component Library: Pointer Vector/cl_pfn_ptr_vec_find_t
128*d6b92ffaSHans Petter Selasky * NAME
129*d6b92ffaSHans Petter Selasky *	cl_pfn_ptr_vec_find_t
130*d6b92ffaSHans Petter Selasky *
131*d6b92ffaSHans Petter Selasky * DESCRIPTION
132*d6b92ffaSHans Petter Selasky *	The cl_pfn_ptr_vec_find_t function type defines the prototype for
133*d6b92ffaSHans Petter Selasky *	functions used to find elements in a pointer vector.
134*d6b92ffaSHans Petter Selasky *
135*d6b92ffaSHans Petter Selasky * SYNOPSIS
136*d6b92ffaSHans Petter Selasky */
137*d6b92ffaSHans Petter Selasky typedef cl_status_t
138*d6b92ffaSHans Petter Selasky     (*cl_pfn_ptr_vec_find_t) (IN const size_t index,
139*d6b92ffaSHans Petter Selasky 			      IN const void *const element, IN void *context);
140*d6b92ffaSHans Petter Selasky /*
141*d6b92ffaSHans Petter Selasky * PARAMETERS
142*d6b92ffaSHans Petter Selasky *	index
143*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
144*d6b92ffaSHans Petter Selasky *
145*d6b92ffaSHans Petter Selasky *	p_element
146*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element at the specified index in the
147*d6b92ffaSHans Petter Selasky *		pointer vector.
148*d6b92ffaSHans Petter Selasky *
149*d6b92ffaSHans Petter Selasky *	context
150*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_ptr_vector_find_from_start or
151*d6b92ffaSHans Petter Selasky *		cl_ptr_vector_find_from_end.
152*d6b92ffaSHans Petter Selasky *
153*d6b92ffaSHans Petter Selasky * RETURN VALUES
154*d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS if the element was found. This stops pointer vector
155*d6b92ffaSHans Petter Selasky *	iteration.
156*d6b92ffaSHans Petter Selasky *
157*d6b92ffaSHans Petter Selasky *	CL_NOT_FOUND to continue the pointer vector iteration.
158*d6b92ffaSHans Petter Selasky *
159*d6b92ffaSHans Petter Selasky * NOTES
160*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
161*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the
162*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_find_from_start and cl_ptr_vector_find_from_end functions.
163*d6b92ffaSHans Petter Selasky *
164*d6b92ffaSHans Petter Selasky * SEE ALSO
165*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_find_from_start, cl_ptr_vector_find_from_end
166*d6b92ffaSHans Petter Selasky *********/
167*d6b92ffaSHans Petter Selasky 
168*d6b92ffaSHans Petter Selasky /****s* Component Library: Pointer Vector/cl_ptr_vector_t
169*d6b92ffaSHans Petter Selasky * NAME
170*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_t
171*d6b92ffaSHans Petter Selasky *
172*d6b92ffaSHans Petter Selasky * DESCRIPTION
173*d6b92ffaSHans Petter Selasky *	Pointer Vector structure.
174*d6b92ffaSHans Petter Selasky *
175*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_t structure should be treated as opaque and should be
176*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
177*d6b92ffaSHans Petter Selasky *
178*d6b92ffaSHans Petter Selasky * SYNOPSIS
179*d6b92ffaSHans Petter Selasky */
180*d6b92ffaSHans Petter Selasky typedef struct _cl_ptr_vector {
181*d6b92ffaSHans Petter Selasky 	size_t size;
182*d6b92ffaSHans Petter Selasky 	size_t grow_size;
183*d6b92ffaSHans Petter Selasky 	size_t capacity;
184*d6b92ffaSHans Petter Selasky 	const void **p_ptr_array;
185*d6b92ffaSHans Petter Selasky 	cl_state_t state;
186*d6b92ffaSHans Petter Selasky } cl_ptr_vector_t;
187*d6b92ffaSHans Petter Selasky /*
188*d6b92ffaSHans Petter Selasky * FIELDS
189*d6b92ffaSHans Petter Selasky *	size
190*d6b92ffaSHans Petter Selasky *		 Number of elements successfully initialized in the pointer vector.
191*d6b92ffaSHans Petter Selasky *
192*d6b92ffaSHans Petter Selasky *	grow_size
193*d6b92ffaSHans Petter Selasky *		 Number of elements to allocate when growing.
194*d6b92ffaSHans Petter Selasky *
195*d6b92ffaSHans Petter Selasky *	capacity
196*d6b92ffaSHans Petter Selasky *		 total # of elements allocated.
197*d6b92ffaSHans Petter Selasky *
198*d6b92ffaSHans Petter Selasky *	alloc_list
199*d6b92ffaSHans Petter Selasky *		 List of allocations.
200*d6b92ffaSHans Petter Selasky *
201*d6b92ffaSHans Petter Selasky *	p_ptr_array
202*d6b92ffaSHans Petter Selasky *		 Internal array of pointers to elements.
203*d6b92ffaSHans Petter Selasky *
204*d6b92ffaSHans Petter Selasky *	state
205*d6b92ffaSHans Petter Selasky *		State of the pointer vector.
206*d6b92ffaSHans Petter Selasky *
207*d6b92ffaSHans Petter Selasky * SEE ALSO
208*d6b92ffaSHans Petter Selasky *	Pointer Vector
209*d6b92ffaSHans Petter Selasky *********/
210*d6b92ffaSHans Petter Selasky 
211*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_construct
212*d6b92ffaSHans Petter Selasky * NAME
213*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_construct
214*d6b92ffaSHans Petter Selasky *
215*d6b92ffaSHans Petter Selasky * DESCRIPTION
216*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_construct function constructs a pointer vector.
217*d6b92ffaSHans Petter Selasky *
218*d6b92ffaSHans Petter Selasky * SYNOPSIS
219*d6b92ffaSHans Petter Selasky */
220*d6b92ffaSHans Petter Selasky void cl_ptr_vector_construct(IN cl_ptr_vector_t * const p_vector);
221*d6b92ffaSHans Petter Selasky /*
222*d6b92ffaSHans Petter Selasky * PARAMETERS
223*d6b92ffaSHans Petter Selasky *	p_vector
224*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure to construct.
225*d6b92ffaSHans Petter Selasky *
226*d6b92ffaSHans Petter Selasky * RETURN VALUE
227*d6b92ffaSHans Petter Selasky *	This function does not return a value.
228*d6b92ffaSHans Petter Selasky *
229*d6b92ffaSHans Petter Selasky * NOTES
230*d6b92ffaSHans Petter Selasky *	Allows calling cl_ptr_vector_destroy without first calling
231*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_init.
232*d6b92ffaSHans Petter Selasky *
233*d6b92ffaSHans Petter Selasky *	Calling cl_ptr_vector_construct is a prerequisite to calling any other
234*d6b92ffaSHans Petter Selasky *	pointer vector function except cl_ptr_vector_init.
235*d6b92ffaSHans Petter Selasky *
236*d6b92ffaSHans Petter Selasky * SEE ALSO
237*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_init, cl_ptr_vector_destroy
238*d6b92ffaSHans Petter Selasky *********/
239*d6b92ffaSHans Petter Selasky 
240*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_init
241*d6b92ffaSHans Petter Selasky * NAME
242*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_init
243*d6b92ffaSHans Petter Selasky *
244*d6b92ffaSHans Petter Selasky * DESCRIPTION
245*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_init function initializes a pointer vector for use.
246*d6b92ffaSHans Petter Selasky *
247*d6b92ffaSHans Petter Selasky * SYNOPSIS
248*d6b92ffaSHans Petter Selasky */
249*d6b92ffaSHans Petter Selasky cl_status_t
250*d6b92ffaSHans Petter Selasky cl_ptr_vector_init(IN cl_ptr_vector_t * const p_vector,
251*d6b92ffaSHans Petter Selasky 		   IN const size_t min_size, IN const size_t grow_size);
252*d6b92ffaSHans Petter Selasky /*
253*d6b92ffaSHans Petter Selasky * PARAMETERS
254*d6b92ffaSHans Petter Selasky *	p_vector
255*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure to inititalize.
256*d6b92ffaSHans Petter Selasky *
257*d6b92ffaSHans Petter Selasky *	min_size
258*d6b92ffaSHans Petter Selasky *		[in] Initial number of elements.
259*d6b92ffaSHans Petter Selasky *
260*d6b92ffaSHans Petter Selasky *	grow_size
261*d6b92ffaSHans Petter Selasky *		[in] Number of elements to allocate when incrementally growing
262*d6b92ffaSHans Petter Selasky *		the pointer vector.  A value of zero disables automatic growth.
263*d6b92ffaSHans Petter Selasky *
264*d6b92ffaSHans Petter Selasky * RETURN VALUES
265*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the pointer vector was initialized successfully.
266*d6b92ffaSHans Petter Selasky *
267*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if the initialization failed.
268*d6b92ffaSHans Petter Selasky *
269*d6b92ffaSHans Petter Selasky * SEE ALSO
270*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_construct, cl_ptr_vector_destroy,
271*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set, cl_ptr_vector_get, cl_ptr_vector_at
272*d6b92ffaSHans Petter Selasky *********/
273*d6b92ffaSHans Petter Selasky 
274*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_destroy
275*d6b92ffaSHans Petter Selasky * NAME
276*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_destroy
277*d6b92ffaSHans Petter Selasky *
278*d6b92ffaSHans Petter Selasky * DESCRIPTION
279*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_destroy function destroys a pointer vector.
280*d6b92ffaSHans Petter Selasky *
281*d6b92ffaSHans Petter Selasky * SYNOPSIS
282*d6b92ffaSHans Petter Selasky */
283*d6b92ffaSHans Petter Selasky void cl_ptr_vector_destroy(IN cl_ptr_vector_t * const p_vector);
284*d6b92ffaSHans Petter Selasky /*
285*d6b92ffaSHans Petter Selasky * PARAMETERS
286*d6b92ffaSHans Petter Selasky *	p_vector
287*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure to destroy.
288*d6b92ffaSHans Petter Selasky *
289*d6b92ffaSHans Petter Selasky * RETURN VALUE
290*d6b92ffaSHans Petter Selasky *	This function does not return a value.
291*d6b92ffaSHans Petter Selasky *
292*d6b92ffaSHans Petter Selasky * NOTES
293*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_destroy frees all memory allocated for the pointer vector.
294*d6b92ffaSHans Petter Selasky *
295*d6b92ffaSHans Petter Selasky *	This function should only be called after a call to cl_ptr_vector_construct
296*d6b92ffaSHans Petter Selasky *	or cl_ptr_vector_init.
297*d6b92ffaSHans Petter Selasky *
298*d6b92ffaSHans Petter Selasky * SEE ALSO
299*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_construct, cl_ptr_vector_init
300*d6b92ffaSHans Petter Selasky *********/
301*d6b92ffaSHans Petter Selasky 
302*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_get_capacity
303*d6b92ffaSHans Petter Selasky * NAME
304*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get_capacity
305*d6b92ffaSHans Petter Selasky *
306*d6b92ffaSHans Petter Selasky * DESCRIPTION
307*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_get_capacity function returns the capacity of
308*d6b92ffaSHans Petter Selasky *	a pointer vector.
309*d6b92ffaSHans Petter Selasky *
310*d6b92ffaSHans Petter Selasky * SYNOPSIS
311*d6b92ffaSHans Petter Selasky */
312*d6b92ffaSHans Petter Selasky static inline size_t
cl_ptr_vector_get_capacity(IN const cl_ptr_vector_t * const p_vector)313*d6b92ffaSHans Petter Selasky cl_ptr_vector_get_capacity(IN const cl_ptr_vector_t * const p_vector)
314*d6b92ffaSHans Petter Selasky {
315*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
316*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
317*d6b92ffaSHans Petter Selasky 
318*d6b92ffaSHans Petter Selasky 	return (p_vector->capacity);
319*d6b92ffaSHans Petter Selasky }
320*d6b92ffaSHans Petter Selasky 
321*d6b92ffaSHans Petter Selasky /*
322*d6b92ffaSHans Petter Selasky * PARAMETERS
323*d6b92ffaSHans Petter Selasky *	p_vector
324*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose capacity to return.
325*d6b92ffaSHans Petter Selasky *
326*d6b92ffaSHans Petter Selasky * RETURN VALUE
327*d6b92ffaSHans Petter Selasky *	Capacity, in elements, of the pointer vector.
328*d6b92ffaSHans Petter Selasky *
329*d6b92ffaSHans Petter Selasky * NOTES
330*d6b92ffaSHans Petter Selasky *	The capacity is the number of elements that the pointer vector can store,
331*d6b92ffaSHans Petter Selasky *	and can be greater than the number of elements stored. To get the number
332*d6b92ffaSHans Petter Selasky *	of elements stored in the pointer vector, use cl_ptr_vector_get_size.
333*d6b92ffaSHans Petter Selasky *
334*d6b92ffaSHans Petter Selasky * SEE ALSO
335*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_set_capacity, cl_ptr_vector_get_size
336*d6b92ffaSHans Petter Selasky *********/
337*d6b92ffaSHans Petter Selasky 
338*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_get_size
339*d6b92ffaSHans Petter Selasky * NAME
340*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get_size
341*d6b92ffaSHans Petter Selasky *
342*d6b92ffaSHans Petter Selasky * DESCRIPTION
343*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_get_size function returns the size of a pointer vector.
344*d6b92ffaSHans Petter Selasky *
345*d6b92ffaSHans Petter Selasky * SYNOPSIS
346*d6b92ffaSHans Petter Selasky */
347*d6b92ffaSHans Petter Selasky static inline uint32_t
cl_ptr_vector_get_size(IN const cl_ptr_vector_t * const p_vector)348*d6b92ffaSHans Petter Selasky cl_ptr_vector_get_size(IN const cl_ptr_vector_t * const p_vector)
349*d6b92ffaSHans Petter Selasky {
350*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
351*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
352*d6b92ffaSHans Petter Selasky 	return ((uint32_t) p_vector->size);
353*d6b92ffaSHans Petter Selasky 
354*d6b92ffaSHans Petter Selasky }
355*d6b92ffaSHans Petter Selasky 
356*d6b92ffaSHans Petter Selasky /*
357*d6b92ffaSHans Petter Selasky * PARAMETERS
358*d6b92ffaSHans Petter Selasky *	p_vector
359*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose size to return.
360*d6b92ffaSHans Petter Selasky *
361*d6b92ffaSHans Petter Selasky * RETURN VALUE
362*d6b92ffaSHans Petter Selasky *	Size, in elements, of the pointer vector.
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky * SEE ALSO
365*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_set_size, cl_ptr_vector_get_capacity
366*d6b92ffaSHans Petter Selasky *********/
367*d6b92ffaSHans Petter Selasky 
368*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_get
369*d6b92ffaSHans Petter Selasky * NAME
370*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get
371*d6b92ffaSHans Petter Selasky *
372*d6b92ffaSHans Petter Selasky * DESCRIPTION
373*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_get function returns the pointer stored in a
374*d6b92ffaSHans Petter Selasky *	pointer vector at a specified index.
375*d6b92ffaSHans Petter Selasky *
376*d6b92ffaSHans Petter Selasky * SYNOPSIS
377*d6b92ffaSHans Petter Selasky */
cl_ptr_vector_get(IN const cl_ptr_vector_t * const p_vector,IN const size_t index)378*d6b92ffaSHans Petter Selasky static inline void *cl_ptr_vector_get(IN const cl_ptr_vector_t * const p_vector,
379*d6b92ffaSHans Petter Selasky 				      IN const size_t index)
380*d6b92ffaSHans Petter Selasky {
381*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
382*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
383*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->size > index);
384*d6b92ffaSHans Petter Selasky 
385*d6b92ffaSHans Petter Selasky 	return ((void *)p_vector->p_ptr_array[index]);
386*d6b92ffaSHans Petter Selasky }
387*d6b92ffaSHans Petter Selasky 
388*d6b92ffaSHans Petter Selasky /*
389*d6b92ffaSHans Petter Selasky * PARAMETERS
390*d6b92ffaSHans Petter Selasky *	p_vector
391*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure from which to get an
392*d6b92ffaSHans Petter Selasky *		element.
393*d6b92ffaSHans Petter Selasky *
394*d6b92ffaSHans Petter Selasky *	index
395*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
396*d6b92ffaSHans Petter Selasky *
397*d6b92ffaSHans Petter Selasky * RETURN VALUE
398*d6b92ffaSHans Petter Selasky *	Value of the pointer stored at the specified index.
399*d6b92ffaSHans Petter Selasky *
400*d6b92ffaSHans Petter Selasky * NOTES
401*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get provides constant access times regardless of the index.
402*d6b92ffaSHans Petter Selasky *
403*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get does not perform boundary checking. Callers are
404*d6b92ffaSHans Petter Selasky *	responsible for providing an index that is within the range of the pointer
405*d6b92ffaSHans Petter Selasky *	vector.
406*d6b92ffaSHans Petter Selasky *
407*d6b92ffaSHans Petter Selasky * SEE ALSO
408*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_at, cl_ptr_vector_set, cl_ptr_vector_get_size
409*d6b92ffaSHans Petter Selasky *********/
410*d6b92ffaSHans Petter Selasky 
411*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_at
412*d6b92ffaSHans Petter Selasky * NAME
413*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_at
414*d6b92ffaSHans Petter Selasky *
415*d6b92ffaSHans Petter Selasky * DESCRIPTION
416*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_at function copies an element stored in a pointer
417*d6b92ffaSHans Petter Selasky *	vector at a specified index, performing boundary checks.
418*d6b92ffaSHans Petter Selasky *
419*d6b92ffaSHans Petter Selasky * SYNOPSIS
420*d6b92ffaSHans Petter Selasky */
421*d6b92ffaSHans Petter Selasky cl_status_t
422*d6b92ffaSHans Petter Selasky cl_ptr_vector_at(IN const cl_ptr_vector_t * const p_vector,
423*d6b92ffaSHans Petter Selasky 		 IN const size_t index, OUT void **const p_element);
424*d6b92ffaSHans Petter Selasky /*
425*d6b92ffaSHans Petter Selasky * PARAMETERS
426*d6b92ffaSHans Petter Selasky *	p_vector
427*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure from which to get a copy of
428*d6b92ffaSHans Petter Selasky *		an element.
429*d6b92ffaSHans Petter Selasky *
430*d6b92ffaSHans Petter Selasky *	index
431*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
432*d6b92ffaSHans Petter Selasky *
433*d6b92ffaSHans Petter Selasky *	p_element
434*d6b92ffaSHans Petter Selasky *		[out] Pointer to storage for the pointer element. Contains a copy of
435*d6b92ffaSHans Petter Selasky *		the desired pointer upon successful completion of the call.
436*d6b92ffaSHans Petter Selasky *
437*d6b92ffaSHans Petter Selasky * RETURN VALUES
438*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if an element was found at the specified index.
439*d6b92ffaSHans Petter Selasky *
440*d6b92ffaSHans Petter Selasky *	CL_INVALID_SETTING if the index was out of range.
441*d6b92ffaSHans Petter Selasky *
442*d6b92ffaSHans Petter Selasky * NOTES
443*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_at provides constant time access regardless of
444*d6b92ffaSHans Petter Selasky *	the index, and performs boundary checking on the pointer vector.
445*d6b92ffaSHans Petter Selasky *
446*d6b92ffaSHans Petter Selasky *	Upon success, the p_element parameter contains a copy of the
447*d6b92ffaSHans Petter Selasky *	desired element.
448*d6b92ffaSHans Petter Selasky *
449*d6b92ffaSHans Petter Selasky * SEE ALSO
450*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_get
451*d6b92ffaSHans Petter Selasky *********/
452*d6b92ffaSHans Petter Selasky 
453*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_set
454*d6b92ffaSHans Petter Selasky * NAME
455*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set
456*d6b92ffaSHans Petter Selasky *
457*d6b92ffaSHans Petter Selasky * DESCRIPTION
458*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_set function sets the element at the specified index.
459*d6b92ffaSHans Petter Selasky *
460*d6b92ffaSHans Petter Selasky * SYNOPSIS
461*d6b92ffaSHans Petter Selasky */
462*d6b92ffaSHans Petter Selasky cl_status_t
463*d6b92ffaSHans Petter Selasky cl_ptr_vector_set(IN cl_ptr_vector_t * const p_vector,
464*d6b92ffaSHans Petter Selasky 		  IN const size_t index, IN const void *const element);
465*d6b92ffaSHans Petter Selasky /*
466*d6b92ffaSHans Petter Selasky * PARAMETERS
467*d6b92ffaSHans Petter Selasky *	p_vector
468*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure into which to store
469*d6b92ffaSHans Petter Selasky *		an element.
470*d6b92ffaSHans Petter Selasky *
471*d6b92ffaSHans Petter Selasky *	index
472*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
473*d6b92ffaSHans Petter Selasky *
474*d6b92ffaSHans Petter Selasky *	element
475*d6b92ffaSHans Petter Selasky *		[in] Pointer to store in the pointer vector.
476*d6b92ffaSHans Petter Selasky *
477*d6b92ffaSHans Petter Selasky * RETURN VALUES
478*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the element was successfully set.
479*d6b92ffaSHans Petter Selasky *
480*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if the pointer vector could not be resized to
481*d6b92ffaSHans Petter Selasky *	accommodate the new element.
482*d6b92ffaSHans Petter Selasky *
483*d6b92ffaSHans Petter Selasky * NOTES
484*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set grows the pointer vector as needed to accommodate
485*d6b92ffaSHans Petter Selasky *	the new element, unless the grow_size parameter passed into the
486*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_init function was zero.
487*d6b92ffaSHans Petter Selasky *
488*d6b92ffaSHans Petter Selasky * SEE ALSO
489*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_get
490*d6b92ffaSHans Petter Selasky *********/
491*d6b92ffaSHans Petter Selasky 
492*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_insert
493*d6b92ffaSHans Petter Selasky * NAME
494*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_insert
495*d6b92ffaSHans Petter Selasky *
496*d6b92ffaSHans Petter Selasky * DESCRIPTION
497*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_insert function inserts an element into a pointer vector.
498*d6b92ffaSHans Petter Selasky *
499*d6b92ffaSHans Petter Selasky * SYNOPSIS
500*d6b92ffaSHans Petter Selasky */
501*d6b92ffaSHans Petter Selasky static inline cl_status_t
cl_ptr_vector_insert(IN cl_ptr_vector_t * const p_vector,IN const void * const element,OUT size_t * const p_index OPTIONAL)502*d6b92ffaSHans Petter Selasky cl_ptr_vector_insert(IN cl_ptr_vector_t * const p_vector,
503*d6b92ffaSHans Petter Selasky 		     IN const void *const element,
504*d6b92ffaSHans Petter Selasky 		     OUT size_t * const p_index OPTIONAL)
505*d6b92ffaSHans Petter Selasky {
506*d6b92ffaSHans Petter Selasky 	cl_status_t status;
507*d6b92ffaSHans Petter Selasky 
508*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
509*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
510*d6b92ffaSHans Petter Selasky 
511*d6b92ffaSHans Petter Selasky 	status = cl_ptr_vector_set(p_vector, p_vector->size, element);
512*d6b92ffaSHans Petter Selasky 	if (status == CL_SUCCESS && p_index)
513*d6b92ffaSHans Petter Selasky 		*p_index = p_vector->size - 1;
514*d6b92ffaSHans Petter Selasky 
515*d6b92ffaSHans Petter Selasky 	return (status);
516*d6b92ffaSHans Petter Selasky }
517*d6b92ffaSHans Petter Selasky 
518*d6b92ffaSHans Petter Selasky /*
519*d6b92ffaSHans Petter Selasky * PARAMETERS
520*d6b92ffaSHans Petter Selasky *	p_vector
521*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure into which to store
522*d6b92ffaSHans Petter Selasky *		an element.
523*d6b92ffaSHans Petter Selasky *
524*d6b92ffaSHans Petter Selasky *	element
525*d6b92ffaSHans Petter Selasky *		[in] Pointer to store in the pointer vector.
526*d6b92ffaSHans Petter Selasky *
527*d6b92ffaSHans Petter Selasky *	p_index
528*d6b92ffaSHans Petter Selasky *		[out] Pointer to the index of the element.  Valid only if
529*d6b92ffaSHans Petter Selasky *		insertion was successful.
530*d6b92ffaSHans Petter Selasky *
531*d6b92ffaSHans Petter Selasky * RETURN VALUES
532*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the element was successfully inserted.
533*d6b92ffaSHans Petter Selasky *
534*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if the pointer vector could not be resized to
535*d6b92ffaSHans Petter Selasky *	accommodate the new element.
536*d6b92ffaSHans Petter Selasky *
537*d6b92ffaSHans Petter Selasky * NOTES
538*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_insert places the new element at the end of
539*d6b92ffaSHans Petter Selasky *	the pointer vector.
540*d6b92ffaSHans Petter Selasky *
541*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_insert grows the pointer vector as needed to accommodate
542*d6b92ffaSHans Petter Selasky *	the new element, unless the grow_size parameter passed into the
543*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_init function was zero.
544*d6b92ffaSHans Petter Selasky *
545*d6b92ffaSHans Petter Selasky * SEE ALSO
546*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_remove, cl_ptr_vector_set
547*d6b92ffaSHans Petter Selasky *********/
548*d6b92ffaSHans Petter Selasky 
549*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_remove
550*d6b92ffaSHans Petter Selasky * NAME
551*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_remove
552*d6b92ffaSHans Petter Selasky *
553*d6b92ffaSHans Petter Selasky * DESCRIPTION
554*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_remove function removes and returns the pointer stored
555*d6b92ffaSHans Petter Selasky *	in a pointer vector at a specified index.  Items beyond the removed item
556*d6b92ffaSHans Petter Selasky *	are shifted down and the size of the pointer vector is decremented.
557*d6b92ffaSHans Petter Selasky *
558*d6b92ffaSHans Petter Selasky * SYNOPSIS
559*d6b92ffaSHans Petter Selasky */
560*d6b92ffaSHans Petter Selasky void *cl_ptr_vector_remove(IN cl_ptr_vector_t * const p_vector,
561*d6b92ffaSHans Petter Selasky 			   IN const size_t index);
562*d6b92ffaSHans Petter Selasky /*
563*d6b92ffaSHans Petter Selasky * PARAMETERS
564*d6b92ffaSHans Petter Selasky *	p_vector
565*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure from which to get an
566*d6b92ffaSHans Petter Selasky *		element.
567*d6b92ffaSHans Petter Selasky *
568*d6b92ffaSHans Petter Selasky *	index
569*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
570*d6b92ffaSHans Petter Selasky *
571*d6b92ffaSHans Petter Selasky * RETURN VALUE
572*d6b92ffaSHans Petter Selasky *	Value of the pointer stored at the specified index.
573*d6b92ffaSHans Petter Selasky *
574*d6b92ffaSHans Petter Selasky * NOTES
575*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_get does not perform boundary checking. Callers are
576*d6b92ffaSHans Petter Selasky *	responsible for providing an index that is within the range of the pointer
577*d6b92ffaSHans Petter Selasky *	vector.
578*d6b92ffaSHans Petter Selasky *
579*d6b92ffaSHans Petter Selasky * SEE ALSO
580*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_insert, cl_ptr_vector_get_size
581*d6b92ffaSHans Petter Selasky *********/
582*d6b92ffaSHans Petter Selasky 
583*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_set_capacity
584*d6b92ffaSHans Petter Selasky * NAME
585*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_capacity
586*d6b92ffaSHans Petter Selasky *
587*d6b92ffaSHans Petter Selasky * DESCRIPTION
588*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_set_capacity function reserves memory in a
589*d6b92ffaSHans Petter Selasky *	pointer vector for a specified number of pointers.
590*d6b92ffaSHans Petter Selasky *
591*d6b92ffaSHans Petter Selasky * SYNOPSIS
592*d6b92ffaSHans Petter Selasky */
593*d6b92ffaSHans Petter Selasky cl_status_t
594*d6b92ffaSHans Petter Selasky cl_ptr_vector_set_capacity(IN cl_ptr_vector_t * const p_vector,
595*d6b92ffaSHans Petter Selasky 			   IN const size_t new_capacity);
596*d6b92ffaSHans Petter Selasky /*
597*d6b92ffaSHans Petter Selasky * PARAMETERS
598*d6b92ffaSHans Petter Selasky *	p_vector
599*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose capacity to set.
600*d6b92ffaSHans Petter Selasky *
601*d6b92ffaSHans Petter Selasky *	new_capacity
602*d6b92ffaSHans Petter Selasky *		[in] Total number of elements for which the pointer vector should
603*d6b92ffaSHans Petter Selasky *		allocate memory.
604*d6b92ffaSHans Petter Selasky *
605*d6b92ffaSHans Petter Selasky * RETURN VALUES
606*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the capacity was successfully set.
607*d6b92ffaSHans Petter Selasky *
608*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to satisfy the
609*d6b92ffaSHans Petter Selasky *	operation. The pointer vector is left unchanged.
610*d6b92ffaSHans Petter Selasky *
611*d6b92ffaSHans Petter Selasky * NOTES
612*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_capacity increases the capacity of the pointer vector.
613*d6b92ffaSHans Petter Selasky *	It does not change the size of the pointer vector. If the requested
614*d6b92ffaSHans Petter Selasky *	capacity is less than the current capacity, the pointer vector is left
615*d6b92ffaSHans Petter Selasky *	unchanged.
616*d6b92ffaSHans Petter Selasky *
617*d6b92ffaSHans Petter Selasky * SEE ALSO
618*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_get_capacity, cl_ptr_vector_set_size,
619*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_min_size
620*d6b92ffaSHans Petter Selasky *********/
621*d6b92ffaSHans Petter Selasky 
622*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_set_size
623*d6b92ffaSHans Petter Selasky * NAME
624*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_size
625*d6b92ffaSHans Petter Selasky *
626*d6b92ffaSHans Petter Selasky * DESCRIPTION
627*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_set_size function resizes a pointer vector, either
628*d6b92ffaSHans Petter Selasky *	increasing or decreasing its size.
629*d6b92ffaSHans Petter Selasky *
630*d6b92ffaSHans Petter Selasky * SYNOPSIS
631*d6b92ffaSHans Petter Selasky */
632*d6b92ffaSHans Petter Selasky cl_status_t
633*d6b92ffaSHans Petter Selasky cl_ptr_vector_set_size(IN cl_ptr_vector_t * const p_vector,
634*d6b92ffaSHans Petter Selasky 		       IN const size_t size);
635*d6b92ffaSHans Petter Selasky /*
636*d6b92ffaSHans Petter Selasky * PARAMETERS
637*d6b92ffaSHans Petter Selasky *	p_vector
638*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose size to set.
639*d6b92ffaSHans Petter Selasky *
640*d6b92ffaSHans Petter Selasky *	size
641*d6b92ffaSHans Petter Selasky *		[in] Number of elements desired in the pointer vector.
642*d6b92ffaSHans Petter Selasky *
643*d6b92ffaSHans Petter Selasky * RETURN VALUES
644*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the size of the pointer vector was set successfully.
645*d6b92ffaSHans Petter Selasky *
646*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to complete the
647*d6b92ffaSHans Petter Selasky *	operation. The pointer vector is left unchanged.
648*d6b92ffaSHans Petter Selasky *
649*d6b92ffaSHans Petter Selasky * NOTES
650*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_size sets the pointer vector to the specified size.
651*d6b92ffaSHans Petter Selasky *	If size is smaller than the current size of the pointer vector, the size
652*d6b92ffaSHans Petter Selasky *	is reduced.
653*d6b92ffaSHans Petter Selasky *
654*d6b92ffaSHans Petter Selasky *	This function can only fail if size is larger than the current capacity.
655*d6b92ffaSHans Petter Selasky *
656*d6b92ffaSHans Petter Selasky * SEE ALSO
657*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_get_size, cl_ptr_vector_set_min_size,
658*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_capacity
659*d6b92ffaSHans Petter Selasky *********/
660*d6b92ffaSHans Petter Selasky 
661*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_set_min_size
662*d6b92ffaSHans Petter Selasky * NAME
663*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_min_size
664*d6b92ffaSHans Petter Selasky *
665*d6b92ffaSHans Petter Selasky * DESCRIPTION
666*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_set_min_size function resizes a pointer vector to a
667*d6b92ffaSHans Petter Selasky *	specified size if the pointer vector is smaller than the specified size.
668*d6b92ffaSHans Petter Selasky *
669*d6b92ffaSHans Petter Selasky * SYNOPSIS
670*d6b92ffaSHans Petter Selasky */
671*d6b92ffaSHans Petter Selasky cl_status_t
672*d6b92ffaSHans Petter Selasky cl_ptr_vector_set_min_size(IN cl_ptr_vector_t * const p_vector,
673*d6b92ffaSHans Petter Selasky 			   IN const size_t min_size);
674*d6b92ffaSHans Petter Selasky /*
675*d6b92ffaSHans Petter Selasky * PARAMETERS
676*d6b92ffaSHans Petter Selasky *	p_vector
677*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose minimum size to set.
678*d6b92ffaSHans Petter Selasky *
679*d6b92ffaSHans Petter Selasky *	min_size
680*d6b92ffaSHans Petter Selasky *		[in] Minimum number of elements that the pointer vector should contain.
681*d6b92ffaSHans Petter Selasky *
682*d6b92ffaSHans Petter Selasky * RETURN VALUES
683*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the pointer vector size is greater than or equal to min_size.
684*d6b92ffaSHans Petter Selasky *	This could indicate that the pointer vector's capacity was increased to
685*d6b92ffaSHans Petter Selasky *	min_size or that the pointer vector was already of sufficient size.
686*d6b92ffaSHans Petter Selasky *
687*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to resize the
688*d6b92ffaSHans Petter Selasky *	pointer vector.  The pointer vector is left unchanged.
689*d6b92ffaSHans Petter Selasky *
690*d6b92ffaSHans Petter Selasky * NOTES
691*d6b92ffaSHans Petter Selasky *	If min_size is smaller than the current size of the pointer vector,
692*d6b92ffaSHans Petter Selasky *	the pointer vector is unchanged. The pointer vector is unchanged if the
693*d6b92ffaSHans Petter Selasky *	size could not be changed due to insufficient memory being available to
694*d6b92ffaSHans Petter Selasky *	perform the operation.
695*d6b92ffaSHans Petter Selasky *
696*d6b92ffaSHans Petter Selasky * SEE ALSO
697*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_get_size, cl_ptr_vector_set_size,
698*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_set_capacity
699*d6b92ffaSHans Petter Selasky *********/
700*d6b92ffaSHans Petter Selasky 
701*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_apply_func
702*d6b92ffaSHans Petter Selasky * NAME
703*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_apply_func
704*d6b92ffaSHans Petter Selasky *
705*d6b92ffaSHans Petter Selasky * DESCRIPTION
706*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_apply_func function invokes a specified function for
707*d6b92ffaSHans Petter Selasky *	every element in a pointer vector.
708*d6b92ffaSHans Petter Selasky *
709*d6b92ffaSHans Petter Selasky * SYNOPSIS
710*d6b92ffaSHans Petter Selasky */
711*d6b92ffaSHans Petter Selasky void
712*d6b92ffaSHans Petter Selasky cl_ptr_vector_apply_func(IN const cl_ptr_vector_t * const p_vector,
713*d6b92ffaSHans Petter Selasky 			 IN cl_pfn_ptr_vec_apply_t pfn_callback,
714*d6b92ffaSHans Petter Selasky 			 IN const void *const context);
715*d6b92ffaSHans Petter Selasky /*
716*d6b92ffaSHans Petter Selasky * PARAMETERS
717*d6b92ffaSHans Petter Selasky *	p_vector
718*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure whose elements to iterate.
719*d6b92ffaSHans Petter Selasky *
720*d6b92ffaSHans Petter Selasky *	pfn_callback
721*d6b92ffaSHans Petter Selasky *		[in] Function invoked for every element in the array.
722*d6b92ffaSHans Petter Selasky *		See the cl_pfn_ptr_vec_apply_t function type declaration for details
723*d6b92ffaSHans Petter Selasky *		about the callback function.
724*d6b92ffaSHans Petter Selasky *
725*d6b92ffaSHans Petter Selasky *	context
726*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
727*d6b92ffaSHans Petter Selasky *
728*d6b92ffaSHans Petter Selasky * RETURN VALUE
729*d6b92ffaSHans Petter Selasky *	This function does not return a value.
730*d6b92ffaSHans Petter Selasky *
731*d6b92ffaSHans Petter Selasky * NOTES
732*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_apply_func invokes the specified function for every element
733*d6b92ffaSHans Petter Selasky *	in the pointer vector, starting from the beginning of the pointer vector.
734*d6b92ffaSHans Petter Selasky *
735*d6b92ffaSHans Petter Selasky * SEE ALSO
736*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_find_from_start, cl_ptr_vector_find_from_end,
737*d6b92ffaSHans Petter Selasky *	cl_pfn_ptr_vec_apply_t
738*d6b92ffaSHans Petter Selasky *********/
739*d6b92ffaSHans Petter Selasky 
740*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_find_from_start
741*d6b92ffaSHans Petter Selasky * NAME
742*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_find_from_start
743*d6b92ffaSHans Petter Selasky *
744*d6b92ffaSHans Petter Selasky * DESCRIPTION
745*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_find_from_start function uses a specified function to
746*d6b92ffaSHans Petter Selasky *	search for elements in a pointer vector starting from the lowest index.
747*d6b92ffaSHans Petter Selasky *
748*d6b92ffaSHans Petter Selasky * SYNOPSIS
749*d6b92ffaSHans Petter Selasky */
750*d6b92ffaSHans Petter Selasky size_t
751*d6b92ffaSHans Petter Selasky cl_ptr_vector_find_from_start(IN const cl_ptr_vector_t * const p_vector,
752*d6b92ffaSHans Petter Selasky 			      IN cl_pfn_ptr_vec_find_t pfn_callback,
753*d6b92ffaSHans Petter Selasky 			      IN const void *const context);
754*d6b92ffaSHans Petter Selasky /*
755*d6b92ffaSHans Petter Selasky * PARAMETERS
756*d6b92ffaSHans Petter Selasky *	p_vector
757*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure to inititalize.
758*d6b92ffaSHans Petter Selasky *
759*d6b92ffaSHans Petter Selasky *	pfn_callback
760*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
761*d6b92ffaSHans Petter Selasky *		See the cl_pfn_ptr_vec_find_t function type declaration for details
762*d6b92ffaSHans Petter Selasky *		about the callback function.
763*d6b92ffaSHans Petter Selasky *
764*d6b92ffaSHans Petter Selasky *	context
765*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
766*d6b92ffaSHans Petter Selasky *
767*d6b92ffaSHans Petter Selasky * RETURN VALUES
768*d6b92ffaSHans Petter Selasky *	Index of the element, if found.
769*d6b92ffaSHans Petter Selasky *
770*d6b92ffaSHans Petter Selasky *	Size of the pointer vector if the element was not found.
771*d6b92ffaSHans Petter Selasky *
772*d6b92ffaSHans Petter Selasky * NOTES
773*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_find_from_start does not remove the found element from
774*d6b92ffaSHans Petter Selasky *	the pointer vector. The index of the element is returned when the function
775*d6b92ffaSHans Petter Selasky *	provided by the pfn_callback parameter returns CL_SUCCESS.
776*d6b92ffaSHans Petter Selasky *
777*d6b92ffaSHans Petter Selasky * SEE ALSO
778*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_find_from_end, cl_ptr_vector_apply_func,
779*d6b92ffaSHans Petter Selasky *	cl_pfn_ptr_vec_find_t
780*d6b92ffaSHans Petter Selasky *********/
781*d6b92ffaSHans Petter Selasky 
782*d6b92ffaSHans Petter Selasky /****f* Component Library: Pointer Vector/cl_ptr_vector_find_from_end
783*d6b92ffaSHans Petter Selasky * NAME
784*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_find_from_end
785*d6b92ffaSHans Petter Selasky *
786*d6b92ffaSHans Petter Selasky * DESCRIPTION
787*d6b92ffaSHans Petter Selasky *	The cl_ptr_vector_find_from_end function uses a specified function to
788*d6b92ffaSHans Petter Selasky *	search for elements in a pointer vector starting from the highest index.
789*d6b92ffaSHans Petter Selasky *
790*d6b92ffaSHans Petter Selasky * SYNOPSIS
791*d6b92ffaSHans Petter Selasky */
792*d6b92ffaSHans Petter Selasky size_t
793*d6b92ffaSHans Petter Selasky cl_ptr_vector_find_from_end(IN const cl_ptr_vector_t * const p_vector,
794*d6b92ffaSHans Petter Selasky 			    IN cl_pfn_ptr_vec_find_t pfn_callback,
795*d6b92ffaSHans Petter Selasky 			    IN const void *const context);
796*d6b92ffaSHans Petter Selasky /*
797*d6b92ffaSHans Petter Selasky * PARAMETERS
798*d6b92ffaSHans Petter Selasky *	p_vector
799*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_ptr_vector_t structure to inititalize.
800*d6b92ffaSHans Petter Selasky *
801*d6b92ffaSHans Petter Selasky *	pfn_callback
802*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
803*d6b92ffaSHans Petter Selasky *		See the cl_pfn_ptr_vec_find_t function type declaration for details
804*d6b92ffaSHans Petter Selasky *		about the callback function.
805*d6b92ffaSHans Petter Selasky *
806*d6b92ffaSHans Petter Selasky *	context
807*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
808*d6b92ffaSHans Petter Selasky *
809*d6b92ffaSHans Petter Selasky * RETURN VALUES
810*d6b92ffaSHans Petter Selasky *	Index of the element, if found.
811*d6b92ffaSHans Petter Selasky *
812*d6b92ffaSHans Petter Selasky *	Size of the pointer vector if the element was not found.
813*d6b92ffaSHans Petter Selasky *
814*d6b92ffaSHans Petter Selasky * NOTES
815*d6b92ffaSHans Petter Selasky *	cl_ptr_vector_find_from_end does not remove the found element from
816*d6b92ffaSHans Petter Selasky *	the pointer vector. The index of the element is returned when the function
817*d6b92ffaSHans Petter Selasky *	provided by the pfn_callback parameter returns CL_SUCCESS.
818*d6b92ffaSHans Petter Selasky *
819*d6b92ffaSHans Petter Selasky * SEE ALSO
820*d6b92ffaSHans Petter Selasky *	Pointer Vector, cl_ptr_vector_find_from_start, cl_ptr_vector_apply_func,
821*d6b92ffaSHans Petter Selasky *	cl_pfn_ptr_vec_find_t
822*d6b92ffaSHans Petter Selasky *********/
823*d6b92ffaSHans Petter Selasky 
824*d6b92ffaSHans Petter Selasky END_C_DECLS
825*d6b92ffaSHans Petter Selasky #endif				/* _CL_PTR_VECTOR_H_ */
826