1: /*************************************************************************
2: * (C) 2013 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
6: * $Id: asarr.h,v 1.2.28.1 2014/01/29 14:15:58 misho Exp $
7: *
8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004 - 2014
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #ifndef __ASARR_H
47: #define __ASARR_H
48:
49:
50: typedef void ** sarr_seg_t;
51: typedef struct _tagSplitArray {
52: int sarr_num;
53: int sarr_seg;
54: int sarr_siz;
55: sarr_seg_t *sarr_data;
56: } sarr_t;
57:
58:
59: /*
60: * sarr_Init() - Create and initialize dynamic split-order array
61: *
62: * @numItems = Number of Items
63: * @segLen = Length of segment
64: * return: NULL error, != NULL allocated memory for array
65: */
66: sarr_t *sarr_Init(int numItems, int segLen);
67: /*
68: * sarr_Destroy() - Free all data in dynamic split-order array and Destroy array
69: *
70: * @parr = Array
71: * return: none
72: */
73: void sarr_Destroy(sarr_t ** __restrict parr);
74:
75: /*
76: * sarr_Grow() - Grow/Shrink dynamic split-order array, Use with care when it shrink!!!
77: *
78: * @arr = Array
79: * @newNumItems = Number of Items
80: * return: -1 error, 0 ok
81: */
82: int sarr_Grow(sarr_t * __restrict arr, int newNumItems);
83: /*
84: * sarr_Vacuum() - Vacuum dynamic split-order array, empty segments will be freed
85: *
86: * @arr = Array
87: * return: -1 error, >-1 freed segments
88: */
89: int sarr_Vacuum(sarr_t * __restrict arr);
90: #define sarr_Size(_arr) ((_arr) ? (_arr)->sarr_num : 0)
91: #define sarr_Seg(_arr) (assert((_arr)), (_arr)->sarr_seg)
92: /*
93: * sarr_Copy() Copy source split array to destination split array
94: *
95: * @dest = Destination split array, after use free with sarr_Destroy()
96: * @src = Source split array
97: * return: -1 error; >0 count of destination split array
98: */
99: int sarr_Copy(sarr_t ** __restrict dest, sarr_t * __restrict src);
100:
101: /*
102: * sarr_Get() - Get element from dynamic split-order array
103: *
104: * @arr = Array
105: * @idx = Index (warning 1st element is at position 1)
106: * return: NULL not found, !=NULL element
107: */
108: void *sarr_Get(sarr_t * __restrict arr, unsigned int idx);
109: /*
110: * sarr_Get2() - Always get element from dynamic split-order array
111: * Function automatic grow array. Good use for Hash tables!
112: *
113: * @arr = Array
114: * @idx = Index (warning 1st element is at position 1)
115: * return: NULL not found, !=NULL element
116: */
117: void *sarr_Get2(sarr_t * __restrict arr, unsigned int idx);
118: /*
119: * sarr_Set() - Set element to dynamic split-order array
120: *
121: * @arr = Array
122: * @idx = Index (warning 1st element is at position 1)
123: * @data = Value
124: * return: NULL error or empty, !=NULL old value in element
125: */
126: void *sarr_Set(sarr_t * __restrict arr, unsigned int idx, void *data);
127: #define sarr_Del(_arr, _idx) sarr_Set((_arr), _idx, NULL)
128: #define sarr(_arr, _idx, _type) ((_type) sarr_Get((_arr), _idx))
129:
130: /*
131: * sarr_sarr_2array() - Convert from split-order array to dynamic array
132: *
133: * @sa = split array
134: * @sarrFree = after convert split array !=0 will be destroyed sarray
135: * return: NULL error or != NULL new array
136: */
137: array_t *sarr_sarr2array(sarr_t ** __restrict sa, int sarrFree);
138: /*
139: * sarr_array2sarr() - Convert from dynamic array to split-order array
140: *
141: * @a = array
142: * @segLen = Length of segment
143: * @arrFree = after convert array !=0 will be destroyed
144: * return: NULL error or != NULL new sarr
145: */
146: sarr_t *sarr_array2sarr(array_t ** __restrict a, int segLen, int arrFree);
147:
148:
149: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>