/* Ordered set data type implemented by an array.
- Copyright (C) 2006-2007 Free Software Foundation, Inc.
+ Copyright (C) 2006-2007, 2009-2010 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2006.
This program is free software: you can redistribute it and/or modify
#include <stdlib.h>
-#include "xalloc.h"
-
/* Checked size_t computations. */
#include "xsize.h"
};
static gl_oset_t
-gl_array_create_empty (gl_oset_implementation_t implementation,
- gl_setelement_compar_fn compar_fn,
- gl_setelement_dispose_fn dispose_fn)
+gl_array_nx_create_empty (gl_oset_implementation_t implementation,
+ gl_setelement_compar_fn compar_fn,
+ gl_setelement_dispose_fn dispose_fn)
{
- struct gl_oset_impl *set = XMALLOC (struct gl_oset_impl);
+ struct gl_oset_impl *set =
+ (struct gl_oset_impl *) malloc (sizeof (struct gl_oset_impl));
+
+ if (set == NULL)
+ return NULL;
set->base.vtable = implementation;
set->base.compar_fn = compar_fn;
return false;
}
-/* Ensure that set->allocated > set->count. */
-static void
+/* Ensure that set->allocated > set->count.
+ Return 0 upon success, -1 upon out-of-memory. */
+static int
grow (gl_oset_t set)
{
size_t new_allocated;
memory_size = xtimes (new_allocated, sizeof (const void *));
if (size_overflow_p (memory_size))
/* Overflow, would lead to out of memory. */
- xalloc_die ();
- memory = (const void **) xrealloc (set->elements, memory_size);
+ return -1;
+ memory = (const void **) realloc (set->elements, memory_size);
if (memory == NULL)
/* Out of memory. */
- xalloc_die ();
+ return -1;
set->elements = memory;
set->allocated = new_allocated;
+ return 0;
}
/* Add the given element ELT at the given position,
- 0 <= position <= gl_oset_size (set). */
-static inline void
-gl_array_add_at (gl_oset_t set, size_t position, const void *elt)
+ 0 <= position <= gl_oset_size (set).
+ Return 1 upon success, -1 upon out-of-memory. */
+static inline int
+gl_array_nx_add_at (gl_oset_t set, size_t position, const void *elt)
{
size_t count = set->count;
const void **elements;
size_t i;
if (count == set->allocated)
- grow (set);
+ if (grow (set) < 0)
+ return -1;
elements = set->elements;
for (i = count; i > position; i--)
elements[i] = elements[i - 1];
elements[position] = elt;
set->count = count + 1;
+ return 1;
}
/* Remove the element at the given position,
set->count = count - 1;
}
-static bool
-gl_array_add (gl_oset_t set, const void *elt)
+static int
+gl_array_nx_add (gl_oset_t set, const void *elt)
{
size_t count = set->count;
size_t low = 0;
}
while (low < high);
}
- gl_array_add_at (set, low, elt);
- return true;
+ return gl_array_nx_add_at (set, low, elt);
}
static bool
const struct gl_oset_implementation gl_array_oset_implementation =
{
- gl_array_create_empty,
+ gl_array_nx_create_empty,
gl_array_size,
gl_array_search,
gl_array_search_atleast,
- gl_array_add,
+ gl_array_nx_add,
gl_array_remove,
gl_array_free,
gl_array_iterator,