xref: /freebsd-src/contrib/ofed/opensm/include/complib/cl_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 vector definitions.  Vector provides dynmically
39*d6b92ffaSHans Petter Selasky  *	resizable array functionality.  Objects in a Vector are not relocated
40*d6b92ffaSHans Petter Selasky  *	when the array is resized.
41*d6b92ffaSHans Petter Selasky  */
42*d6b92ffaSHans Petter Selasky 
43*d6b92ffaSHans Petter Selasky #ifndef _CL_VECTOR_H_
44*d6b92ffaSHans Petter Selasky #define _CL_VECTOR_H_
45*d6b92ffaSHans Petter Selasky 
46*d6b92ffaSHans Petter Selasky #include <complib/cl_qlist.h>
47*d6b92ffaSHans Petter Selasky 
48*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
49*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
50*d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
51*d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
52*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
53*d6b92ffaSHans Petter Selasky #  define END_C_DECLS
54*d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
55*d6b92ffaSHans Petter Selasky 
56*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
57*d6b92ffaSHans Petter Selasky /****h* Component Library/Vector
58*d6b92ffaSHans Petter Selasky * NAME
59*d6b92ffaSHans Petter Selasky *	Vector
60*d6b92ffaSHans Petter Selasky *
61*d6b92ffaSHans Petter Selasky * DESCRIPTION
62*d6b92ffaSHans Petter Selasky *	The Vector is a self-sizing array. Like a traditonal array, a vector
63*d6b92ffaSHans Petter Selasky *	allows efficient constant time access to elements with a specified index.
64*d6b92ffaSHans Petter Selasky *	A vector grows transparently as the user adds elements to the array.
65*d6b92ffaSHans Petter Selasky *
66*d6b92ffaSHans Petter Selasky *	As the vector grows in size, it does not relocate existing elements in
67*d6b92ffaSHans Petter Selasky *	memory. This allows using pointers to elements stored in a Vector.
68*d6b92ffaSHans Petter Selasky *
69*d6b92ffaSHans Petter Selasky *	Users can supply an initializer functions that allow a vector to ensure
70*d6b92ffaSHans Petter Selasky *	that new items added to the vector are properly initialized. A vector
71*d6b92ffaSHans Petter Selasky *	calls the initializer function on a per object basis when growing the
72*d6b92ffaSHans Petter Selasky *	array. The initializer is optional.
73*d6b92ffaSHans Petter Selasky *
74*d6b92ffaSHans Petter Selasky *	The initializer function can fail, and returns a cl_status_t. The vector
75*d6b92ffaSHans Petter Selasky *	will call the destructor function, if provided, for an element that
76*d6b92ffaSHans Petter Selasky *	failed initialization. If an initializer fails, a vector does not call
77*d6b92ffaSHans Petter Selasky *	the initializer for objects in the remainder of the new memory allocation.
78*d6b92ffaSHans Petter Selasky *
79*d6b92ffaSHans Petter Selasky *	The cl_vector_t structure should be treated as opaque and should be
80*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
81*d6b92ffaSHans Petter Selasky *
82*d6b92ffaSHans Petter Selasky * SEE ALSO
83*d6b92ffaSHans Petter Selasky *	Structures:
84*d6b92ffaSHans Petter Selasky *		cl_vector_t
85*d6b92ffaSHans Petter Selasky *
86*d6b92ffaSHans Petter Selasky *	Callbacks:
87*d6b92ffaSHans Petter Selasky *		cl_pfn_vec_init_t, cl_pfn_vec_dtor_t, cl_pfn_vec_apply_t,
88*d6b92ffaSHans Petter Selasky *		cl_pfn_vec_find_t
89*d6b92ffaSHans Petter Selasky *
90*d6b92ffaSHans Petter Selasky *	Item Manipulation:
91*d6b92ffaSHans Petter Selasky *		cl_vector_set_obj, cl_vector_obj
92*d6b92ffaSHans Petter Selasky *
93*d6b92ffaSHans Petter Selasky *	Initialization:
94*d6b92ffaSHans Petter Selasky *		cl_vector_construct, cl_vector_init, cl_vector_destroy
95*d6b92ffaSHans Petter Selasky *
96*d6b92ffaSHans Petter Selasky *	Manipulation:
97*d6b92ffaSHans Petter Selasky *		cl_vector_get_capacity, cl_vector_set_capacity,
98*d6b92ffaSHans Petter Selasky *		cl_vector_get_size, cl_vector_set_size, cl_vector_set_min_size
99*d6b92ffaSHans Petter Selasky *		cl_vector_get_ptr, cl_vector_get, cl_vector_at, cl_vector_set
100*d6b92ffaSHans Petter Selasky *
101*d6b92ffaSHans Petter Selasky *	Search:
102*d6b92ffaSHans Petter Selasky *		cl_vector_find_from_start, cl_vector_find_from_end
103*d6b92ffaSHans Petter Selasky *		cl_vector_apply_func
104*d6b92ffaSHans Petter Selasky *********/
105*d6b92ffaSHans Petter Selasky /****d* Component Library: Vector/cl_pfn_vec_init_t
106*d6b92ffaSHans Petter Selasky * NAME
107*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_init_t
108*d6b92ffaSHans Petter Selasky *
109*d6b92ffaSHans Petter Selasky * DESCRIPTION
110*d6b92ffaSHans Petter Selasky *	The cl_pfn_vec_init_t function type defines the prototype for functions
111*d6b92ffaSHans Petter Selasky *	used as initializer for elements being allocated by a vector.
112*d6b92ffaSHans Petter Selasky *
113*d6b92ffaSHans Petter Selasky * SYNOPSIS
114*d6b92ffaSHans Petter Selasky */
115*d6b92ffaSHans Petter Selasky typedef cl_status_t
116*d6b92ffaSHans Petter Selasky     (*cl_pfn_vec_init_t) (IN void *const p_element, IN void *context);
117*d6b92ffaSHans Petter Selasky /*
118*d6b92ffaSHans Petter Selasky * PARAMETERS
119*d6b92ffaSHans Petter Selasky *	p_element
120*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element being added to a vector.
121*d6b92ffaSHans Petter Selasky *
122*d6b92ffaSHans Petter Selasky *	context
123*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_vector_init.
124*d6b92ffaSHans Petter Selasky *
125*d6b92ffaSHans Petter Selasky * RETURN VALUES
126*d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS to indicate that the element was initialized successfully.
127*d6b92ffaSHans Petter Selasky *
128*d6b92ffaSHans Petter Selasky *	Other cl_status_t values will be returned by the cl_vector_init,
129*d6b92ffaSHans Petter Selasky *	cl_vector_set_size, and cl_vector_set_min_size functions.
130*d6b92ffaSHans Petter Selasky *
131*d6b92ffaSHans Petter Selasky *	In situations where the vector's size needs to grows in order to satisfy
132*d6b92ffaSHans Petter Selasky *	a call to cl_vector_set, a non-successful status returned by the
133*d6b92ffaSHans Petter Selasky *	initializer callback causes the growth to stop.
134*d6b92ffaSHans Petter Selasky *
135*d6b92ffaSHans Petter Selasky * NOTES
136*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
137*d6b92ffaSHans Petter Selasky *	the initializer function provided by users as an optional parameter to
138*d6b92ffaSHans Petter Selasky *	the cl_vector_init function.
139*d6b92ffaSHans Petter Selasky *
140*d6b92ffaSHans Petter Selasky * SEE ALSO
141*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_init
142*d6b92ffaSHans Petter Selasky *********/
143*d6b92ffaSHans Petter Selasky 
144*d6b92ffaSHans Petter Selasky /****d* Component Library: Vector/cl_pfn_vec_dtor_t
145*d6b92ffaSHans Petter Selasky * NAME
146*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_dtor_t
147*d6b92ffaSHans Petter Selasky *
148*d6b92ffaSHans Petter Selasky * DESCRIPTION
149*d6b92ffaSHans Petter Selasky *	The cl_pfn_vec_dtor_t function type defines the prototype for functions
150*d6b92ffaSHans Petter Selasky *	used as destructor for elements being deallocated from a vector.
151*d6b92ffaSHans Petter Selasky *
152*d6b92ffaSHans Petter Selasky * SYNOPSIS
153*d6b92ffaSHans Petter Selasky */
154*d6b92ffaSHans Petter Selasky typedef void
155*d6b92ffaSHans Petter Selasky  (*cl_pfn_vec_dtor_t) (IN void *const p_element, IN void *context);
156*d6b92ffaSHans Petter Selasky /*
157*d6b92ffaSHans Petter Selasky * PARAMETERS
158*d6b92ffaSHans Petter Selasky *	p_element
159*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element being deallocated from a vector.
160*d6b92ffaSHans Petter Selasky *
161*d6b92ffaSHans Petter Selasky *	context
162*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_vector_init.
163*d6b92ffaSHans Petter Selasky *
164*d6b92ffaSHans Petter Selasky * RETURN VALUE
165*d6b92ffaSHans Petter Selasky *	This function does not return a value.
166*d6b92ffaSHans Petter Selasky *
167*d6b92ffaSHans Petter Selasky * NOTES
168*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
169*d6b92ffaSHans Petter Selasky *	the destructor function provided by users as an optional parameter to
170*d6b92ffaSHans Petter Selasky *	the cl_vector_init function.
171*d6b92ffaSHans Petter Selasky *
172*d6b92ffaSHans Petter Selasky * SEE ALSO
173*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_init
174*d6b92ffaSHans Petter Selasky *********/
175*d6b92ffaSHans Petter Selasky 
176*d6b92ffaSHans Petter Selasky /****d* Component Library: Vector/cl_pfn_vec_apply_t
177*d6b92ffaSHans Petter Selasky * NAME
178*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_apply_t
179*d6b92ffaSHans Petter Selasky *
180*d6b92ffaSHans Petter Selasky * DESCRIPTION
181*d6b92ffaSHans Petter Selasky *	The cl_pfn_vec_apply_t function type defines the prototype for functions
182*d6b92ffaSHans Petter Selasky *	used to iterate elements in a vector.
183*d6b92ffaSHans Petter Selasky *
184*d6b92ffaSHans Petter Selasky * SYNOPSIS
185*d6b92ffaSHans Petter Selasky */
186*d6b92ffaSHans Petter Selasky typedef void
187*d6b92ffaSHans Petter Selasky  (*cl_pfn_vec_apply_t) (IN const size_t index,
188*d6b92ffaSHans Petter Selasky 			IN void *const p_element, IN void *context);
189*d6b92ffaSHans Petter Selasky /*
190*d6b92ffaSHans Petter Selasky * PARAMETERS
191*d6b92ffaSHans Petter Selasky *	index
192*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
193*d6b92ffaSHans Petter Selasky *
194*d6b92ffaSHans Petter Selasky *	p_element
195*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element at the specified index in the vector.
196*d6b92ffaSHans Petter Selasky *
197*d6b92ffaSHans Petter Selasky *	context
198*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_vector_apply_func.
199*d6b92ffaSHans Petter Selasky *
200*d6b92ffaSHans Petter Selasky * RETURN VALUE
201*d6b92ffaSHans Petter Selasky *	This function does not return a value.
202*d6b92ffaSHans Petter Selasky *
203*d6b92ffaSHans Petter Selasky * NOTES
204*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for
205*d6b92ffaSHans Petter Selasky *	the function passed by users as a parameter to the cl_vector_apply_func
206*d6b92ffaSHans Petter Selasky *	function.
207*d6b92ffaSHans Petter Selasky *
208*d6b92ffaSHans Petter Selasky * SEE ALSO
209*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_apply_func
210*d6b92ffaSHans Petter Selasky *********/
211*d6b92ffaSHans Petter Selasky 
212*d6b92ffaSHans Petter Selasky /****d* Component Library: Vector/cl_pfn_vec_find_t
213*d6b92ffaSHans Petter Selasky * NAME
214*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_find_t
215*d6b92ffaSHans Petter Selasky *
216*d6b92ffaSHans Petter Selasky * DESCRIPTION
217*d6b92ffaSHans Petter Selasky *	The cl_pfn_vec_find_t function type defines the prototype for functions
218*d6b92ffaSHans Petter Selasky *	used to find elements in a vector.
219*d6b92ffaSHans Petter Selasky *
220*d6b92ffaSHans Petter Selasky * SYNOPSIS
221*d6b92ffaSHans Petter Selasky */
222*d6b92ffaSHans Petter Selasky typedef cl_status_t
223*d6b92ffaSHans Petter Selasky     (*cl_pfn_vec_find_t) (IN const size_t index,
224*d6b92ffaSHans Petter Selasky 			  IN const void *const p_element, IN void *context);
225*d6b92ffaSHans Petter Selasky /*
226*d6b92ffaSHans Petter Selasky * PARAMETERS
227*d6b92ffaSHans Petter Selasky *	index
228*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
229*d6b92ffaSHans Petter Selasky *
230*d6b92ffaSHans Petter Selasky *	p_element
231*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element at the specified index in the vector.
232*d6b92ffaSHans Petter Selasky *
233*d6b92ffaSHans Petter Selasky *	context
234*d6b92ffaSHans Petter Selasky *		[in] Context provided in a call to cl_vector_find_from_start or
235*d6b92ffaSHans Petter Selasky *		cl_vector_find_from_end.
236*d6b92ffaSHans Petter Selasky *
237*d6b92ffaSHans Petter Selasky * RETURN VALUES
238*d6b92ffaSHans Petter Selasky *	Return CL_SUCCESS if the element was found. This stops vector iteration.
239*d6b92ffaSHans Petter Selasky *
240*d6b92ffaSHans Petter Selasky *	CL_NOT_FOUND to continue the vector iteration.
241*d6b92ffaSHans Petter Selasky *
242*d6b92ffaSHans Petter Selasky * NOTES
243*d6b92ffaSHans Petter Selasky *	This function type is provided as function prototype reference for the
244*d6b92ffaSHans Petter Selasky *	function provided by users as a parameter to the cl_vector_find_from_start
245*d6b92ffaSHans Petter Selasky *	and cl_vector_find_from_end functions.
246*d6b92ffaSHans Petter Selasky *
247*d6b92ffaSHans Petter Selasky * SEE ALSO
248*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_find_from_start, cl_vector_find_from_end
249*d6b92ffaSHans Petter Selasky *********/
250*d6b92ffaSHans Petter Selasky 
251*d6b92ffaSHans Petter Selasky /****i* Component Library: Vector/cl_pfn_vec_copy_t
252*d6b92ffaSHans Petter Selasky * NAME
253*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_copy_t
254*d6b92ffaSHans Petter Selasky *
255*d6b92ffaSHans Petter Selasky * DESCRIPTION
256*d6b92ffaSHans Petter Selasky *	The cl_pfn_vec_copy_t function type defines the prototype for functions
257*d6b92ffaSHans Petter Selasky *	used to copy elements in a vector.
258*d6b92ffaSHans Petter Selasky *
259*d6b92ffaSHans Petter Selasky * SYNOPSIS
260*d6b92ffaSHans Petter Selasky */
261*d6b92ffaSHans Petter Selasky typedef void
262*d6b92ffaSHans Petter Selasky  (*cl_pfn_vec_copy_t) (IN void *const p_dest,
263*d6b92ffaSHans Petter Selasky 		       IN const void *const p_src, IN const size_t size);
264*d6b92ffaSHans Petter Selasky /*
265*d6b92ffaSHans Petter Selasky * PARAMETERS
266*d6b92ffaSHans Petter Selasky *	p_dest
267*d6b92ffaSHans Petter Selasky *		[in] Pointer to the destination buffer into which to copy p_src.
268*d6b92ffaSHans Petter Selasky *
269*d6b92ffaSHans Petter Selasky *	p_src
270*d6b92ffaSHans Petter Selasky *		[in] Pointer to the destination buffer from which to copy.
271*d6b92ffaSHans Petter Selasky *
272*d6b92ffaSHans Petter Selasky *	size
273*d6b92ffaSHans Petter Selasky *		[in] Number of bytes to copy.
274*d6b92ffaSHans Petter Selasky *
275*d6b92ffaSHans Petter Selasky * RETURN VALUE
276*d6b92ffaSHans Petter Selasky *	This function does not return a value.
277*d6b92ffaSHans Petter Selasky *
278*d6b92ffaSHans Petter Selasky * SEE ALSO
279*d6b92ffaSHans Petter Selasky *	Vector
280*d6b92ffaSHans Petter Selasky *********/
281*d6b92ffaSHans Petter Selasky 
282*d6b92ffaSHans Petter Selasky /****s* Component Library: Vector/cl_vector_t
283*d6b92ffaSHans Petter Selasky * NAME
284*d6b92ffaSHans Petter Selasky *	cl_vector_t
285*d6b92ffaSHans Petter Selasky *
286*d6b92ffaSHans Petter Selasky * DESCRIPTION
287*d6b92ffaSHans Petter Selasky *	Vector structure.
288*d6b92ffaSHans Petter Selasky *
289*d6b92ffaSHans Petter Selasky *	The cl_vector_t structure should be treated as opaque and should be
290*d6b92ffaSHans Petter Selasky *	manipulated only through the provided functions.
291*d6b92ffaSHans Petter Selasky *
292*d6b92ffaSHans Petter Selasky * SYNOPSIS
293*d6b92ffaSHans Petter Selasky */
294*d6b92ffaSHans Petter Selasky typedef struct _cl_vector {
295*d6b92ffaSHans Petter Selasky 	size_t size;
296*d6b92ffaSHans Petter Selasky 	size_t grow_size;
297*d6b92ffaSHans Petter Selasky 	size_t capacity;
298*d6b92ffaSHans Petter Selasky 	size_t element_size;
299*d6b92ffaSHans Petter Selasky 	cl_pfn_vec_init_t pfn_init;
300*d6b92ffaSHans Petter Selasky 	cl_pfn_vec_dtor_t pfn_dtor;
301*d6b92ffaSHans Petter Selasky 	cl_pfn_vec_copy_t pfn_copy;
302*d6b92ffaSHans Petter Selasky 	const void *context;
303*d6b92ffaSHans Petter Selasky 	cl_qlist_t alloc_list;
304*d6b92ffaSHans Petter Selasky 	void **p_ptr_array;
305*d6b92ffaSHans Petter Selasky 	cl_state_t state;
306*d6b92ffaSHans Petter Selasky } cl_vector_t;
307*d6b92ffaSHans Petter Selasky /*
308*d6b92ffaSHans Petter Selasky * FIELDS
309*d6b92ffaSHans Petter Selasky *	size
310*d6b92ffaSHans Petter Selasky *		 Number of elements successfully initialized in the vector.
311*d6b92ffaSHans Petter Selasky *
312*d6b92ffaSHans Petter Selasky *	grow_size
313*d6b92ffaSHans Petter Selasky *		 Number of elements to allocate when growing.
314*d6b92ffaSHans Petter Selasky *
315*d6b92ffaSHans Petter Selasky *	capacity
316*d6b92ffaSHans Petter Selasky *		 total # of elements allocated.
317*d6b92ffaSHans Petter Selasky *
318*d6b92ffaSHans Petter Selasky *	element_size
319*d6b92ffaSHans Petter Selasky *		 Size of each element.
320*d6b92ffaSHans Petter Selasky *
321*d6b92ffaSHans Petter Selasky *	pfn_init
322*d6b92ffaSHans Petter Selasky *		 User supplied element initializer.
323*d6b92ffaSHans Petter Selasky *
324*d6b92ffaSHans Petter Selasky *	pfn_dtor
325*d6b92ffaSHans Petter Selasky *		 User supplied element destructor.
326*d6b92ffaSHans Petter Selasky *
327*d6b92ffaSHans Petter Selasky *	pfn_copy
328*d6b92ffaSHans Petter Selasky *		 Copy operator.
329*d6b92ffaSHans Petter Selasky *
330*d6b92ffaSHans Petter Selasky *	context
331*d6b92ffaSHans Petter Selasky *		 User context for callbacks.
332*d6b92ffaSHans Petter Selasky *
333*d6b92ffaSHans Petter Selasky *	alloc_list
334*d6b92ffaSHans Petter Selasky *		 List of allocations.
335*d6b92ffaSHans Petter Selasky *
336*d6b92ffaSHans Petter Selasky *	p_ptr_array
337*d6b92ffaSHans Petter Selasky *		 Internal array of pointers to elements.
338*d6b92ffaSHans Petter Selasky *
339*d6b92ffaSHans Petter Selasky *	state
340*d6b92ffaSHans Petter Selasky *		State of the vector.
341*d6b92ffaSHans Petter Selasky *
342*d6b92ffaSHans Petter Selasky * SEE ALSO
343*d6b92ffaSHans Petter Selasky *	Vector
344*d6b92ffaSHans Petter Selasky *********/
345*d6b92ffaSHans Petter Selasky 
346*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_construct
347*d6b92ffaSHans Petter Selasky * NAME
348*d6b92ffaSHans Petter Selasky *	cl_vector_construct
349*d6b92ffaSHans Petter Selasky *
350*d6b92ffaSHans Petter Selasky * DESCRIPTION
351*d6b92ffaSHans Petter Selasky *	The cl_vector_construct function constructs a vector.
352*d6b92ffaSHans Petter Selasky *
353*d6b92ffaSHans Petter Selasky * SYNOPSIS
354*d6b92ffaSHans Petter Selasky */
355*d6b92ffaSHans Petter Selasky void cl_vector_construct(IN cl_vector_t * const p_vector);
356*d6b92ffaSHans Petter Selasky /*
357*d6b92ffaSHans Petter Selasky * PARAMETERS
358*d6b92ffaSHans Petter Selasky *	p_vector
359*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure to construct.
360*d6b92ffaSHans Petter Selasky *
361*d6b92ffaSHans Petter Selasky * RETURN VALUE
362*d6b92ffaSHans Petter Selasky *	This function does not return a value.
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky * NOTES
365*d6b92ffaSHans Petter Selasky *	Allows calling cl_vector_destroy without first calling cl_vector_init.
366*d6b92ffaSHans Petter Selasky *
367*d6b92ffaSHans Petter Selasky *	Calling cl_vector_construct is a prerequisite to calling any other
368*d6b92ffaSHans Petter Selasky *	vector function except cl_vector_init.
369*d6b92ffaSHans Petter Selasky *
370*d6b92ffaSHans Petter Selasky * SEE ALSO
371*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_init, cl_vector_destroy
372*d6b92ffaSHans Petter Selasky *********/
373*d6b92ffaSHans Petter Selasky 
374*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_init
375*d6b92ffaSHans Petter Selasky * NAME
376*d6b92ffaSHans Petter Selasky *	cl_vector_init
377*d6b92ffaSHans Petter Selasky *
378*d6b92ffaSHans Petter Selasky * DESCRIPTION
379*d6b92ffaSHans Petter Selasky *	The cl_vector_init function initializes a vector for use.
380*d6b92ffaSHans Petter Selasky *
381*d6b92ffaSHans Petter Selasky * SYNOPSIS
382*d6b92ffaSHans Petter Selasky */
383*d6b92ffaSHans Petter Selasky cl_status_t
384*d6b92ffaSHans Petter Selasky cl_vector_init(IN cl_vector_t * const p_vector,
385*d6b92ffaSHans Petter Selasky 	       IN const size_t min_size,
386*d6b92ffaSHans Petter Selasky 	       IN const size_t grow_size,
387*d6b92ffaSHans Petter Selasky 	       IN const size_t element_size,
388*d6b92ffaSHans Petter Selasky 	       IN cl_pfn_vec_init_t pfn_init OPTIONAL,
389*d6b92ffaSHans Petter Selasky 	       IN cl_pfn_vec_dtor_t pfn_dtor OPTIONAL,
390*d6b92ffaSHans Petter Selasky 	       IN const void *const context);
391*d6b92ffaSHans Petter Selasky /*
392*d6b92ffaSHans Petter Selasky * PARAMETERS
393*d6b92ffaSHans Petter Selasky *	p_vector
394*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure to inititalize.
395*d6b92ffaSHans Petter Selasky *
396*d6b92ffaSHans Petter Selasky *	min_size
397*d6b92ffaSHans Petter Selasky *		[in] Initial number of elements.
398*d6b92ffaSHans Petter Selasky *
399*d6b92ffaSHans Petter Selasky *	grow_size
400*d6b92ffaSHans Petter Selasky *		[in] Number of elements to allocate when incrementally growing
401*d6b92ffaSHans Petter Selasky *		the vector.  A value of zero disables automatic growth.
402*d6b92ffaSHans Petter Selasky *
403*d6b92ffaSHans Petter Selasky *	element_size
404*d6b92ffaSHans Petter Selasky *		[in] Size of each element.
405*d6b92ffaSHans Petter Selasky *
406*d6b92ffaSHans Petter Selasky *	pfn_init
407*d6b92ffaSHans Petter Selasky *		[in] Initializer callback to invoke for every new element.
408*d6b92ffaSHans Petter Selasky *		See the cl_pfn_vec_init_t function type declaration for details about
409*d6b92ffaSHans Petter Selasky *		the callback function.
410*d6b92ffaSHans Petter Selasky *
411*d6b92ffaSHans Petter Selasky *	pfn_dtor
412*d6b92ffaSHans Petter Selasky *		[in] Destructor callback to invoke for elements being deallocated.
413*d6b92ffaSHans Petter Selasky *		See the cl_pfn_vec_dtor_t function type declaration for details about
414*d6b92ffaSHans Petter Selasky *		the callback function.
415*d6b92ffaSHans Petter Selasky *
416*d6b92ffaSHans Petter Selasky *	context
417*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback functions to provide context.
418*d6b92ffaSHans Petter Selasky *
419*d6b92ffaSHans Petter Selasky * RETURN VALUES
420*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the vector was initialized successfully.
421*d6b92ffaSHans Petter Selasky *
422*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if the initialization failed.
423*d6b92ffaSHans Petter Selasky *
424*d6b92ffaSHans Petter Selasky *	cl_status_t value returned by optional initializer function specified by
425*d6b92ffaSHans Petter Selasky *	the pfn_init parameter.
426*d6b92ffaSHans Petter Selasky *
427*d6b92ffaSHans Petter Selasky * NOTES
428*d6b92ffaSHans Petter Selasky *	The constructor and initializer functions, if any, are invoked for every
429*d6b92ffaSHans Petter Selasky *	new element in the array.
430*d6b92ffaSHans Petter Selasky *
431*d6b92ffaSHans Petter Selasky * SEE ALSO
432*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_construct, cl_vector_destroy, cl_vector_set,
433*d6b92ffaSHans Petter Selasky *	cl_vector_get, cl_vector_get_ptr, cl_vector_at
434*d6b92ffaSHans Petter Selasky *********/
435*d6b92ffaSHans Petter Selasky 
436*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_destroy
437*d6b92ffaSHans Petter Selasky * NAME
438*d6b92ffaSHans Petter Selasky *	cl_vector_destroy
439*d6b92ffaSHans Petter Selasky *
440*d6b92ffaSHans Petter Selasky * DESCRIPTION
441*d6b92ffaSHans Petter Selasky *	The cl_vector_destroy function destroys a vector.
442*d6b92ffaSHans Petter Selasky *
443*d6b92ffaSHans Petter Selasky * SYNOPSIS
444*d6b92ffaSHans Petter Selasky */
445*d6b92ffaSHans Petter Selasky void cl_vector_destroy(IN cl_vector_t * const p_vector);
446*d6b92ffaSHans Petter Selasky /*
447*d6b92ffaSHans Petter Selasky * PARAMETERS
448*d6b92ffaSHans Petter Selasky *	p_vector
449*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure to destroy.
450*d6b92ffaSHans Petter Selasky *
451*d6b92ffaSHans Petter Selasky * RETURN VALUE
452*d6b92ffaSHans Petter Selasky *	This function does not return a value.
453*d6b92ffaSHans Petter Selasky *
454*d6b92ffaSHans Petter Selasky * NOTES
455*d6b92ffaSHans Petter Selasky *	cl_vector_destroy frees all memory allocated for the vector. The vector
456*d6b92ffaSHans Petter Selasky *	is left initialized to a zero capacity and size.
457*d6b92ffaSHans Petter Selasky *
458*d6b92ffaSHans Petter Selasky *	This function should only be called after a call to cl_vector_construct
459*d6b92ffaSHans Petter Selasky *	or cl_vector_init.
460*d6b92ffaSHans Petter Selasky *
461*d6b92ffaSHans Petter Selasky * SEE ALSO
462*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_construct, cl_vector_init
463*d6b92ffaSHans Petter Selasky *********/
464*d6b92ffaSHans Petter Selasky 
465*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_get_capacity
466*d6b92ffaSHans Petter Selasky * NAME
467*d6b92ffaSHans Petter Selasky *	cl_vector_get_capacity
468*d6b92ffaSHans Petter Selasky *
469*d6b92ffaSHans Petter Selasky * DESCRIPTION
470*d6b92ffaSHans Petter Selasky *	The cl_vector_get_capacity function returns the capacity of a vector.
471*d6b92ffaSHans Petter Selasky *
472*d6b92ffaSHans Petter Selasky * SYNOPSIS
473*d6b92ffaSHans Petter Selasky */
474*d6b92ffaSHans Petter Selasky static inline size_t
cl_vector_get_capacity(IN const cl_vector_t * const p_vector)475*d6b92ffaSHans Petter Selasky cl_vector_get_capacity(IN const cl_vector_t * const p_vector)
476*d6b92ffaSHans Petter Selasky {
477*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
478*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
479*d6b92ffaSHans Petter Selasky 
480*d6b92ffaSHans Petter Selasky 	return (p_vector->capacity);
481*d6b92ffaSHans Petter Selasky }
482*d6b92ffaSHans Petter Selasky 
483*d6b92ffaSHans Petter Selasky /*
484*d6b92ffaSHans Petter Selasky * PARAMETERS
485*d6b92ffaSHans Petter Selasky *	p_vector
486*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose capacity to return.
487*d6b92ffaSHans Petter Selasky *
488*d6b92ffaSHans Petter Selasky * RETURN VALUE
489*d6b92ffaSHans Petter Selasky *	Capacity, in elements, of the vector.
490*d6b92ffaSHans Petter Selasky *
491*d6b92ffaSHans Petter Selasky * NOTES
492*d6b92ffaSHans Petter Selasky *	The capacity is the number of elements that the vector can store, and
493*d6b92ffaSHans Petter Selasky *	can be greater than the number of elements stored. To get the number of
494*d6b92ffaSHans Petter Selasky *	elements stored in the vector, use cl_vector_get_size.
495*d6b92ffaSHans Petter Selasky *
496*d6b92ffaSHans Petter Selasky * SEE ALSO
497*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_set_capacity, cl_vector_get_size
498*d6b92ffaSHans Petter Selasky *********/
499*d6b92ffaSHans Petter Selasky 
500*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_get_size
501*d6b92ffaSHans Petter Selasky * NAME
502*d6b92ffaSHans Petter Selasky *	cl_vector_get_size
503*d6b92ffaSHans Petter Selasky *
504*d6b92ffaSHans Petter Selasky * DESCRIPTION
505*d6b92ffaSHans Petter Selasky *	The cl_vector_get_size function returns the size of a vector.
506*d6b92ffaSHans Petter Selasky *
507*d6b92ffaSHans Petter Selasky * SYNOPSIS
508*d6b92ffaSHans Petter Selasky */
cl_vector_get_size(IN const cl_vector_t * const p_vector)509*d6b92ffaSHans Petter Selasky static inline size_t cl_vector_get_size(IN const cl_vector_t * const p_vector)
510*d6b92ffaSHans Petter Selasky {
511*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
512*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
513*d6b92ffaSHans Petter Selasky 
514*d6b92ffaSHans Petter Selasky 	return (p_vector->size);
515*d6b92ffaSHans Petter Selasky }
516*d6b92ffaSHans Petter Selasky 
517*d6b92ffaSHans Petter Selasky /*
518*d6b92ffaSHans Petter Selasky * PARAMETERS
519*d6b92ffaSHans Petter Selasky *	p_vector
520*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose size to return.
521*d6b92ffaSHans Petter Selasky *
522*d6b92ffaSHans Petter Selasky * RETURN VALUE
523*d6b92ffaSHans Petter Selasky *	Size, in elements, of the vector.
524*d6b92ffaSHans Petter Selasky *
525*d6b92ffaSHans Petter Selasky * SEE ALSO
526*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_set_size, cl_vector_get_capacity
527*d6b92ffaSHans Petter Selasky *********/
528*d6b92ffaSHans Petter Selasky 
529*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_get_ptr
530*d6b92ffaSHans Petter Selasky * NAME
531*d6b92ffaSHans Petter Selasky *	cl_vector_get_ptr
532*d6b92ffaSHans Petter Selasky *
533*d6b92ffaSHans Petter Selasky * DESCRIPTION
534*d6b92ffaSHans Petter Selasky *	The cl_vector_get_ptr function returns a pointer to an element
535*d6b92ffaSHans Petter Selasky *	stored in a vector at a specified index.
536*d6b92ffaSHans Petter Selasky *
537*d6b92ffaSHans Petter Selasky * SYNOPSIS
538*d6b92ffaSHans Petter Selasky */
cl_vector_get_ptr(IN const cl_vector_t * const p_vector,IN const size_t index)539*d6b92ffaSHans Petter Selasky static inline void *cl_vector_get_ptr(IN const cl_vector_t * const p_vector,
540*d6b92ffaSHans Petter Selasky 				      IN const size_t index)
541*d6b92ffaSHans Petter Selasky {
542*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
543*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
544*d6b92ffaSHans Petter Selasky 
545*d6b92ffaSHans Petter Selasky 	return (p_vector->p_ptr_array[index]);
546*d6b92ffaSHans Petter Selasky }
547*d6b92ffaSHans Petter Selasky 
548*d6b92ffaSHans Petter Selasky /*
549*d6b92ffaSHans Petter Selasky * PARAMETERS
550*d6b92ffaSHans Petter Selasky *	p_vector
551*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure from which to get a
552*d6b92ffaSHans Petter Selasky *		pointer to an element.
553*d6b92ffaSHans Petter Selasky *
554*d6b92ffaSHans Petter Selasky *	index
555*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
556*d6b92ffaSHans Petter Selasky *
557*d6b92ffaSHans Petter Selasky * RETURN VALUE
558*d6b92ffaSHans Petter Selasky *	Pointer to the element stored at specified index.
559*d6b92ffaSHans Petter Selasky *
560*d6b92ffaSHans Petter Selasky * NOTES
561*d6b92ffaSHans Petter Selasky *	cl_vector_get_ptr provides constant access times regardless of the index.
562*d6b92ffaSHans Petter Selasky *
563*d6b92ffaSHans Petter Selasky *	cl_vector_get_ptr does not perform boundary checking. Callers are
564*d6b92ffaSHans Petter Selasky *	responsible for providing an index that is within the range of the vector.
565*d6b92ffaSHans Petter Selasky *
566*d6b92ffaSHans Petter Selasky * SEE ALSO
567*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get, cl_vector_at, cl_vector_set, cl_vector_get_size
568*d6b92ffaSHans Petter Selasky *********/
569*d6b92ffaSHans Petter Selasky 
570*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_get
571*d6b92ffaSHans Petter Selasky * NAME
572*d6b92ffaSHans Petter Selasky *	cl_vector_get
573*d6b92ffaSHans Petter Selasky *
574*d6b92ffaSHans Petter Selasky * DESCRIPTION
575*d6b92ffaSHans Petter Selasky *	The cl_vector_get function copies an element stored in a vector at a
576*d6b92ffaSHans Petter Selasky *	specified index.
577*d6b92ffaSHans Petter Selasky *
578*d6b92ffaSHans Petter Selasky * SYNOPSIS
579*d6b92ffaSHans Petter Selasky */
580*d6b92ffaSHans Petter Selasky static inline void
cl_vector_get(IN const cl_vector_t * const p_vector,IN const size_t index,OUT void * const p_element)581*d6b92ffaSHans Petter Selasky cl_vector_get(IN const cl_vector_t * const p_vector,
582*d6b92ffaSHans Petter Selasky 	      IN const size_t index, OUT void *const p_element)
583*d6b92ffaSHans Petter Selasky {
584*d6b92ffaSHans Petter Selasky 	void *p_src;
585*d6b92ffaSHans Petter Selasky 
586*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector);
587*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vector->state == CL_INITIALIZED);
588*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_element);
589*d6b92ffaSHans Petter Selasky 
590*d6b92ffaSHans Petter Selasky 	/* Get a pointer to the element. */
591*d6b92ffaSHans Petter Selasky 	p_src = cl_vector_get_ptr(p_vector, index);
592*d6b92ffaSHans Petter Selasky 	p_vector->pfn_copy(p_src, p_element, p_vector->element_size);
593*d6b92ffaSHans Petter Selasky }
594*d6b92ffaSHans Petter Selasky 
595*d6b92ffaSHans Petter Selasky /*
596*d6b92ffaSHans Petter Selasky * PARAMETERS
597*d6b92ffaSHans Petter Selasky *	p_vector
598*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure from which to get a copy of
599*d6b92ffaSHans Petter Selasky *		an element.
600*d6b92ffaSHans Petter Selasky *
601*d6b92ffaSHans Petter Selasky *	index
602*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
603*d6b92ffaSHans Petter Selasky *
604*d6b92ffaSHans Petter Selasky *	p_element
605*d6b92ffaSHans Petter Selasky *		[out] Pointer to storage for the element. Contains a copy of the
606*d6b92ffaSHans Petter Selasky *		desired element upon successful completion of the call.
607*d6b92ffaSHans Petter Selasky *
608*d6b92ffaSHans Petter Selasky * RETURN VALUE
609*d6b92ffaSHans Petter Selasky *	This function does not return a value.
610*d6b92ffaSHans Petter Selasky *
611*d6b92ffaSHans Petter Selasky * NOTES
612*d6b92ffaSHans Petter Selasky *	cl_vector_get provides constant time access regardless of the index.
613*d6b92ffaSHans Petter Selasky *
614*d6b92ffaSHans Petter Selasky *	cl_vector_get does not perform boundary checking on the vector, and
615*d6b92ffaSHans Petter Selasky *	callers are responsible for providing an index that is within the range
616*d6b92ffaSHans Petter Selasky *	of the vector. To access elements after performing boundary checks,
617*d6b92ffaSHans Petter Selasky *	use cl_vector_at.
618*d6b92ffaSHans Petter Selasky *
619*d6b92ffaSHans Petter Selasky *	The p_element parameter contains a copy of the desired element upon
620*d6b92ffaSHans Petter Selasky *	return from this function.
621*d6b92ffaSHans Petter Selasky *
622*d6b92ffaSHans Petter Selasky * SEE ALSO
623*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get_ptr, cl_vector_at
624*d6b92ffaSHans Petter Selasky *********/
625*d6b92ffaSHans Petter Selasky 
626*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_at
627*d6b92ffaSHans Petter Selasky * NAME
628*d6b92ffaSHans Petter Selasky *	cl_vector_at
629*d6b92ffaSHans Petter Selasky *
630*d6b92ffaSHans Petter Selasky * DESCRIPTION
631*d6b92ffaSHans Petter Selasky *	The cl_vector_at function copies an element stored in a vector at a
632*d6b92ffaSHans Petter Selasky *	specified index, performing boundary checks.
633*d6b92ffaSHans Petter Selasky *
634*d6b92ffaSHans Petter Selasky * SYNOPSIS
635*d6b92ffaSHans Petter Selasky */
636*d6b92ffaSHans Petter Selasky cl_status_t
637*d6b92ffaSHans Petter Selasky cl_vector_at(IN const cl_vector_t * const p_vector,
638*d6b92ffaSHans Petter Selasky 	     IN const size_t index, OUT void *const p_element);
639*d6b92ffaSHans Petter Selasky /*
640*d6b92ffaSHans Petter Selasky * PARAMETERS
641*d6b92ffaSHans Petter Selasky *	p_vector
642*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure from which to get a copy of
643*d6b92ffaSHans Petter Selasky *		an element.
644*d6b92ffaSHans Petter Selasky *
645*d6b92ffaSHans Petter Selasky *	index
646*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
647*d6b92ffaSHans Petter Selasky *
648*d6b92ffaSHans Petter Selasky *	p_element
649*d6b92ffaSHans Petter Selasky *		[out] Pointer to storage for the element. Contains a copy of the
650*d6b92ffaSHans Petter Selasky *		desired element upon successful completion of the call.
651*d6b92ffaSHans Petter Selasky *
652*d6b92ffaSHans Petter Selasky * RETURN VALUES
653*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if an element was found at the specified index.
654*d6b92ffaSHans Petter Selasky *
655*d6b92ffaSHans Petter Selasky *	CL_INVALID_SETTING if the index was out of range.
656*d6b92ffaSHans Petter Selasky *
657*d6b92ffaSHans Petter Selasky * NOTES
658*d6b92ffaSHans Petter Selasky *	cl_vector_at provides constant time access regardless of the index, and
659*d6b92ffaSHans Petter Selasky *	performs boundary checking on the vector.
660*d6b92ffaSHans Petter Selasky *
661*d6b92ffaSHans Petter Selasky *	Upon success, the p_element parameter contains a copy of the desired element.
662*d6b92ffaSHans Petter Selasky *
663*d6b92ffaSHans Petter Selasky * SEE ALSO
664*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get, cl_vector_get_ptr
665*d6b92ffaSHans Petter Selasky *********/
666*d6b92ffaSHans Petter Selasky 
667*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_set
668*d6b92ffaSHans Petter Selasky * NAME
669*d6b92ffaSHans Petter Selasky *	cl_vector_set
670*d6b92ffaSHans Petter Selasky *
671*d6b92ffaSHans Petter Selasky * DESCRIPTION
672*d6b92ffaSHans Petter Selasky *	The cl_vector_set function sets the element at the specified index.
673*d6b92ffaSHans Petter Selasky *
674*d6b92ffaSHans Petter Selasky * SYNOPSIS
675*d6b92ffaSHans Petter Selasky */
676*d6b92ffaSHans Petter Selasky cl_status_t
677*d6b92ffaSHans Petter Selasky cl_vector_set(IN cl_vector_t * const p_vector,
678*d6b92ffaSHans Petter Selasky 	      IN const size_t index, IN void *const p_element);
679*d6b92ffaSHans Petter Selasky /*
680*d6b92ffaSHans Petter Selasky * PARAMETERS
681*d6b92ffaSHans Petter Selasky *	p_vector
682*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure into which to store
683*d6b92ffaSHans Petter Selasky *		an element.
684*d6b92ffaSHans Petter Selasky *
685*d6b92ffaSHans Petter Selasky *	index
686*d6b92ffaSHans Petter Selasky *		[in] Index of the element.
687*d6b92ffaSHans Petter Selasky *
688*d6b92ffaSHans Petter Selasky *	p_element
689*d6b92ffaSHans Petter Selasky *		[in] Pointer to an element to store in the vector.
690*d6b92ffaSHans Petter Selasky *
691*d6b92ffaSHans Petter Selasky * RETURN VALUES
692*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the element was successfully set.
693*d6b92ffaSHans Petter Selasky *
694*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if the vector could not be resized to accommodate
695*d6b92ffaSHans Petter Selasky *	the new element.
696*d6b92ffaSHans Petter Selasky *
697*d6b92ffaSHans Petter Selasky * NOTES
698*d6b92ffaSHans Petter Selasky *	cl_vector_set grows the vector as needed to accommodate the new element,
699*d6b92ffaSHans Petter Selasky *	unless the grow_size parameter passed into the cl_vector_init function
700*d6b92ffaSHans Petter Selasky *	was zero.
701*d6b92ffaSHans Petter Selasky *
702*d6b92ffaSHans Petter Selasky * SEE ALSO
703*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get
704*d6b92ffaSHans Petter Selasky *********/
705*d6b92ffaSHans Petter Selasky 
706*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_set_capacity
707*d6b92ffaSHans Petter Selasky * NAME
708*d6b92ffaSHans Petter Selasky *	cl_vector_set_capacity
709*d6b92ffaSHans Petter Selasky *
710*d6b92ffaSHans Petter Selasky * DESCRIPTION
711*d6b92ffaSHans Petter Selasky *	The cl_vector_set_capacity function reserves memory in a vector for a
712*d6b92ffaSHans Petter Selasky *	specified number of elements.
713*d6b92ffaSHans Petter Selasky *
714*d6b92ffaSHans Petter Selasky * SYNOPSIS
715*d6b92ffaSHans Petter Selasky */
716*d6b92ffaSHans Petter Selasky cl_status_t
717*d6b92ffaSHans Petter Selasky cl_vector_set_capacity(IN cl_vector_t * const p_vector,
718*d6b92ffaSHans Petter Selasky 		       IN const size_t new_capacity);
719*d6b92ffaSHans Petter Selasky /*
720*d6b92ffaSHans Petter Selasky * PARAMETERS
721*d6b92ffaSHans Petter Selasky *	p_vector
722*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose capacity to set.
723*d6b92ffaSHans Petter Selasky *
724*d6b92ffaSHans Petter Selasky *	new_capacity
725*d6b92ffaSHans Petter Selasky *		[in] Total number of elements for which the vector should
726*d6b92ffaSHans Petter Selasky *		allocate memory.
727*d6b92ffaSHans Petter Selasky *
728*d6b92ffaSHans Petter Selasky * RETURN VALUES
729*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the capacity was successfully set.
730*d6b92ffaSHans Petter Selasky *
731*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to satisfy the
732*d6b92ffaSHans Petter Selasky *	operation. The vector is left unchanged.
733*d6b92ffaSHans Petter Selasky *
734*d6b92ffaSHans Petter Selasky * NOTES
735*d6b92ffaSHans Petter Selasky *	cl_vector_set_capacity increases the capacity of the vector. It does
736*d6b92ffaSHans Petter Selasky *	not change the size of the vector. If the requested capacity is less
737*d6b92ffaSHans Petter Selasky *	than the current capacity, the vector is left unchanged.
738*d6b92ffaSHans Petter Selasky *
739*d6b92ffaSHans Petter Selasky * SEE ALSO
740*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get_capacity, cl_vector_set_size,
741*d6b92ffaSHans Petter Selasky *	cl_vector_set_min_size
742*d6b92ffaSHans Petter Selasky *********/
743*d6b92ffaSHans Petter Selasky 
744*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_set_size
745*d6b92ffaSHans Petter Selasky * NAME
746*d6b92ffaSHans Petter Selasky *	cl_vector_set_size
747*d6b92ffaSHans Petter Selasky *
748*d6b92ffaSHans Petter Selasky * DESCRIPTION
749*d6b92ffaSHans Petter Selasky *	The cl_vector_set_size function resizes a vector, either increasing or
750*d6b92ffaSHans Petter Selasky *	decreasing its size.
751*d6b92ffaSHans Petter Selasky *
752*d6b92ffaSHans Petter Selasky * SYNOPSIS
753*d6b92ffaSHans Petter Selasky */
754*d6b92ffaSHans Petter Selasky cl_status_t
755*d6b92ffaSHans Petter Selasky cl_vector_set_size(IN cl_vector_t * const p_vector, IN const size_t size);
756*d6b92ffaSHans Petter Selasky /*
757*d6b92ffaSHans Petter Selasky * PARAMETERS
758*d6b92ffaSHans Petter Selasky *	p_vector
759*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose size to set.
760*d6b92ffaSHans Petter Selasky *
761*d6b92ffaSHans Petter Selasky *	size
762*d6b92ffaSHans Petter Selasky *		[in] Number of elements desired in the vector.
763*d6b92ffaSHans Petter Selasky *
764*d6b92ffaSHans Petter Selasky * RETURN VALUES
765*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the size of the vector was set successfully.
766*d6b92ffaSHans Petter Selasky *
767*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to complete the
768*d6b92ffaSHans Petter Selasky *	operation. The vector is left unchanged.
769*d6b92ffaSHans Petter Selasky *
770*d6b92ffaSHans Petter Selasky * NOTES
771*d6b92ffaSHans Petter Selasky *	cl_vector_set_size sets the vector to the specified size. If size is
772*d6b92ffaSHans Petter Selasky *	smaller than the current size of the vector, the size is reduced.
773*d6b92ffaSHans Petter Selasky *	The destructor function, if any, will be invoked for all elements that
774*d6b92ffaSHans Petter Selasky *	are above size. Likewise, the constructor and initializer, if any, will
775*d6b92ffaSHans Petter Selasky *	be invoked for all new elements.
776*d6b92ffaSHans Petter Selasky *
777*d6b92ffaSHans Petter Selasky *	This function can only fail if size is larger than the current capacity.
778*d6b92ffaSHans Petter Selasky *
779*d6b92ffaSHans Petter Selasky * SEE ALSO
780*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get_size, cl_vector_set_min_size,
781*d6b92ffaSHans Petter Selasky *	cl_vector_set_capacity
782*d6b92ffaSHans Petter Selasky *********/
783*d6b92ffaSHans Petter Selasky 
784*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_set_min_size
785*d6b92ffaSHans Petter Selasky * NAME
786*d6b92ffaSHans Petter Selasky *	cl_vector_set_min_size
787*d6b92ffaSHans Petter Selasky *
788*d6b92ffaSHans Petter Selasky * DESCRIPTION
789*d6b92ffaSHans Petter Selasky *	The cl_vector_set_min_size function resizes a vector to a specified size
790*d6b92ffaSHans Petter Selasky *	if the vector is smaller than the specified size.
791*d6b92ffaSHans Petter Selasky *
792*d6b92ffaSHans Petter Selasky * SYNOPSIS
793*d6b92ffaSHans Petter Selasky */
794*d6b92ffaSHans Petter Selasky cl_status_t
795*d6b92ffaSHans Petter Selasky cl_vector_set_min_size(IN cl_vector_t * const p_vector,
796*d6b92ffaSHans Petter Selasky 		       IN const size_t min_size);
797*d6b92ffaSHans Petter Selasky /*
798*d6b92ffaSHans Petter Selasky * PARAMETERS
799*d6b92ffaSHans Petter Selasky *	p_vector
800*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose minimum size to set.
801*d6b92ffaSHans Petter Selasky *
802*d6b92ffaSHans Petter Selasky *	min_size
803*d6b92ffaSHans Petter Selasky *		[in] Minimum number of elements that the vector should contain.
804*d6b92ffaSHans Petter Selasky *
805*d6b92ffaSHans Petter Selasky * RETURN VALUES
806*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the vector size is greater than or equal to min_size.  This
807*d6b92ffaSHans Petter Selasky *	could indicate that the vector's capacity was increased to min_size or
808*d6b92ffaSHans Petter Selasky *	that the vector was already of sufficient size.
809*d6b92ffaSHans Petter Selasky *
810*d6b92ffaSHans Petter Selasky *	CL_INSUFFICIENT_MEMORY if there was not enough memory to resize the vector.
811*d6b92ffaSHans Petter Selasky *	The vector is left unchanged.
812*d6b92ffaSHans Petter Selasky *
813*d6b92ffaSHans Petter Selasky * NOTES
814*d6b92ffaSHans Petter Selasky *	If min_size is smaller than the current size of the vector, the vector is
815*d6b92ffaSHans Petter Selasky *	unchanged. The vector is unchanged if the size could not be changed due
816*d6b92ffaSHans Petter Selasky *	to insufficient memory being available to perform the operation.
817*d6b92ffaSHans Petter Selasky *
818*d6b92ffaSHans Petter Selasky * SEE ALSO
819*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_get_size, cl_vector_set_size, cl_vector_set_capacity
820*d6b92ffaSHans Petter Selasky *********/
821*d6b92ffaSHans Petter Selasky 
822*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_apply_func
823*d6b92ffaSHans Petter Selasky * NAME
824*d6b92ffaSHans Petter Selasky *	cl_vector_apply_func
825*d6b92ffaSHans Petter Selasky *
826*d6b92ffaSHans Petter Selasky * DESCRIPTION
827*d6b92ffaSHans Petter Selasky *	The cl_vector_apply_func function invokes a specified function for every
828*d6b92ffaSHans Petter Selasky *	element in a vector.
829*d6b92ffaSHans Petter Selasky *
830*d6b92ffaSHans Petter Selasky * SYNOPSIS
831*d6b92ffaSHans Petter Selasky */
832*d6b92ffaSHans Petter Selasky void
833*d6b92ffaSHans Petter Selasky cl_vector_apply_func(IN const cl_vector_t * const p_vector,
834*d6b92ffaSHans Petter Selasky 		     IN cl_pfn_vec_apply_t pfn_callback,
835*d6b92ffaSHans Petter Selasky 		     IN const void *const context);
836*d6b92ffaSHans Petter Selasky /*
837*d6b92ffaSHans Petter Selasky * PARAMETERS
838*d6b92ffaSHans Petter Selasky *	p_vector
839*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure whose elements to iterate.
840*d6b92ffaSHans Petter Selasky *
841*d6b92ffaSHans Petter Selasky *	pfn_callback
842*d6b92ffaSHans Petter Selasky *		[in] Function invoked for every element in the array.
843*d6b92ffaSHans Petter Selasky *		See the cl_pfn_vec_apply_t function type declaration for details
844*d6b92ffaSHans Petter Selasky *		about the callback function.
845*d6b92ffaSHans Petter Selasky *
846*d6b92ffaSHans Petter Selasky *	context
847*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
848*d6b92ffaSHans Petter Selasky *
849*d6b92ffaSHans Petter Selasky * RETURN VALUE
850*d6b92ffaSHans Petter Selasky *	This function does not return a value.
851*d6b92ffaSHans Petter Selasky *
852*d6b92ffaSHans Petter Selasky * NOTES
853*d6b92ffaSHans Petter Selasky *	cl_vector_apply_func invokes the specified function for every element
854*d6b92ffaSHans Petter Selasky *	in the vector, starting from the beginning of the vector.
855*d6b92ffaSHans Petter Selasky *
856*d6b92ffaSHans Petter Selasky * SEE ALSO
857*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_find_from_start, cl_vector_find_from_end,
858*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_apply_t
859*d6b92ffaSHans Petter Selasky *********/
860*d6b92ffaSHans Petter Selasky 
861*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_find_from_start
862*d6b92ffaSHans Petter Selasky * NAME
863*d6b92ffaSHans Petter Selasky *	cl_vector_find_from_start
864*d6b92ffaSHans Petter Selasky *
865*d6b92ffaSHans Petter Selasky * DESCRIPTION
866*d6b92ffaSHans Petter Selasky *	The cl_vector_find_from_start function uses a specified function to
867*d6b92ffaSHans Petter Selasky *	search for elements in a vector starting from the lowest index.
868*d6b92ffaSHans Petter Selasky *
869*d6b92ffaSHans Petter Selasky * SYNOPSIS
870*d6b92ffaSHans Petter Selasky */
871*d6b92ffaSHans Petter Selasky size_t
872*d6b92ffaSHans Petter Selasky cl_vector_find_from_start(IN const cl_vector_t * const p_vector,
873*d6b92ffaSHans Petter Selasky 			  IN cl_pfn_vec_find_t pfn_callback,
874*d6b92ffaSHans Petter Selasky 			  IN const void *const context);
875*d6b92ffaSHans Petter Selasky /*
876*d6b92ffaSHans Petter Selasky * PARAMETERS
877*d6b92ffaSHans Petter Selasky *	p_vector
878*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure to inititalize.
879*d6b92ffaSHans Petter Selasky *
880*d6b92ffaSHans Petter Selasky *	pfn_callback
881*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
882*d6b92ffaSHans Petter Selasky *		See the cl_pfn_vec_find_t function type declaration for details
883*d6b92ffaSHans Petter Selasky *		about the callback function.
884*d6b92ffaSHans Petter Selasky *
885*d6b92ffaSHans Petter Selasky *	context
886*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
887*d6b92ffaSHans Petter Selasky *
888*d6b92ffaSHans Petter Selasky * RETURN VALUES
889*d6b92ffaSHans Petter Selasky *	Index of the element, if found.
890*d6b92ffaSHans Petter Selasky *
891*d6b92ffaSHans Petter Selasky *	Size of the vector if the element was not found.
892*d6b92ffaSHans Petter Selasky *
893*d6b92ffaSHans Petter Selasky * NOTES
894*d6b92ffaSHans Petter Selasky *	cl_vector_find_from_start does not remove the found element from
895*d6b92ffaSHans Petter Selasky *	the vector. The index of the element is returned when the function
896*d6b92ffaSHans Petter Selasky *	provided by the pfn_callback parameter returns CL_SUCCESS.
897*d6b92ffaSHans Petter Selasky *
898*d6b92ffaSHans Petter Selasky * SEE ALSO
899*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_find_from_end, cl_vector_apply_func, cl_pfn_vec_find_t
900*d6b92ffaSHans Petter Selasky *********/
901*d6b92ffaSHans Petter Selasky 
902*d6b92ffaSHans Petter Selasky /****f* Component Library: Vector/cl_vector_find_from_end
903*d6b92ffaSHans Petter Selasky * NAME
904*d6b92ffaSHans Petter Selasky *	cl_vector_find_from_end
905*d6b92ffaSHans Petter Selasky *
906*d6b92ffaSHans Petter Selasky * DESCRIPTION
907*d6b92ffaSHans Petter Selasky *	The cl_vector_find_from_end function uses a specified function to search
908*d6b92ffaSHans Petter Selasky *	for elements in a vector starting from the highest index.
909*d6b92ffaSHans Petter Selasky *
910*d6b92ffaSHans Petter Selasky * SYNOPSIS
911*d6b92ffaSHans Petter Selasky */
912*d6b92ffaSHans Petter Selasky size_t
913*d6b92ffaSHans Petter Selasky cl_vector_find_from_end(IN const cl_vector_t * const p_vector,
914*d6b92ffaSHans Petter Selasky 			IN cl_pfn_vec_find_t pfn_callback,
915*d6b92ffaSHans Petter Selasky 			IN const void *const context);
916*d6b92ffaSHans Petter Selasky /*
917*d6b92ffaSHans Petter Selasky * PARAMETERS
918*d6b92ffaSHans Petter Selasky *	p_vector
919*d6b92ffaSHans Petter Selasky *		[in] Pointer to a cl_vector_t structure to inititalize.
920*d6b92ffaSHans Petter Selasky *
921*d6b92ffaSHans Petter Selasky *	pfn_callback
922*d6b92ffaSHans Petter Selasky *		[in] Function invoked to determine if a match was found.
923*d6b92ffaSHans Petter Selasky *		See the cl_pfn_vec_find_t function type declaration for details
924*d6b92ffaSHans Petter Selasky *		about the callback function.
925*d6b92ffaSHans Petter Selasky *
926*d6b92ffaSHans Petter Selasky *	context
927*d6b92ffaSHans Petter Selasky *		[in] Value to pass to the callback function.
928*d6b92ffaSHans Petter Selasky *
929*d6b92ffaSHans Petter Selasky * RETURN VALUES
930*d6b92ffaSHans Petter Selasky *	Index of the element, if found.
931*d6b92ffaSHans Petter Selasky *
932*d6b92ffaSHans Petter Selasky *	Size of the vector if the element was not found.
933*d6b92ffaSHans Petter Selasky *
934*d6b92ffaSHans Petter Selasky * NOTES
935*d6b92ffaSHans Petter Selasky *	cl_vector_find_from_end does not remove the found element from
936*d6b92ffaSHans Petter Selasky *	the vector. The index of the element is returned when the function
937*d6b92ffaSHans Petter Selasky *	provided by the pfn_callback parameter returns CL_SUCCESS.
938*d6b92ffaSHans Petter Selasky *
939*d6b92ffaSHans Petter Selasky * SEE ALSO
940*d6b92ffaSHans Petter Selasky *	Vector, cl_vector_find_from_start, cl_vector_apply_func,
941*d6b92ffaSHans Petter Selasky *	cl_pfn_vec_find_t
942*d6b92ffaSHans Petter Selasky *********/
943*d6b92ffaSHans Petter Selasky 
944*d6b92ffaSHans Petter Selasky END_C_DECLS
945*d6b92ffaSHans Petter Selasky #endif				/* _CL_VECTOR_H_ */
946