+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.
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,
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. */
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
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,