/*---------------------------------------------------------------------------* * ArrayList.h * * * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ #ifndef __ARRAYLIST_H #define __ARRAYLIST_H #include "ESR_ReturnCode.h" #include "PortPrefix.h" #include "ptypes.h" #include <stdlib.h> /** * @addtogroup ArrayListModule ArrayList API functions * Collection of elements. * * @{ */ /** * Collection of elements. */ typedef struct ArrayList_t { /** * Adds element to list. * * @param self ArrayList handle * @param element Element to be added * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory */ ESR_ReturnCode(*add)(struct ArrayList_t* self, void* element); /** * Inserts an element in the the list at the specified location. This * causes all elements above or at the specified location to be shifted by * one. * * @param self ArrayList handle * @param index The index where to insert the element. * @param element The element to insert. * @return ESR_INVALID_ARGUMENT if self is null; ESR_SUCCESS if success or anaother value indicating * the nature of the error. In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index * is less than 0 or greater than the array's size. */ ESR_ReturnCode(*insertAt)(struct ArrayList_t* self, size_t index, void *element); /** * Removes element from list. * * @param self ArrayList handle * @param element Element to be removed * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory */ ESR_ReturnCode(*remove)(struct ArrayList_t* self, const void* element); /** * Removes element from list at specified index. * * @param self ArrayList handle * @param index Index of element to be removed * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory; * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ ESR_ReturnCode(*removeAtIndex)(struct ArrayList_t* self, size_t index); /** * Removes all elements from list. * * @param self ArrayList handle * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*removeAll)(struct ArrayList_t* self); /** * Indicates if element is contained within the list. * * @param self ArrayList handle * @param element Element to check for * @param exists True if element was found * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*contains)(struct ArrayList_t* self, const void* element, ESR_BOOL* exists); /** * Returns array size. * * @param self ArrayList handle * @param size Returned size * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*getSize)(struct ArrayList_t* self, size_t* size); /** * Returns the element at the specified index. * * @param self ArrayList handle * @param index Element index * @param element Element being returned * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ ESR_ReturnCode(*get)(struct ArrayList_t* self, size_t index, void** element); /** * Sets the element at the specified index. * * NOTE: Does *not* deallocate the element being overwritten. * @param self ArrayList handle * @param index Element index * @param element Element's new value * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ ESR_ReturnCode(*set)(struct ArrayList_t* self, size_t index, void* element); /** * Converts the ArrayList to a static array. * The use of the ArrayList handle is undefined past this point. * * @param self ArrayList handle * @param newArray Pointer to resulting array * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*toStaticArray)(struct ArrayList_t* self, void** newArray); /** * Returns a clone of the ArrayList. * * @param self ArrayList handle * @param clone [out] Clone of the ArrayList (created externally, populated internally) * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds * ESR_OUT_OF_MEMORY is system is out of memory */ ESR_ReturnCode(*clone)(struct ArrayList_t* self, struct ArrayList_t* clone); /** * Destroys the ArrayList. * * @param self ArrayList handle * @return ESR_INVALID_ARGUMENT if self is null */ ESR_ReturnCode(*destroy)(struct ArrayList_t* self); } ArrayList; /** * Creates a new ArrayList. * * @param self ArrayList handle * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory */ PORTABLE_API ESR_ReturnCode ArrayListCreate(ArrayList** self); /** * Creates a new ArrayList with minimum capacity. * * @param self ArrayList handle * @param minCapacity Minimum capacity of the array. * @return ESR_INVALID_ARGUMENT if self or the value it points to are null; ESR_OUT_OF_MEMORY is system is out of memory */ PORTABLE_API ESR_ReturnCode ArrayListCreateWithCapacity(ArrayList** self, size_t minCapacity); /** * Adds element to list. * * @param self ArrayList handle * @param element Element to be added * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory */ PORTABLE_API ESR_ReturnCode ArrayListAdd(ArrayList* self, void* element); /** * Inserts an element in the the list at the specified location. This * causes all elements above or at the specified location to be shifted by * one. * * @param self ArrayList handle * @param index The index where to insert the element. * @param element The element to insert. * * @return ESR_SUCCESS if success or anaother value indicating the nature of * the error. In particular, it returns ESR_ARGUMENT_OUT_OF_BOUNDS if index * is less than 0 or greater than the array's size. */ PORTABLE_API ESR_ReturnCode ArrayListInsertAt(ArrayList* self, size_t index, void *element); /** * Removes element from list. * * @param self ArrayList handle * @param element Element to be removed * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory */ PORTABLE_API ESR_ReturnCode ArrayListRemove(ArrayList* self, void* element); /** * Removes element from list at specified index. * * @param self ArrayList handle * @param index Index of element to be removed * @return ESR_INVALID_ARGUMENT if self is null; ESR_OUT_OF_MEMORY is system is out of memory; * ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ PORTABLE_API ESR_ReturnCode ArrayListRemoveAtIndex(ArrayList* self, size_t index); /** * Removes all elements from list. * * @param self ArrayList handle * @return ESR_INVALID_ARGUMENT if self is null */ PORTABLE_API ESR_ReturnCode ArrayListRemoveAll(ArrayList* self); /** * Indicates if element is contained within the list. * * @param self ArrayList handle * @param element Element to check for * @param exists True if element was found * @return ESR_INVALID_ARGUMENT if self is null */ PORTABLE_API ESR_ReturnCode ArrayListContains(ArrayList* self, void* element, ESR_BOOL* exists); /** * Returns array size. * * @param self ArrayList handle * @param size Returned size * @return ESR_INVALID_ARGUMENT if self is null */ PORTABLE_API ESR_ReturnCode ArrayListGetSize(ArrayList* self, size_t* size); /** * Returns the element at the specified index. * * @param self ArrayList handle * @param index Element index * @param element Element being returned * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ PORTABLE_API ESR_ReturnCode ArrayListGet(ArrayList* self, size_t index, void** element); /** * Sets the element at the specified index. * * NOTE: Does *not* deallocate the element being overwritten. * @param self ArrayList handle * @param index Element index * @param element Element's new value * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index is out of bounds */ PORTABLE_API ESR_ReturnCode ArrayListSet(ArrayList* self, size_t index, void* element); /** * Returns a clone of the ArrayList. * * @param self ArrayList handle * @param clone [out] Clone of the ArrayList (created externally, populated internally) * @return ESR_INVALID_ARGUMENT if self is null; ESR_ARGUMENT_OUT_OF_BOUNDS if index (used internally) is out of bounds * ESR_OUT_OF_MEMORY is system is out of memory */ PORTABLE_API ESR_ReturnCode ArrayListClone(ArrayList* self, ArrayList* clone); /** * Destroys an ArrayList. * * @param self ArrayList handle * @return ESR_INVALID_ARGUMENT if self is null */ PORTABLE_API ESR_ReturnCode ArrayListDestroy(ArrayList* self); /** * @} */ #endif /* __ARRAYLIST_H */