Преглед изворни кода

SLinkedList: implement RemoveFirst and RemoveLast

ambrop7 пре 12 година
родитељ
комит
31abf88633

+ 4 - 0
structure/SLinkedList_decl.h

@@ -52,6 +52,10 @@ static void SLinkedList_Append (SLinkedList *o, SLinkedListEntry *entry);
 static void SLinkedList_InsertBefore (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *before_entry);
 static void SLinkedList_InsertBefore (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *before_entry);
 static void SLinkedList_InsertAfter (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *after_entry);
 static void SLinkedList_InsertAfter (SLinkedList *o, SLinkedListEntry *entry, SLinkedListEntry *after_entry);
 static void SLinkedList_Remove (SLinkedList *o, SLinkedListEntry *entry);
 static void SLinkedList_Remove (SLinkedList *o, SLinkedListEntry *entry);
+static void SLinkedList_RemoveFirst (SLinkedList *o);
+#if SLINKEDLIST_PARAM_FEATURE_LAST
+static void SLinkedList_RemoveLast (SLinkedList *o);
+#endif
 static SLinkedListEntry * SLinkedList_First (const SLinkedList *o);
 static SLinkedListEntry * SLinkedList_First (const SLinkedList *o);
 #if SLINKEDLIST_PARAM_FEATURE_LAST
 #if SLINKEDLIST_PARAM_FEATURE_LAST
 static SLinkedListEntry * SLinkedList_Last (const SLinkedList *o);
 static SLinkedListEntry * SLinkedList_Last (const SLinkedList *o);

+ 2 - 0
structure/SLinkedList_footer.h

@@ -45,6 +45,8 @@
 #undef SLinkedList_InsertBefore
 #undef SLinkedList_InsertBefore
 #undef SLinkedList_InsertAfter
 #undef SLinkedList_InsertAfter
 #undef SLinkedList_Remove
 #undef SLinkedList_Remove
+#undef SLinkedList_RemoveFirst
+#undef SLinkedList_RemoveLast
 #undef SLinkedList_First
 #undef SLinkedList_First
 #undef SLinkedList_Last
 #undef SLinkedList_Last
 #undef SLinkedList_IsEmpty
 #undef SLinkedList_IsEmpty

+ 2 - 0
structure/SLinkedList_header.h

@@ -49,6 +49,8 @@
 #define SLinkedList_InsertBefore MERGE(SLinkedList, _InsertBefore)
 #define SLinkedList_InsertBefore MERGE(SLinkedList, _InsertBefore)
 #define SLinkedList_InsertAfter MERGE(SLinkedList, _InsertAfter)
 #define SLinkedList_InsertAfter MERGE(SLinkedList, _InsertAfter)
 #define SLinkedList_Remove MERGE(SLinkedList, _Remove)
 #define SLinkedList_Remove MERGE(SLinkedList, _Remove)
+#define SLinkedList_RemoveFirst MERGE(SLinkedList, _RemoveFirst)
+#define SLinkedList_RemoveLast MERGE(SLinkedList, _RemoveLast)
 #define SLinkedList_First MERGE(SLinkedList, _First)
 #define SLinkedList_First MERGE(SLinkedList, _First)
 #define SLinkedList_Last MERGE(SLinkedList, _Last)
 #define SLinkedList_Last MERGE(SLinkedList, _Last)
 #define SLinkedList_IsEmpty MERGE(SLinkedList, _IsEmpty)
 #define SLinkedList_IsEmpty MERGE(SLinkedList, _IsEmpty)

+ 28 - 0
structure/SLinkedList_impl.h

@@ -131,6 +131,34 @@ static void SLinkedList_Remove (SLinkedList *o, SLinkedListEntry *entry)
     }
     }
 }
 }
 
 
+static void SLinkedList_RemoveFirst (SLinkedList *o)
+{
+    ASSERT(o->first)
+    
+    o->first = SLinkedList_next(o->first);
+    if (o->first) {
+        SLinkedList_prev(o->first) = NULL;
+    } else {
+#if SLINKEDLIST_PARAM_FEATURE_LAST
+        o->last = NULL;
+#endif
+    }
+}
+
+#if SLINKEDLIST_PARAM_FEATURE_LAST
+static void SLinkedList_RemoveLast (SLinkedList *o)
+{
+    ASSERT(o->last)
+    
+    o->last = SLinkedList_prev(o->last);
+    if (o->last) {
+        SLinkedList_next(o->last) = NULL;
+    } else {
+        o->first = NULL;
+    }
+}
+#endif
+
 static SLinkedListEntry * SLinkedList_First (const SLinkedList *o)
 static SLinkedListEntry * SLinkedList_First (const SLinkedList *o)
 {
 {
     return o->first;
     return o->first;