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