]> Savannah Git Hosting - gnulib.git/commitdiff
list: Add remove_first and remove_last operations.
authorBruno Haible <bruno@clisp.org>
Fri, 1 May 2020 23:56:17 +0000 (01:56 +0200)
committerBruno Haible <bruno@clisp.org>
Fri, 1 May 2020 23:56:17 +0000 (01:56 +0200)
Suggested by Marc Nieper-Wißkirchen <marc.nieper+gnu@gmail.com> in
<https://lists.gnu.org/archive/html/bug-gnulib/2020-04/msg00092.html>.

* lib/gl_list.h (struct gl_list_implementation): Add fields
remove_first, remove_last.
(gl_list_remove_first, gl_list_remove_last): New functions.
* lib/gl_array_list.c (gl_array_remove_first, gl_array_remove_last): New
functions, based on gl_array_remove_at.
(gl_array_list_implementation): Implement the new operations.
* lib/gl_carray_list.c (gl_carray_remove_first, gl_carray_remove_last):
New functions, based on gl_carray_remove_at.
(gl_carray_list_implementation): Implement the new operations.
* lib/gl_anylinked_list2.h (gl_linked_remove_first,
gl_linked_remove_last): New functions, based on gl_linked_remove_at.
* lib/gl_linked_list.c (gl_linked_list_implementation): Implement the
new operations.
* lib/gl_linkedhash_list.c (gl_linkedhash_list_implementation):
Likewise.
* lib/gl_anytree_list2.h (gl_tree_remove_first, gl_tree_remove_last):
New functions, based on gl_tree_remove_at.
* lib/gl_avltree_list.c (gl_avltree_list_implementation): Implement the
new operations.
* lib/gl_avltreehash_list.c (gl_avltreehash_list_implementation):
Likewise.
* lib/gl_rbtree_list.c (gl_rbtree_list_implementation): Likewise.
* lib/gl_rbtreehash_list.c (gl_rbtreehash_list_implementation):
Likewise.
* lib/gl_sublist.c (gl_sublist_remove_first, gl_sublist_remove_last):
New functions, based on gl_sublist_remove_at.
(gl_sublist_list_implementation): Implement the new operations.
* lib/gl_list.hh (class gl_List): Add methods remove_first,
remove_last.
* tests/test-array_list.c (main): Test also gl_list_remove_first and
gl_list_remove_last.
* tests/test-avltree_list.c (main): Likewise.
* tests/test-avltreehash_list.c (main): Likewise.
* tests/test-carray_list.c (main): Likewise.
* tests/test-linked_list.c (main): Likewise.
* tests/test-linkedhash_list.c (main): Likewise.
* tests/test-rbtree_list.c (main): Likewise.
* tests/test-rbtreehash_list.c (main): Likewise.

22 files changed:
ChangeLog
lib/gl_anylinked_list2.h
lib/gl_anytree_list2.h
lib/gl_array_list.c
lib/gl_avltree_list.c
lib/gl_avltreehash_list.c
lib/gl_carray_list.c
lib/gl_linked_list.c
lib/gl_linkedhash_list.c
lib/gl_list.h
lib/gl_list.hh
lib/gl_rbtree_list.c
lib/gl_rbtreehash_list.c
lib/gl_sublist.c
tests/test-array_list.c
tests/test-avltree_list.c
tests/test-avltreehash_list.c
tests/test-carray_list.c
tests/test-linked_list.c
tests/test-linkedhash_list.c
tests/test-rbtree_list.c
tests/test-rbtreehash_list.c

index 567aafa32f33aeeabb463c1f148548c2ac1d32e5..033f3be48e41618ea89f09eb6ed7c9e26da30f6f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+2020-05-01  Bruno Haible  <bruno@clisp.org>
+
+       list: Add remove_first and remove_last operations.
+       Suggested by Marc Nieper-Wißkirchen <marc.nieper+gnu@gmail.com> in
+       <https://lists.gnu.org/archive/html/bug-gnulib/2020-04/msg00092.html>.
+       * lib/gl_list.h (struct gl_list_implementation): Add fields
+       remove_first, remove_last.
+       (gl_list_remove_first, gl_list_remove_last): New functions.
+       * lib/gl_array_list.c (gl_array_remove_first, gl_array_remove_last): New
+       functions, based on gl_array_remove_at.
+       (gl_array_list_implementation): Implement the new operations.
+       * lib/gl_carray_list.c (gl_carray_remove_first, gl_carray_remove_last):
+       New functions, based on gl_carray_remove_at.
+       (gl_carray_list_implementation): Implement the new operations.
+       * lib/gl_anylinked_list2.h (gl_linked_remove_first,
+       gl_linked_remove_last): New functions, based on gl_linked_remove_at.
+       * lib/gl_linked_list.c (gl_linked_list_implementation): Implement the
+       new operations.
+       * lib/gl_linkedhash_list.c (gl_linkedhash_list_implementation):
+       Likewise.
+       * lib/gl_anytree_list2.h (gl_tree_remove_first, gl_tree_remove_last):
+       New functions, based on gl_tree_remove_at.
+       * lib/gl_avltree_list.c (gl_avltree_list_implementation): Implement the
+       new operations.
+       * lib/gl_avltreehash_list.c (gl_avltreehash_list_implementation):
+       Likewise.
+       * lib/gl_rbtree_list.c (gl_rbtree_list_implementation): Likewise.
+       * lib/gl_rbtreehash_list.c (gl_rbtreehash_list_implementation):
+       Likewise.
+       * lib/gl_sublist.c (gl_sublist_remove_first, gl_sublist_remove_last):
+       New functions, based on gl_sublist_remove_at.
+       (gl_sublist_list_implementation): Implement the new operations.
+       * lib/gl_list.hh (class gl_List): Add methods remove_first,
+       remove_last.
+       * tests/test-array_list.c (main): Test also gl_list_remove_first and
+       gl_list_remove_last.
+       * tests/test-avltree_list.c (main): Likewise.
+       * tests/test-avltreehash_list.c (main): Likewise.
+       * tests/test-carray_list.c (main): Likewise.
+       * tests/test-linked_list.c (main): Likewise.
+       * tests/test-linkedhash_list.c (main): Likewise.
+       * tests/test-rbtree_list.c (main): Likewise.
+       * tests/test-rbtreehash_list.c (main): Likewise.
+
 2020-05-01  Bruno Haible  <bruno@clisp.org>
 
        parse-datetime: Fix a build failure with an older bison version.
index 114106c7dc5aaf283f2b976b77e1742813157e1f..0032dc88267be721de85b6e1f872c19675ced992 100644 (file)
@@ -881,6 +881,68 @@ gl_linked_remove_at (gl_list_t list, size_t position)
   return true;
 }
 
+static bool
+gl_linked_remove_first (gl_list_t list)
+{
+  size_t count = list->count;
+  gl_list_node_t removed_node;
+
+  if (count == 0)
+    return false;
+  /* Here we know count > 0.  */
+  /* Like gl_linked_remove_at (list, 0).  */
+  {
+    gl_list_node_t node;
+    gl_list_node_t after_removed;
+
+    node = &list->root;
+    removed_node = node->next;
+    after_removed = node->next->next;
+    ASYNCSAFE(gl_list_node_t) node->next = after_removed;
+    after_removed->prev = node;
+  }
+#if WITH_HASHTABLE
+  remove_from_bucket (list, removed_node);
+#endif
+  list->count--;
+
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (removed_node->value);
+  free (removed_node);
+  return true;
+}
+
+static bool
+gl_linked_remove_last (gl_list_t list)
+{
+  size_t count = list->count;
+  gl_list_node_t removed_node;
+
+  if (count == 0)
+    return false;
+  /* Here we know count > 0.  */
+  /* Like gl_linked_remove_at (list, count - 1).  */
+  {
+    gl_list_node_t node;
+    gl_list_node_t before_removed;
+
+    node = &list->root;
+    removed_node = node->prev;
+    before_removed = node->prev->prev;
+    node->prev = before_removed;
+    ASYNCSAFE(gl_list_node_t) before_removed->next = node;
+  }
+#if WITH_HASHTABLE
+  remove_from_bucket (list, removed_node);
+#endif
+  list->count--;
+
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (removed_node->value);
+  free (removed_node);
+  return true;
+}
+
 static bool
 gl_linked_remove (gl_list_t list, const void *elt)
 {
index c5a67dbd0c5fad182664dfc113a37e9c34902494..41e41dd81bc85802072352ce613b36b32b66d506 100644 (file)
@@ -485,6 +485,34 @@ gl_tree_remove_at (gl_list_t list, size_t position)
   return gl_tree_remove_node (list, node);
 }
 
+static bool
+gl_tree_remove_first (gl_list_t list)
+{
+  gl_list_node_t node = list->root;
+
+  if (node != NULL)
+    {
+      node = node_at (node, 0);
+      return gl_tree_remove_node (list, node);
+    }
+  else
+    return false;
+}
+
+static bool
+gl_tree_remove_last (gl_list_t list)
+{
+  gl_list_node_t node = list->root;
+
+  if (node != NULL)
+    {
+      node = node_at (node, node->branch_size - 1);
+      return gl_tree_remove_node (list, node);
+    }
+  else
+    return false;
+}
+
 static bool
 gl_tree_remove (gl_list_t list, const void *elt)
 {
index 49509620f7353547c1abe7d5c8f1bda2f55c07f7..e00255c72461c96f5fb3e4d17326b1c3b7747fcf 100644 (file)
@@ -405,6 +405,41 @@ gl_array_remove_at (gl_list_t list, size_t position)
   return true;
 }
 
+static bool
+gl_array_remove_first (gl_list_t list)
+{
+  size_t count = list->count;
+  const void **elements;
+  size_t i;
+
+  if (count == 0)
+    return false;
+  /* Like gl_array_remove_at (list, 0).  */
+  elements = list->elements;
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (elements[0]);
+  for (i = 1; i < count; i++)
+    elements[i - 1] = elements[i];
+  list->count = count - 1;
+  return true;
+}
+
+static bool
+gl_array_remove_last (gl_list_t list)
+{
+  size_t count = list->count;
+  const void **elements;
+
+  if (count == 0)
+    return false;
+  /* Like gl_array_remove_at (list, count - 1).  */
+  elements = list->elements;
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (elements[count - 1]);
+  list->count = count - 1;
+  return true;
+}
+
 static bool
 gl_array_remove (gl_list_t list, const void *elt)
 {
@@ -662,6 +697,8 @@ const struct gl_list_implementation gl_array_list_implementation =
     gl_array_nx_add_at,
     gl_array_remove_node,
     gl_array_remove_at,
+    gl_array_remove_first,
+    gl_array_remove_last,
     gl_array_remove,
     gl_array_list_free,
     gl_array_iterator,
index 35ffec6f3c3b5b96365bf2283ca1aadb01297468..2906f5a8ca7552793e5dfd18bf6770a04e0db6a9 100644 (file)
@@ -89,6 +89,8 @@ const struct gl_list_implementation gl_avltree_list_implementation =
     gl_tree_nx_add_at,
     gl_tree_remove_node,
     gl_tree_remove_at,
+    gl_tree_remove_first,
+    gl_tree_remove_last,
     gl_tree_remove,
     gl_tree_list_free,
     gl_tree_iterator,
index 9f795ff86483c8ffba022d2a4c3b7e0c634d5f6f..576f5336a4822adedd8f23cd55c845cb30a28666 100644 (file)
@@ -111,6 +111,8 @@ const struct gl_list_implementation gl_avltreehash_list_implementation =
     gl_tree_nx_add_at,
     gl_tree_remove_node,
     gl_tree_remove_at,
+    gl_tree_remove_first,
+    gl_tree_remove_last,
     gl_tree_remove,
     gl_tree_list_free,
     gl_tree_iterator,
index 36a8773c354ade01d06e9a130efb9b9012440d05..fa17d48e6bd9c83b9300867ba6b2c4259f3b274a 100644 (file)
@@ -544,6 +544,44 @@ gl_carray_remove_at (gl_list_t list, size_t position)
   return true;
 }
 
+static bool
+gl_carray_remove_first (gl_list_t list)
+{
+  size_t count = list->count;
+  size_t i0;
+
+  if (count == 0)
+    return false;
+  /* Here we know count > 0.  */
+  /* Like gl_carray_remove_at (list, 0).  */
+  i0 = list->offset;
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (list->elements[i0]);
+  i0++;
+  list->offset = (i0 == list->allocated ? 0 : i0);
+  list->count = count - 1;
+  return true;
+}
+
+static bool
+gl_carray_remove_last (gl_list_t list)
+{
+  size_t count = list->count;
+  size_t i1;
+
+  if (count == 0)
+    return false;
+  /* Here we know count > 0.  */
+  /* Like gl_carray_remove_at (list, count - 1).  */
+  i1 = list->offset + count - 1;
+  if (i1 >= list->allocated)
+    i1 -= list->allocated;
+  if (list->base.dispose_fn != NULL)
+    list->base.dispose_fn (list->elements[i1]);
+  list->count = count - 1;
+  return true;
+}
+
 static bool
 gl_carray_remove_node (gl_list_t list, gl_list_node_t node)
 {
@@ -855,6 +893,8 @@ const struct gl_list_implementation gl_carray_list_implementation =
     gl_carray_nx_add_at,
     gl_carray_remove_node,
     gl_carray_remove_at,
+    gl_carray_remove_first,
+    gl_carray_remove_last,
     gl_carray_remove,
     gl_carray_list_free,
     gl_carray_iterator,
index b1391cef9ab6625e41ec778629b75defe352085b..e2bf526d1a58a4288d58d5f00956225b8c74aea6 100644 (file)
@@ -49,6 +49,8 @@ const struct gl_list_implementation gl_linked_list_implementation =
     gl_linked_nx_add_at,
     gl_linked_remove_node,
     gl_linked_remove_at,
+    gl_linked_remove_first,
+    gl_linked_remove_last,
     gl_linked_remove,
     gl_linked_list_free,
     gl_linked_iterator,
index 7c7f999f876249704d39818cf2c82f97765b2b88..5ffc0cef2f012b98837817c4349355ae4f1d19be 100644 (file)
@@ -97,6 +97,8 @@ const struct gl_list_implementation gl_linkedhash_list_implementation =
     gl_linked_nx_add_at,
     gl_linked_remove_node,
     gl_linked_remove_at,
+    gl_linked_remove_first,
+    gl_linked_remove_last,
     gl_linked_remove,
     gl_linked_list_free,
     gl_linked_iterator,
index 39d14401f96dcc4e53ebf468fba90d8fc25a5f67..ea5018d34ecb727daadd7f202419cfe3a3450dbe 100644 (file)
@@ -88,6 +88,8 @@ extern "C" {
    gl_list_add_at              O(n)     O(n)   O(log n)    O(n)    O((log n)²)/O(log n)
    gl_list_remove_node         O(n)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
    gl_list_remove_at           O(n)     O(n)   O(log n)    O(n)    O((log n)²)/O(log n)
+   gl_list_remove_first      O(n)/O(1)  O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
+   gl_list_remove_last         O(1)     O(1)   O(log n)  O(n)/O(1) O((log n)²)/O(log n)
    gl_list_remove              O(n)     O(n)     O(n)    O(n)/O(1) O((log n)²)/O(log n)
    gl_list_iterator            O(1)     O(1)   O(log n)    O(1)       O(log n)
    gl_list_iterator_from_to    O(1)     O(n)   O(log n)    O(n)       O(log n)
@@ -328,6 +330,14 @@ extern bool gl_list_remove_node (gl_list_t list, gl_list_node_t node);
    Returns true.  */
 extern bool gl_list_remove_at (gl_list_t list, size_t position);
 
+/* Removes the element at the first position from the list.
+   Returns true if it was found and removed, or false if the list was empty.  */
+extern bool gl_list_remove_first (gl_list_t list);
+
+/* Removes the element at the last position from the list.
+   Returns true if it was found and removed, or false if the list was empty.  */
+extern bool gl_list_remove_last (gl_list_t list);
+
 /* Searches and removes an element from the list.
    Returns true if it was found and removed.  */
 extern bool gl_list_remove (gl_list_t list, const void *elt);
@@ -508,6 +518,8 @@ struct gl_list_implementation
                                const void *elt);
   bool (*remove_node) (gl_list_t list, gl_list_node_t node);
   bool (*remove_at) (gl_list_t list, size_t position);
+  bool (*remove_first) (gl_list_t list);
+  bool (*remove_last) (gl_list_t list);
   bool (*remove_elt) (gl_list_t list, const void *elt);
   void (*list_free) (gl_list_t list);
   /* gl_list_iterator_t functions.  */
@@ -747,6 +759,20 @@ gl_list_remove_at (gl_list_t list, size_t position)
          ->remove_at (list, position);
 }
 
+GL_LIST_INLINE bool
+gl_list_remove_first (gl_list_t list)
+{
+  return ((const struct gl_list_impl_base *) list)->vtable
+         ->remove_first (list);
+}
+
+GL_LIST_INLINE bool
+gl_list_remove_last (gl_list_t list)
+{
+  return ((const struct gl_list_impl_base *) list)->vtable
+         ->remove_last (list);
+}
+
 GL_LIST_INLINE bool
 gl_list_remove (gl_list_t list, const void *elt)
 {
index f67c2144773e33e91b6020f6991fb814068bfa8a..2cc83be3a279c7cdc5a5af43bd6af074c578826f 100644 (file)
@@ -219,6 +219,18 @@ public:
   bool remove_at (size_t position)
     { return gl_list_remove_at (_ptr, position); }
 
+  /* Removes the element at the first position from the list.
+     Returns true if it was found and removed,
+     or false if the list was empty.  */
+  bool remove_first ()
+    { return gl_list_remove_first (_ptr); }
+
+  /* Removes the element at the last position from the list.
+     Returns true if it was found and removed,
+     or false if the list was empty.  */
+  bool remove_last ()
+    { return gl_list_remove_last (_ptr); }
+
   /* Searches and removes an element from the list.
      Returns true if it was found and removed.  */
   bool remove (ELTYPE * elt)
index d79becf4aa4a1a70bf50a7641db892a14ebeb405..6ae78c7fd8f8b122cba210221fb6ef58db586bde 100644 (file)
@@ -87,6 +87,8 @@ const struct gl_list_implementation gl_rbtree_list_implementation =
     gl_tree_nx_add_at,
     gl_tree_remove_node,
     gl_tree_remove_at,
+    gl_tree_remove_first,
+    gl_tree_remove_last,
     gl_tree_remove,
     gl_tree_list_free,
     gl_tree_iterator,
index be2ee6f4e92cb53b9209a1e2182725a8434dc029..b59b5f48770c268b68d4a26dcf18fcab27827419 100644 (file)
@@ -112,6 +112,8 @@ const struct gl_list_implementation gl_rbtreehash_list_implementation =
     gl_tree_nx_add_at,
     gl_tree_remove_node,
     gl_tree_remove_at,
+    gl_tree_remove_first,
+    gl_tree_remove_last,
     gl_tree_remove,
     gl_tree_list_free,
     gl_tree_iterator,
index e529a6b897b203abcf77b0a1a63e71409962fde1..6e95c3b3efb90c78395d33c4ef622bf6acac57f2 100644 (file)
@@ -258,6 +258,22 @@ gl_sublist_remove_at (gl_list_t list, size_t position)
   return gl_list_remove_at (list->whole, list->start + position);
 }
 
+static bool
+gl_sublist_remove_first (gl_list_t list)
+{
+  if (list->end == list->start)
+    return false;
+  return gl_list_remove_at (list->whole, list->start);
+}
+
+static bool
+gl_sublist_remove_last (gl_list_t list)
+{
+  if (list->end == list->start)
+    return false;
+  return gl_list_remove_at (list->whole, list->end - 1);
+}
+
 static bool
 gl_sublist_remove (gl_list_t list, const void *elt)
 {
@@ -424,6 +440,8 @@ static const struct gl_list_implementation gl_sublist_list_implementation =
     gl_sublist_nx_add_at,
     gl_sublist_remove_node,
     gl_sublist_remove_at,
+    gl_sublist_remove_first,
+    gl_sublist_remove_last,
     gl_sublist_remove,
     gl_sublist_list_free,
     gl_sublist_iterator,
index 158e72814c3d871f80eba4abfc47c2ee6916c568..f617787674f47d6676031d9035a904593ee7a401 100644 (file)
@@ -77,7 +77,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -252,7 +252,23 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -262,7 +278,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -272,7 +288,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2;
@@ -292,7 +308,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter2);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index 03ff024edc5d4539aecdc1393fef44a06fa1c269..b69816d705eae05db0aaa73670611302063841b2 100644 (file)
@@ -94,7 +94,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -325,7 +325,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -336,7 +354,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -347,7 +365,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -372,7 +390,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index 806b0e37b2fc453afb8948135929109e0f8458e3..6dcded46031bbb0e86172db91848f5eeac591448 100644 (file)
@@ -124,7 +124,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -355,7 +355,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -366,7 +384,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -377,7 +395,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -402,7 +420,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index c97526685f769188e274bc1f30161d835cb98e54..a6e9511a7534c60e39c7d13127fdbfeeeef06735 100644 (file)
@@ -90,7 +90,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -321,7 +321,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -332,7 +350,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -343,7 +361,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -368,7 +386,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index c139677fef2cc5226ea8d108ef1c40effd815d49..7c9954bbeb63c2a19d4e2001efd9c0a59ce82409 100644 (file)
@@ -90,7 +90,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -321,7 +321,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -332,7 +350,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -343,7 +361,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -368,7 +386,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index 921c62ccc21d56e4ec1268247d71b3a1be7e0101..7fa8b4f4b7e58e2dce4ad081dd1b3f0448089f32 100644 (file)
@@ -120,7 +120,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -351,7 +351,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -362,7 +380,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -373,7 +391,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -398,7 +416,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index 32d9d3206b35f0e03d9decac7ff7d94f00bc7c9c..efd2cb18e7df36e45e7d1e2d4a1b8f4d91933c60 100644 (file)
@@ -94,7 +94,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -325,7 +325,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -336,7 +354,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -347,7 +365,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -372,7 +390,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);
index 949a6f4827eecb5c1f86eaa5a42525a0e46f5a7f..d6bbcb3b730b0c984f44c0b084612e94dab2614f 100644 (file)
@@ -124,7 +124,7 @@ main (int argc, char *argv[])
 
     for (repeat = 0; repeat < 10000; repeat++)
       {
-        unsigned int operation = RANDOM (16);
+        unsigned int operation = RANDOM (18);
         switch (operation)
           {
           case 0:
@@ -355,7 +355,25 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 11: case 12: /* remove 1 element */
+          case 11: /* remove first element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_first (list1);
+              ASSERT (gl_list_remove_first (list2) == removed1);
+              ASSERT (gl_list_remove_first (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 12: /* remove last element */
+            {
+              size_t n = gl_list_size (list1);
+              bool removed1 = gl_list_remove_last (list1);
+              ASSERT (gl_list_remove_last (list2) == removed1);
+              ASSERT (gl_list_remove_last (list3) == removed1);
+              ASSERT (gl_list_size (list1) == n - (int) removed1);
+            }
+            break;
+          case 13: case 14: /* remove 1 element */
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -366,7 +384,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n - 1);
               }
             break;
-          case 13:
+          case 15:
             if (gl_list_size (list1) > 0)
               {
                 size_t n = gl_list_size (list1);
@@ -377,7 +395,7 @@ main (int argc, char *argv[])
                 ASSERT (gl_list_size (list1) == n);
               }
             break;
-          case 14:
+          case 16:
             {
               size_t n = gl_list_size (list1);
               gl_list_iterator_t iter1, iter2, iter3;
@@ -402,7 +420,7 @@ main (int argc, char *argv[])
               gl_list_iterator_free (&iter3);
             }
             break;
-          case 15:
+          case 17:
             {
               size_t end = RANDOM (gl_list_size (list1) + 1);
               size_t start = RANDOM (end + 1);