diff --git a/storm/list/TSList.hpp b/storm/list/TSList.hpp index 94aaf0a..440027b 100644 --- a/storm/list/TSList.hpp +++ b/storm/list/TSList.hpp @@ -30,6 +30,7 @@ class TSList { T* DeleteNode(T* ptr); T* Head(); void InitializeTerminator(); + bool IsEmpty(); bool IsLinked(T* ptr); TSLink* Link(const T* ptr); void LinkNode(T* ptr, uint32_t linktype, T* existingptr); @@ -96,6 +97,11 @@ void TSList::InitializeTerminator() { this->m_terminator.m_next = reinterpret_cast(~reinterpret_cast(&this->m_terminator)); } +template +bool TSList::IsEmpty() { + return this->Head() == nullptr; +} + template bool TSList::IsLinked(T* ptr) { return TGetLink::Link(ptr, this->m_linkoffset)->IsLinked(); diff --git a/test/List.cpp b/test/List.cpp index 1742430..972bc5c 100644 --- a/test/List.cpp +++ b/test/List.cpp @@ -19,6 +19,26 @@ TEST_CASE("TSList::Head", "[list]") { } } +TEST_CASE("TSList::IsEmpty", "[list]") { + SECTION("returns true if just initialized") { + STORM_LIST(TestListNode) list; + CHECK(list.IsEmpty()); + } + + SECTION("returns false if there are linked items") { + STORM_LIST(TestListNode) list; + list.NewNode(STORM_LIST_TAIL, 0, 0); + CHECK_FALSE(list.IsEmpty()); + } + + SECTION("returns true after clearing a populated list") { + STORM_LIST(TestListNode) list; + list.NewNode(STORM_LIST_TAIL, 0, 0); + list.Clear(); + CHECK(list.IsEmpty()); + } +} + TEST_CASE("TSList::LinkToHead", "[list]") { SECTION("links node to head correctly") { STORM_LIST(TestListNode) list;