Rework singly linked list API
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 50s
Builds / ExectOS (i686, debug) (push) Successful in 44s
Builds / ExectOS (i686, release) (push) Successful in 32s

This commit is contained in:
2026-02-24 14:49:56 +01:00
parent 2bbc21b667
commit 7e62919c6b
2 changed files with 94 additions and 34 deletions

View File

@@ -20,18 +20,19 @@ namespace RTL
public: public:
STATIC XTCDECL PSINGLE_LIST_ENTRY GetFirstEntry(IN PSINGLE_LIST_HEADER ListHead); STATIC XTCDECL PSINGLE_LIST_ENTRY GetFirstEntry(IN PSINGLE_LIST_HEADER ListHead);
STATIC XTCDECL VOID InitializeListHead(IN PSINGLE_LIST_HEADER ListHead); STATIC XTCDECL VOID InitializeListHead(IN PSINGLE_LIST_HEADER ListHead);
STATIC XTCDECL VOID InsertHeadList(IN OUT PSINGLE_LIST_HEADER ListHead, STATIC XTCDECL PSINGLE_LIST_ENTRY InsertHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY Entry); IN PSINGLE_LIST_ENTRY Entry);
STATIC XTCDECL VOID InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead, STATIC XTCDECL PSINGLE_LIST_ENTRY InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY Entry); IN PSINGLE_LIST_ENTRY Entry);
STATIC XTCDECL BOOLEAN ListEmpty(IN PSINGLE_LIST_HEADER ListHead); STATIC XTCDECL BOOLEAN ListEmpty(IN PSINGLE_LIST_HEADER ListHead);
STATIC XTAPI USHORT QueryListDepth(IN PSINGLE_LIST_HEADER ListHead); STATIC XTAPI USHORT QueryListDepth(IN PSINGLE_LIST_HEADER ListHead);
STATIC XTCDECL VOID RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead, STATIC XTCDECL VOID RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY Entry); IN PSINGLE_LIST_ENTRY Entry);
STATIC XTCDECL VOID SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead, STATIC XTCDECL PSINGLE_LIST_ENTRY SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN OUT PSINGLE_LIST_HEADER SpliceList); IN OUT PSINGLE_LIST_HEADER SpliceList);
STATIC XTCDECL VOID SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead, STATIC XTCDECL PSINGLE_LIST_ENTRY SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN OUT PSINGLE_LIST_HEADER SpliceList); IN OUT PSINGLE_LIST_HEADER SpliceList);
STATIC XTCDECL PSINGLE_LIST_ENTRY TakeFirstEntry(IN PSINGLE_LIST_HEADER ListHead);
}; };
} }

View File

@@ -48,7 +48,7 @@ XTCDECL
VOID VOID
RTL::SinglyList::InitializeListHead(IN PSINGLE_LIST_HEADER ListHead) RTL::SinglyList::InitializeListHead(IN PSINGLE_LIST_HEADER ListHead)
{ {
/* Initialize the list head */ /* Initialize the singly linked list head */
ListHead->Alignment = 0; ListHead->Alignment = 0;
} }
@@ -61,19 +61,27 @@ RTL::SinglyList::InitializeListHead(IN PSINGLE_LIST_HEADER ListHead)
* @param Entry * @param Entry
* Supplies a pointer to the entry that will be inserted in the list. * Supplies a pointer to the entry that will be inserted in the list.
* *
* @return This routine does not return any value. * @return This routine returns a pointer to the original first entry in the list.
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTCDECL XTCDECL
VOID PSINGLE_LIST_ENTRY
RTL::SinglyList::InsertHeadList(IN OUT PSINGLE_LIST_HEADER ListHead, RTL::SinglyList::InsertHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY Entry) IN PSINGLE_LIST_ENTRY Entry)
{ {
PSINGLE_LIST_ENTRY OriginalEntry;
/* Store the original first entry */
OriginalEntry = ListHead->Next.Next;
/* Insert entry at the head of the list and increment depth */ /* Insert entry at the head of the list and increment depth */
Entry->Next = ListHead->Next.Next; Entry->Next = ListHead->Next.Next;
ListHead->Next.Next = Entry; ListHead->Next.Next = Entry;
ListHead->Depth++; ListHead->Depth++;
/* Return original first entry */
return OriginalEntry;
} }
/** /**
@@ -85,16 +93,16 @@ RTL::SinglyList::InsertHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
* @param Entry * @param Entry
* Supplies a pointer to the entry that will be inserted in the list. * Supplies a pointer to the entry that will be inserted in the list.
* *
* @return This routine does not return any value. * @return This routine returns a pointer to the original last entry in the list.
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTCDECL XTCDECL
VOID PSINGLE_LIST_ENTRY
RTL::SinglyList::InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead, RTL::SinglyList::InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN PSINGLE_LIST_ENTRY Entry) IN PSINGLE_LIST_ENTRY Entry)
{ {
PSINGLE_LIST_ENTRY CurrentEntry; PSINGLE_LIST_ENTRY CurrentEntry, OriginalEntry;
/* Set Next pointer of the new entry to NULLPTR */ /* Set Next pointer of the new entry to NULLPTR */
Entry->Next = NULLPTR; Entry->Next = NULLPTR;
@@ -102,6 +110,9 @@ RTL::SinglyList::InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
/* Check if the list is empty */ /* Check if the list is empty */
if(ListEmpty(ListHead)) if(ListEmpty(ListHead))
{ {
/* Store the original last entry */
OriginalEntry = ListHead->Next.Next;
/* Insert entry at the head */ /* Insert entry at the head */
ListHead->Next.Next = Entry; ListHead->Next.Next = Entry;
} }
@@ -115,12 +126,18 @@ RTL::SinglyList::InsertTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
CurrentEntry = CurrentEntry->Next; CurrentEntry = CurrentEntry->Next;
} }
/* Store the original last entry */
OriginalEntry = CurrentEntry;
/* Insert entry at the tail */ /* Insert entry at the tail */
CurrentEntry->Next = Entry; CurrentEntry->Next = Entry;
} }
/* Increment list depth */ /* Increment list depth */
ListHead->Depth++; ListHead->Depth++;
/* Return original last entry */
return OriginalEntry;
} }
/** /**
@@ -189,7 +206,7 @@ RTL::SinglyList::RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead,
/* Check if the list is empty */ /* Check if the list is empty */
if(ListEmpty(ListHead)) if(ListEmpty(ListHead))
{ {
/* List is empty, nothing to remove */ /* List is empty, nothing to remove, return */
return; return;
} }
@@ -200,7 +217,7 @@ RTL::SinglyList::RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead,
ListHead->Next.Next = Entry->Next; ListHead->Next.Next = Entry->Next;
ListHead->Depth--; ListHead->Depth--;
/* Nothing else to do */ /* Nothing else to do, return */
return; return;
} }
@@ -214,7 +231,7 @@ RTL::SinglyList::RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead,
/* Check if we reached the end of the list */ /* Check if we reached the end of the list */
if(PreviousEntry == NULLPTR) if(PreviousEntry == NULLPTR)
{ {
/* Entry not found */ /* Entry not found, return */
return; return;
} }
} }
@@ -233,22 +250,25 @@ RTL::SinglyList::RemoveEntryList(IN PSINGLE_LIST_HEADER ListHead,
* @param SpliceList * @param SpliceList
* Supplies a pointer to a structure that represents the head of the list that will be spliced. * Supplies a pointer to a structure that represents the head of the list that will be spliced.
* *
* @return This routine does not return any value. * @return This routine returns a pointer to the original first entry in the list.
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTCDECL XTCDECL
VOID PSINGLE_LIST_ENTRY
RTL::SinglyList::SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead, RTL::SinglyList::SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN OUT PSINGLE_LIST_HEADER SpliceList) IN OUT PSINGLE_LIST_HEADER SpliceList)
{ {
PSINGLE_LIST_ENTRY LastEntry; PSINGLE_LIST_ENTRY LastEntry, OriginalEntry;
/* Store the original last entry */
OriginalEntry = ListHead->Next.Next;
/* Check if the list to splice is empty */ /* Check if the list to splice is empty */
if(ListEmpty(SpliceList)) if(ListEmpty(SpliceList))
{ {
/* Nothing to splice, return */ /* Nothing to splice, return original first entry */
return; return OriginalEntry;
} }
/* Find the last entry of the list to splice */ /* Find the last entry of the list to splice */
@@ -269,6 +289,9 @@ RTL::SinglyList::SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
/* Reinitialize the source list to empty */ /* Reinitialize the source list to empty */
SpliceList->Next.Next = NULLPTR; SpliceList->Next.Next = NULLPTR;
SpliceList->Depth = 0; SpliceList->Depth = 0;
/* Return the original last entry */
return OriginalEntry;
} }
/** /**
@@ -280,28 +303,24 @@ RTL::SinglyList::SpliceHeadList(IN OUT PSINGLE_LIST_HEADER ListHead,
* @param SpliceList * @param SpliceList
* Supplies a pointer to the head of the list that will be spliced. * Supplies a pointer to the head of the list that will be spliced.
* *
* @return This routine does not return any value. * @return This routine returns a pointer to the original last entry in the list.
* *
* @since XT 1.0 * @since XT 1.0
*/ */
XTCDECL XTCDECL
VOID PSINGLE_LIST_ENTRY
RTL::SinglyList::SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead, RTL::SinglyList::SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
IN OUT PSINGLE_LIST_HEADER SpliceList) IN OUT PSINGLE_LIST_HEADER SpliceList)
{ {
PSINGLE_LIST_ENTRY LastEntry; PSINGLE_LIST_ENTRY LastEntry, OriginalEntry;
/* Check if the list to splice is empty */
if(ListEmpty(SpliceList))
{
/* Nothing to splice, return */
return;
}
/* Check if the destination list is empty */ /* Check if the destination list is empty */
if(ListHead->Next.Next == NULLPTR) if(ListEmpty(ListHead))
{ {
/* Simply move the splice list to the destination head */ /* Destination is empty, original last entry is NULLPTR */
OriginalEntry = NULLPTR;
/* Move the splice list to the destination head */
ListHead->Next.Next = SpliceList->Next.Next; ListHead->Next.Next = SpliceList->Next.Next;
} }
else else
@@ -314,6 +333,9 @@ RTL::SinglyList::SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
LastEntry = LastEntry->Next; LastEntry = LastEntry->Next;
} }
/* Store the original last entry */
OriginalEntry = LastEntry;
/* Splice the list at the tail of destination */ /* Splice the list at the tail of destination */
LastEntry->Next = SpliceList->Next.Next; LastEntry->Next = SpliceList->Next.Next;
} }
@@ -324,4 +346,41 @@ RTL::SinglyList::SpliceTailList(IN OUT PSINGLE_LIST_HEADER ListHead,
/* Reinitialize the source list to empty */ /* Reinitialize the source list to empty */
SpliceList->Next.Next = NULLPTR; SpliceList->Next.Next = NULLPTR;
SpliceList->Depth = 0; SpliceList->Depth = 0;
/* Return the original last entry */
return OriginalEntry;
}
/**
* Retrieves the first entry from a singly linked list and removes it from the list.
*
* @param ListHead
* Pointer to a structure that serves as the list header.
*
* @return This routine returns a pointer to the first entry in the list, or NULLPTR if the list is empty.
*
* @since XT 1.0
*/
XTCDECL
PSINGLE_LIST_ENTRY
RTL::SinglyList::TakeFirstEntry(IN PSINGLE_LIST_HEADER ListHead)
{
PSINGLE_LIST_ENTRY Entry;
/* Check if the list is empty */
if(ListEmpty(ListHead))
{
/* List is empty, return NULLPTR */
return NULLPTR;
}
/* Get the first entry */
Entry = ListHead->Next.Next;
/* Remove entry from the list */
ListHead->Next.Next = Entry->Next;
ListHead->Depth--;
/* Return the first entry */
return Entry;
} }