core/containers/queue: Add _q_add_sorted() function

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-12-01 09:36:05 -05:00
parent b36869ff93
commit f44710f7ae
3 changed files with 40 additions and 5 deletions

View File

@ -4,6 +4,20 @@
#include <core/containers/queue.h>
guint _q_add_sorted(struct _queue *queue, gpointer data,
GCompareDataFunc func, gpointer user_data)
{
struct _q_iter it;
_q_for_each(queue, &it) {
if (func(_q_iter_val(&it), data, user_data) > 0) {
g_queue_insert_before(&queue->_queue, it.it_iter, data);
return it.it_pos;
}
}
return _q_add_tail(queue, data);
}
gpointer _q_remove_it(struct _queue *queue, struct _q_iter *it)
{
gpointer ret = _q_iter_val(it);

View File

@ -86,6 +86,9 @@ static inline guint _q_add_tail(struct _queue *queue, gpointer data)
return _q_size(queue) - 1;
}
/* Called to add an item to a sorted queue. */
guint _q_add_sorted(struct _queue *, gpointer, GCompareDataFunc, gpointer);
/* Called to remove an item by iterator. */
gpointer _q_remove_it(struct _queue *, struct _q_iter *);

View File

@ -107,18 +107,36 @@ void test_sort()
unsigned int i, N = 10;
struct _q_iter it;
for (i = 0; i < N; i++)
_q_add_head(&queue, GINT_TO_POINTER(i));
/* _q_sort() */
_q_sort(&queue, test_sort_int, GINT_TO_POINTER(42));
/* _q_add_sorted() (10 .. 19) */
for (i = 0; i < N; i++) {
test_loop_equal(_q_add_sorted(&queue, GINT_TO_POINTER(i + 10),
test_sort_int,
GINT_TO_POINTER(42)), i, i);
} test_loop_passed();
test_equal(_q_size(&queue), N);
test_equal(data_val, 42);
/* _q_add_sorted() (0 .. 9) */
for (i = 0; i < N; i++) {
test_loop_equal(_q_add_sorted(&queue, GINT_TO_POINTER(i),
test_sort_int,
GINT_TO_POINTER(43)), i, i);
} test_loop_passed();
test_equal(_q_size(&queue), 2 * N);
test_equal(data_val, 43);
/* _q_sort(), after reversing the queue. */
g_queue_reverse(&queue._queue);
_q_sort(&queue, test_sort_int, GINT_TO_POINTER(44));
i = 0;
_q_for_each(&queue, &it) {
test_loop_equal(test_q_iter_val(&it), i, i);
i++;
} test_loop_passed();
test_equal(data_val, 44);
g_queue_clear(&queue._queue);
}
DECLARE_UNIT_TESTS(