]> Savannah Git Hosting - gnulib.git/commitdiff
list: Remove redundant code for remove_first and remove_last operations.
authorBruno Haible <bruno@clisp.org>
Sat, 2 May 2020 19:14:29 +0000 (21:14 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 2 May 2020 21:22:13 +0000 (23:22 +0200)
* lib/gl_list.h (struct gl_list_implementation): Remove fields
remove_first, remove_last.
(gl_list_remove_first, gl_list_remove_last): Implement in a generic way.
* lib/gl_array_list.c: Revert last change.
* lib/gl_carray_list.c: Likewise.
* lib/gl_anylinked_list2.h: Likewise.
* lib/gl_linked_list.c: Likewise.
* lib/gl_linkedhash_list.c: Likewise.
* lib/gl_anytree_list2.h: Likewise.
* lib/gl_avltree_list.c: Likewise.
* lib/gl_avltreehash_list.c: Likewise.
* lib/gl_rbtree_list.c: Likewise.
* lib/gl_rbtreehash_list.c: Likewise.
* lib/gl_sublist.c: Likewise.

13 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_rbtree_list.c
lib/gl_rbtreehash_list.c
lib/gl_sublist.c

index 6c0f620785e14f6aa8fa67907d0e5c5053308845..ac235441d4880ea69ca6d9b41db5178e445439a2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2020-05-02  Bruno Haible  <bruno@clisp.org>
+
+       list: Remove redundant code for remove_first and remove_last operations.
+       * lib/gl_list.h (struct gl_list_implementation): Remove fields
+       remove_first, remove_last.
+       (gl_list_remove_first, gl_list_remove_last): Implement in a generic way.
+       * lib/gl_array_list.c: Revert last change.
+       * lib/gl_carray_list.c: Likewise.
+       * lib/gl_anylinked_list2.h: Likewise.
+       * lib/gl_linked_list.c: Likewise.
+       * lib/gl_linkedhash_list.c: Likewise.
+       * lib/gl_anytree_list2.h: Likewise.
+       * lib/gl_avltree_list.c: Likewise.
+       * lib/gl_avltreehash_list.c: Likewise.
+       * lib/gl_rbtree_list.c: Likewise.
+       * lib/gl_rbtreehash_list.c: Likewise.
+       * lib/gl_sublist.c: Likewise.
+
 2020-05-02  Bruno Haible  <bruno@clisp.org>
 
        bison-i18n: Add support for cross-compilation.
index 0032dc88267be721de85b6e1f872c19675ced992..114106c7dc5aaf283f2b976b77e1742813157e1f 100644 (file)
@@ -881,68 +881,6 @@ 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 41e41dd81bc85802072352ce613b36b32b66d506..c5a67dbd0c5fad182664dfc113a37e9c34902494 100644 (file)
@@ -485,34 +485,6 @@ 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 e00255c72461c96f5fb3e4d17326b1c3b7747fcf..49509620f7353547c1abe7d5c8f1bda2f55c07f7 100644 (file)
@@ -405,41 +405,6 @@ 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)
 {
@@ -697,8 +662,6 @@ 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 2906f5a8ca7552793e5dfd18bf6770a04e0db6a9..35ffec6f3c3b5b96365bf2283ca1aadb01297468 100644 (file)
@@ -89,8 +89,6 @@ 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 576f5336a4822adedd8f23cd55c845cb30a28666..9f795ff86483c8ffba022d2a4c3b7e0c634d5f6f 100644 (file)
@@ -111,8 +111,6 @@ 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 fa17d48e6bd9c83b9300867ba6b2c4259f3b274a..36a8773c354ade01d06e9a130efb9b9012440d05 100644 (file)
@@ -544,44 +544,6 @@ 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)
 {
@@ -893,8 +855,6 @@ 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 e2bf526d1a58a4288d58d5f00956225b8c74aea6..b1391cef9ab6625e41ec778629b75defe352085b 100644 (file)
@@ -49,8 +49,6 @@ 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 5ffc0cef2f012b98837817c4349355ae4f1d19be..7c7f999f876249704d39818cf2c82f97765b2b88 100644 (file)
@@ -97,8 +97,6 @@ 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 ea5018d34ecb727daadd7f202419cfe3a3450dbe..8094006dd35782566851b41678b9573bee74a615 100644 (file)
@@ -518,8 +518,6 @@ 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.  */
@@ -762,15 +760,21 @@ gl_list_remove_at (gl_list_t list, size_t 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);
+  size_t size = gl_list_size (list);
+  if (size > 0)
+    return gl_list_remove_at (list, 0);
+  else
+    return false;
 }
 
 GL_LIST_INLINE bool
 gl_list_remove_last (gl_list_t list)
 {
-  return ((const struct gl_list_impl_base *) list)->vtable
-         ->remove_last (list);
+  size_t size = gl_list_size (list);
+  if (size > 0)
+    return gl_list_remove_at (list, size - 1);
+  else
+    return false;
 }
 
 GL_LIST_INLINE bool
index 6ae78c7fd8f8b122cba210221fb6ef58db586bde..d79becf4aa4a1a70bf50a7641db892a14ebeb405 100644 (file)
@@ -87,8 +87,6 @@ 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 b59b5f48770c268b68d4a26dcf18fcab27827419..be2ee6f4e92cb53b9209a1e2182725a8434dc029 100644 (file)
@@ -112,8 +112,6 @@ 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 6e95c3b3efb90c78395d33c4ef622bf6acac57f2..e529a6b897b203abcf77b0a1a63e71409962fde1 100644 (file)
@@ -258,22 +258,6 @@ 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)
 {
@@ -440,8 +424,6 @@ 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,