+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.
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)
{
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)
{
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)
{
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,
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,
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,
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)
{
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,
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,
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,
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)
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);
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. */
->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)
{
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)
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,
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,
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)
{
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,
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
ASSERT (gl_list_size (list1) == n);
}
break;
- case 14:
+ case 16:
{
size_t n = gl_list_size (list1);
gl_list_iterator_t iter1, iter2;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);
for (repeat = 0; repeat < 10000; repeat++)
{
- unsigned int operation = RANDOM (16);
+ unsigned int operation = RANDOM (18);
switch (operation)
{
case 0:
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);
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);
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;
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);