• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*---------------------------------------------------------------------------*
2  *  ArrayList.h  *
3  *                                                                           *
4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5  *                                                                           *
6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7  *  you may not use this file except in compliance with the License.         *
8  *                                                                           *
9  *  You may obtain a copy of the License at                                  *
10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
11  *                                                                           *
12  *  Unless required by applicable law or agreed to in writing, software      *
13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15  *  See the License for the specific language governing permissions and      *
16  *  limitations under the License.                                           *
17  *                                                                           *
18  *---------------------------------------------------------------------------*/
19 
20 #ifndef __ARRAYLIST_H
21 #define __ARRAYLIST_H
22 
23 
24 
25 #include "ESR_ReturnCode.h"
26 #include "PortPrefix.h"
27 #include "ptypes.h"
28 #include <stdlib.h>
29 
30 /**
31  * @addtogroup ArrayListModule ArrayList API functions
32  * Collection of elements.
33  *
34  * @{
35  */
36 
37 /**
38  * Collection of elements.
39  */
40 typedef struct ArrayList_t
41 {
42   /**
43    * Adds element to list.
44    *
45    * @param self ArrayList handle
46    * @param element Element to be added
47    * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
48    */
49   ESR_ReturnCode(*add)(struct ArrayList_t* self, void* element);
50 
51   /**
52    * Inserts an element in the the list at the specified location.  This
53    * causes all elements above or at the specified location to be shifted by
54    * one.
55    *
56    * @param self ArrayList handle
57    * @param index  The index where to insert the element.
58    * @param element The element to insert.
59    * @return ESR_INVALID_ARGUMENT if self is null; ESR_SUCCESS if success or anaother value indicating
60   * the nature of the error. In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index
61    * is less than 0 or greater than the array's size.
62    */
63   ESR_ReturnCode(*insertAt)(struct ArrayList_t* self, size_t index,
64                             void *element);
65 
66   /**
67   * Removes element from list.
68   *
69   * @param self ArrayList handle
70   * @param element Element to be removed
71    * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
72   */
73   ESR_ReturnCode(*remove)(struct ArrayList_t* self, const void* element);
74 
75   /**
76   * Removes element from list at specified index.
77   *
78   * @param self ArrayList handle
79   * @param index Index of element to be removed
80   * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory;
81   * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
82   */
83   ESR_ReturnCode(*removeAtIndex)(struct ArrayList_t* self, size_t index);
84 
85   /**
86   * Removes all elements from list.
87   *
88   * @param self ArrayList handle
89   * @return ESR_INVALID_ARGUMENT if self is null
90   */
91   ESR_ReturnCode(*removeAll)(struct ArrayList_t* self);
92 
93   /**
94   * Indicates if element is contained within the list.
95   *
96   * @param self ArrayList handle
97   * @param element Element to check for
98   * @param exists True if element was found
99   * @return ESR_INVALID_ARGUMENT if self is null
100   */
101   ESR_ReturnCode(*contains)(struct ArrayList_t* self, const void* element, ESR_BOOL* exists);
102 
103   /**
104   * Returns array size.
105   *
106   * @param self ArrayList handle
107   * @param size Returned size
108   * @return ESR_INVALID_ARGUMENT if self is null
109   */
110   ESR_ReturnCode(*getSize)(struct ArrayList_t* self, size_t* size);
111 
112   /**
113   * Returns the element at the specified index.
114   *
115   * @param self ArrayList handle
116   * @param index Element index
117   * @param element Element being returned
118   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
119   */
120   ESR_ReturnCode(*get)(struct ArrayList_t* self, size_t index, void** element);
121 
122   /**
123   * Sets the element at the specified index.
124   *
125   * NOTE: Does *not* deallocate the element being overwritten.
126   * @param self ArrayList handle
127   * @param index Element index
128   * @param element Element's new value
129   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
130   */
131   ESR_ReturnCode(*set)(struct ArrayList_t* self, size_t index, void* element);
132 
133   /**
134    * Converts the ArrayList to a static array.
135    * The use of the ArrayList handle is undefined past this point.
136    *
137    * @param self ArrayList handle
138    * @param newArray Pointer to resulting array
139   * @return ESR_INVALID_ARGUMENT if self is null
140    */
141   ESR_ReturnCode(*toStaticArray)(struct ArrayList_t* self, void** newArray);
142 
143   /**
144   * Returns a clone of the ArrayList.
145   *
146   * @param self ArrayList handle
147    * @param clone [out] Clone of the ArrayList (created externally, populated internally)
148   * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds
149   * ESR_OUT_OF_MEMORY is system is out of memory
150   */
151   ESR_ReturnCode(*clone)(struct ArrayList_t* self, struct ArrayList_t* clone);
152 
153   /**
154   * Destroys the ArrayList.
155   *
156   * @param self ArrayList handle
157   * @return ESR_INVALID_ARGUMENT if self is null
158   */
159   ESR_ReturnCode(*destroy)(struct ArrayList_t* self);
160 }
161 ArrayList;
162 
163 /**
164  * Creates a new ArrayList.
165  *
166  * @param self ArrayList handle
167  * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory
168  */
169 PORTABLE_API ESR_ReturnCode ArrayListCreate(ArrayList** self);
170 
171 /**
172  * Creates a new ArrayList with minimum capacity.
173  *
174  * @param self ArrayList handle
175  * @param minCapacity Minimum capacity of the array.
176  * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory
177  */
178 PORTABLE_API ESR_ReturnCode ArrayListCreateWithCapacity(ArrayList** self, size_t minCapacity);
179 
180 /**
181  * Adds element to list.
182  *
183  * @param self ArrayList handle
184  * @param element Element to be added
185  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
186  */
187 PORTABLE_API ESR_ReturnCode ArrayListAdd(ArrayList* self, void* element);
188 
189 
190 /**
191  * Inserts an element in the the list at the specified location.  This
192  * causes all elements above or at the specified location to be shifted by
193  * one.
194  *
195  * @param self ArrayList handle
196  * @param index  The index where to insert the element.
197  * @param element The element to insert.
198  *
199  * @return ESR_SUCCESS if success or anaother value indicating the nature of
200  * the error.  In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index
201  * is less than 0 or greater than the array's size.
202  */
203 PORTABLE_API ESR_ReturnCode ArrayListInsertAt(ArrayList* self,
204     size_t index,
205     void *element);
206 
207 /**
208  * Removes element from list.
209  *
210  * @param self ArrayList handle
211  * @param element Element to be removed
212  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory
213  */
214 PORTABLE_API ESR_ReturnCode ArrayListRemove(ArrayList* self, void* element);
215 /**
216  * Removes element from list at specified index.
217  *
218  * @param self ArrayList handle
219  * @param index Index of element to be removed
220  * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory;
221  * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
222  */
223 PORTABLE_API ESR_ReturnCode ArrayListRemoveAtIndex(ArrayList* self, size_t index);
224 
225 /**
226  * Removes all elements from list.
227  *
228  * @param self ArrayList handle
229  * @return ESR_INVALID_ARGUMENT if self is null
230  */
231 PORTABLE_API ESR_ReturnCode ArrayListRemoveAll(ArrayList* self);
232 
233 /**
234  * Indicates if element is contained within the list.
235  *
236  * @param self ArrayList handle
237  * @param element Element to check for
238  * @param exists True if element was found
239  * @return ESR_INVALID_ARGUMENT if self is null
240  */
241 PORTABLE_API ESR_ReturnCode ArrayListContains(ArrayList* self, void* element, ESR_BOOL* exists);
242 
243 /**
244  * Returns array size.
245  *
246  * @param self ArrayList handle
247  * @param size Returned size
248  * @return ESR_INVALID_ARGUMENT if self is null
249  */
250 PORTABLE_API ESR_ReturnCode ArrayListGetSize(ArrayList* self, size_t* size);
251 
252 /**
253  * Returns the element at the specified index.
254  *
255  * @param self ArrayList handle
256  * @param index Element index
257  * @param element Element being returned
258  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
259  */
260 PORTABLE_API ESR_ReturnCode ArrayListGet(ArrayList* self, size_t index, void** element);
261 
262 /**
263  * Sets the element at the specified index.
264  *
265  * NOTE: Does *not* deallocate the element being overwritten.
266  * @param self ArrayList handle
267  * @param index Element index
268  * @param element Element's new value
269  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds
270  */
271 PORTABLE_API ESR_ReturnCode ArrayListSet(ArrayList* self, size_t index, void* element);
272 
273 /**
274  * Returns a clone of the ArrayList.
275  *
276  * @param self ArrayList handle
277  * @param clone [out] Clone of the ArrayList (created externally, populated internally)
278  * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds
279  * ESR_OUT_OF_MEMORY is system is out of memory
280  */
281 PORTABLE_API ESR_ReturnCode ArrayListClone(ArrayList* self, ArrayList* clone);
282 
283 /**
284  * Destroys an ArrayList.
285  *
286  * @param self ArrayList handle
287  * @return ESR_INVALID_ARGUMENT if self is null
288  */
289 PORTABLE_API ESR_ReturnCode ArrayListDestroy(ArrayList* self);
290 
291 /**
292  * @}
293  */
294 
295 #endif /* __ARRAYLIST_H */
296