mirror of
https://github.com/switchbrew/libnx.git
synced 2025-07-05 19:02:14 +02:00
added QoL funcs to list
This commit is contained in:
parent
b11e3b2e14
commit
eaed83bbe2
@ -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);
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user