* @brief Cell of a double-linked list.
*/
typedef struct ListCell {
- void* data; ///< Generic data contained in this cell.
- struct ListCell* prev; ///< Pointer to previous cell in the list.
- struct ListCell* next; ///< Pointer to next cell in the list.
+ void* data; ///< Generic data contained in this cell.
+ struct ListCell* prev; ///< Pointer to previous cell in the list.
+ struct ListCell* next; ///< Pointer to next cell in the list.
} ListCell;
/**
* @brief Double-linked list data structure.
*/
typedef struct List {
- UInt size; ///< Count elements in the list.
- size_t dataSize; ///< Size of a list cell element in bytes.
- ListCell* head; ///< Pointer to the first cell in the list.
- ListCell* tail; ///< Pointer to the last cell in the list.
+ UInt size; ///< Count elements in the list.
+ size_t dataSize; ///< Size of a list cell element in bytes.
+ ListCell* head; ///< Pointer to the first cell in the list.
+ ListCell* tail; ///< Pointer to the last cell in the list.
} List;
/**
* @brief Initialize an empty list.
*/
void _list_init(
- List* list, ///< "this" pointer.
- size_t dataSize ///< Size of a list cell elements in bytes.
+ List* list, ///< "this" pointer.
+ size_t dataSize ///< Size of a list cell elements in bytes.
);
/**
* @param dataSize Size in bytes of a list element.
*/
List* _list_new(
- size_t dataSize ///< Size of a list cell elements in bytes.
+ size_t dataSize ///< Size of a list cell elements in bytes.
);
/**
* Usage: List* list_new(<Type> type)
*/
#define list_new(type) \
- _list_new(sizeof(type))
+{ \
+ _list_new(sizeof(type)); \
+}
/**
* @brief Copy constructor (shallow copy, ok for basic types).
*/
List* list_copy(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief Check if the list is empty.
*/
bool list_empty(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief return the size of current list.
*/
UInt list_size(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief Get data at the given list cell argument.
*/
void* _list_get(
- ListCell* listCell ///< Pointer to a cell inside "this" list.
+ ListCell* listCell ///< Pointer to a cell inside "this" list.
);
/**
*/
#define list_get(listCell, data) \
{ \
- void* pData = _list_get(listCell); \
- data = *((typeof(&data))pData); \
+ void* pData = _list_get(listCell); \
+ data = *((typeof(&data))pData); \
}
/**
* @brief Set data at the given list cell argument.
*/
void _list_set(
- List* list, ///< "this" pointer.
- ListCell* listCell, ///< Pointer to a cell inside "this" list.
- void* data ///< Pointer to data to be set.
+ List* list, ///< "this" pointer.
+ ListCell* listCell, ///< Pointer to a cell inside "this" list.
+ void* data ///< Pointer to data to be set.
);
/**
*/
#define list_set(list, listCell, data) \
{ \
- typeof((data)) tmp = data; \
- _list_set(list, listCell, &tmp); \
+ typeof((data)) tmp = data; \
+ _list_set(list, listCell, &tmp); \
}
/**
* @brief Add data to the list when list is empty.
*/
void _list_insert_first_element(
- List* list, ///< "this" pointer.
- void* data ///< Pointer to data to be added
+ List* list, ///< "this" pointer.
+ void* data ///< Pointer to data to be added
);
/**
* @brief Add data before list cell argument.
*/
void _list_insert_before(
- List* list, ///< "this" pointer.
- ListCell* listCell, ///< Pointer to a cell inside "this" list.
- void* data ///< Pointer to data to be added.
+ List* list, ///< "this" pointer.
+ ListCell* listCell, ///< Pointer to a cell inside "this" list.
+ void* data ///< Pointer to data to be added.
);
/**
*/
#define list_insert_before(list, listCell, data) \
{ \
- typeof((data)) tmp = data; \
- _list_insert_before(list, listCell, &tmp); \
+ typeof((data)) tmp = data; \
+ _list_insert_before(list, listCell, &tmp); \
}
/**
* @brief Add data after list cell argument.
*/
void _list_insert_after(
- List* list, ///< "this" pointer.
- ListCell* listCell, ///< Pointer to a cell inside "this" list.
- void* data ///< Pointer to data to be inserted.
+ List* list, ///< "this" pointer.
+ ListCell* listCell, ///< Pointer to a cell inside "this" list.
+ void* data ///< Pointer to data to be inserted.
);
/**
*/
#define list_insert_after(list, listCell, data) \
{ \
- typeof((data)) tmp = data; \
- _list_insert_after(list, listCell, &tmp); \
+ typeof((data)) tmp = data; \
+ _list_insert_after(list, listCell, &tmp); \
}
/**
* @brief Add data at the beginning of the list.
*/
void _list_insert_front(
- List* list, ///< "this" pointer.
- void* data ///< Pointer to data to be inserted.
+ List* list, ///< "this" pointer.
+ void* data ///< Pointer to data to be inserted.
);
/**
*/
#define list_insert_front(list, data) \
{ \
- typeof((data)) tmp = data; \
- _list_insert_front(list, &tmp); \
+ typeof((data)) tmp = data; \
+ _list_insert_front(list, &tmp); \
}
/**
* @brief Add data at the end of the list.
*/
void _list_insert_back(
- List* list, ///< "this" pointer.
- void* data ///< Pointer to data to be inserted.
+ List* list, ///< "this" pointer.
+ void* data ///< Pointer to data to be inserted.
);
/**
*/
#define list_insert_back(list, data) \
{ \
- typeof((data)) tmp = data; \
- _list_insert_back(list, &tmp); \
+ typeof((data)) tmp = data; \
+ _list_insert_back(list, &tmp); \
}
/**
* @brief Remove data at position given by 'listCell'.
*/
void list_remove(
- List* list, ///< "this" pointer.
- ListCell* listCell ///< Pointer to a cell inside "this" list.
+ List* list, ///< "this" pointer.
+ ListCell* listCell ///< Pointer to a cell inside "this" list.
);
/**
* @brief Remove data at the beginning of the list.
*/
void list_remove_front(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief Remove data at the end of the list.
*/
void list_remove_back(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief Clear the entire list.
*/
void list_clear(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
/**
* @brief Destroy the list: clear it, and free 'list' pointer.
*/
void list_destroy(
- List* list ///< "this" pointer.
+ List* list ///< "this" pointer.
);
////////////////////
* @brief Iterator on a double-linked list.
*/
typedef struct ListIterator {
- List* list; ///< The list to be iterate.
- ListCell* current; ///< The current iterated list cell.
+ List* list; ///< The list to be iterate.
+ ListCell* current; ///< The current iterated list cell.
} ListIterator;
/**
* @brief Obtain an iterator object, starting at list beginning.
*/
ListIterator* list_get_iterator(
- List* list ///< Pointer to the list to be iterated over.
+ List* list ///< Pointer to the list to be iterated over.
);
/**
* @brief (Re)set current position inside list to head.
*/
void listI_reset_head(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
/**
* @brief (Re)set current position inside list to tail.
*/
void listI_reset_tail(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
/**
* @brief Tell if there is some data at the current index.
*/
bool listI_has_data(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
/**
* Usage: void listI_get(ListIterator* listI, void data)
*/
#define listI_get(listI, data) \
- list_get(listI->current, data)
+ list_get(listI->current, data)
/**
* @brief Set data at the current iterator position.
* Usage: void listI_set(ListIterator* listI, void data);
*/
#define listI_set(listI, data) \
- list_set(listI->list, listI->current, data)
+ list_set(listI->list, listI->current, data)
/**
* @brief Add data before current list cell.
* Usage: void listI_insert_before(ListIteratorI* listI, void data)
*/
#define listI_insert_before(listI, data) \
- list_insert_before(listI->list, listI->current, data)
+ list_insert_before(listI->list, listI->current, data)
/**
* @brief Add data after current list cell.
* Usage: void listI_insert_after(ListIteratorI* listI, void data)
*/
#define listI_insert_after(listI, data) \
- list_insert_after(listI->list, listI->current, data)
+ list_insert_after(listI->list, listI->current, data)
/**
* @brief Type to encode a direction (forward / backward).
*/
typedef enum {
- BACKWARD = -1, ///< Move toward head.
- FORWARD = 1 ///< Move toward tail.
+ BACKWARD = -1, ///< Move toward head.
+ FORWARD = 1 ///< Move toward tail.
} Direction;
/**
* @brief Remove data at the current iterator position.
*/
void listI_remove(
- ListIterator* listI, ///< "this" pointer.
- Direction direction ///< Indicate the position of iterator after removal.
+ ListIterator* listI, ///< "this" pointer.
+ Direction direction ///< Indicate the position of iterator after removal.
);
/**
* @brief Move current iterator position forward (toward tail).
*/
void listI_move_next(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
/**
* @brief Move current iterator position backward (toward head).
*/
void listI_move_prev(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
/**
* @brief Free memory allocated for the iterator.
*/
void listI_destroy(
- ListIterator* listI ///< "this" pointer.
+ ListIterator* listI ///< "this" pointer.
);
#endif