added QoL funcs to list

This commit is contained in:
Juan Antonio Hernández Cánovas 2018-08-25 00:07:04 +02:00
parent b11e3b2e14
commit eaed83bbe2
2 changed files with 112 additions and 8 deletions

View File

@ -36,7 +36,7 @@ void listFree(List* l);
/** /**
* @brief Inserts something in a position * @brief Inserts something in a position
* @param l List object. * @param l List object
* @param item A pointer to the thing you want to insert * @param item A pointer to the thing you want to insert
* @param pos The position to insert (0 is the first position) * @param pos The position to insert (0 is the first position)
*/ */
@ -44,7 +44,7 @@ void listInsert(List* l, void* item, u32 pos);
/** /**
* @brief Inserts something in the first position * @brief Inserts something in the first position
* @param l List object. * @param l List object
* @param item A pointer to the thing you want to insert * @param item A pointer to the thing you want to insert
*/ */
static inline void listInsertFirst(List* l, void* item) { static inline void listInsertFirst(List* l, void* item) {
@ -53,21 +53,21 @@ static inline void listInsertFirst(List* l, void* item) {
/** /**
* @brief Inserts something at the end of the list * @brief Inserts something at the end of the list
* @param l List object. * @param l List object
* @param item A pointer to the thing you want to insert * @param item A pointer to the thing you want to insert
*/ */
void listInsertLast(List* l, void* item); void listInsertLast(List* l, void* item);
/** /**
* @brief Deletes the node of the list which has the item specified (makes a pointer comparison to ckeck that) * @brief Deletes the node of the list which has the item specified (makes a pointer comparison to ckeck that)
* @param l List object. * @param l List object
* @param item A pointer to the thing you want to delete * @param item A pointer to the thing you want to delete
*/ */
void listDelete(List* l, void* item); void listDelete(List* l, void* item);
/** /**
* @brief Checks if the item is inserted in the list (makes a pointer comparison to ckeck that) * @brief Checks if the item is inserted in the list (makes a pointer comparison to ckeck that)
* @param l List object. * @param l List object
* @param item A pointer to the thing you want to check * @param item A pointer to the thing you want to check
* @return true if the item is in the list, false otherwise * @return true if the item is in the list, false otherwise
*/ */
@ -75,15 +75,61 @@ bool listIsInserted(List* l, void* item);
/** /**
* @brief Returns the number of items inserted in the list * @brief Returns the number of items inserted in the list
* @param l List object. * @param l List object
* @return The number of nodes (the number of inserted things) in the list * @return The number of nodes (the number of inserted things) in the list
*/ */
u32 listGetNumNodes(List* l); u32 listGetNumNodes(List* l);
/** /**
* @brief Returns the item inserted in an specified position * @brief Returns the item inserted in an specified position
* @param l List object. * @param l List object
* @param pos The position of the item * @param pos The position of the item
* @return A pointer to that item, NULL if it isn't found * @return A pointer to that item, NULL if it isn't found
*/ */
void* listGetItem(List* l, u32 pos); void* listGetItem(List* l, u32 pos);
/**
* @brief Inserts the item in the first position
* @param l List object
* @param item A pointer to something to store
*/
static inline void listPushFront(List* l, void* item) {
listInsert(l, item, 0);
}
/**
* @brief Returns the item inserted in the first position and deletes it
* @param l List object
* @return A pointer to that item, NULL if the list is empty
*/
void* listPopFront(List* l);
/**
* @brief Returns the item inserted in the first position
* @param l List object.
* @return A pointer to that item, NULL if the list is empty
*/
void* listPeekFront(List* l);
/**
* @brief Inserts the item in the last position
* @param l List object.
* @param item A pointer to something you want to insert
*/
static inline void listPushBack(List* l, void* item) {
listInsertLast(List* l, void* item);
}
/**
* @brief Returns the item inserted in the last position and deletes it
* @param l List object.
* @return A pointer to that item, NULL if the list is empty
*/
void* listPopBack(List* l);
/**
* @brief Returns the item inserted in the last position
* @param l List object.
* @return A pointer to that item, NULL if the list is empty
*/
void* listPeekBack(List* l);

View File

@ -81,6 +81,22 @@ void listDelete(List* l, void* item) {
rwlockWriteUnlock(&l->mutex); rwlockWriteUnlock(&l->mutex);
} }
void listDeleteAtPos(List* l, u32 pos) {
rwlockReadLock(&l->mutex);
if(pos >= l->num_nodes || pos < 0) {
return;
}
Node* aux = l->header;
for(int i = pos; i > 0; i++) {
aux = aux->next;
}
Node* delete = aux->next;
aux->next = delete->next;
free(delete);
l->num_nodes--;
rwlockReadUnlock(&l->mutex);
}
bool listIsInserted(List* l, void* item) { bool listIsInserted(List* l, void* item) {
rwlockReadLock(&l->mutex); rwlockReadLock(&l->mutex);
Node* aux = l->header; Node* aux = l->header;
@ -112,3 +128,45 @@ void* listGetItem(List* l, u32 pos) {
rwlockReadUnlock(&l->mutex); rwlockReadUnlock(&l->mutex);
return result; return result;
} }
void* listPopFront(List* l) {
rwlockReadLock(&l->mutex);
if(l->num_nodes == 0) {
return NULL;
}
void* result = listGetItem(l, 0);
listDeleteAtPos(l, 0);
rwlockReadUnlock(&l->mutex);
return result;
}
void* listPeekFront(List* l) {
rwlockReadLock(&l->mutex);
if(l->num_nodes == 0) {
return NULL;
}
void* result = listGetItem(l, 0);
rwlockReadUnlock(&l->mutex);
return result;
}
void* listPopBack(List* l) {
rwlockReadLock(&l->mutex);
if(l->num_nodes == 0) {
return NULL;
}
void* result = listGetItem(l, l->num_nodes-1);
listDeleteAtPos(l, l->num_nodes-1);
rwlockReadUnlock(&l->mutex);
return result;
}
void* listPeekBack(List* l) {
rwlockReadLock(&l->mutex);
if(l->num_nodes == 0) {
return NULL;
}
void* result = listGetItem(l, l->num_nodes-1);
rwlockReadUnlock(&l->mutex);
return result;
}