From 9a98a009e99005ebd1e25735f10492a0d00e9a6e Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Mon, 25 Apr 2016 07:58:19 -0400 Subject: [PATCH] core/queue: Add queue_{save|load}_tracks() function Signed-off-by: Anna Schumaker --- core/queue.c | 20 ++++++++++++++++++++ core/tempq.c | 20 +++++--------------- include/core/queue.h | 7 +++++++ tests/core/queue.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/core/queue.c b/core/queue.c index e91a9ecd..c54e728f 100644 --- a/core/queue.c +++ b/core/queue.c @@ -154,6 +154,26 @@ void queue_deinit(struct queue *queue) queue->q_sort = NULL; } +void queue_save_tracks(struct queue *queue, struct file *file) +{ + struct queue_iter it; + + file_writef(file, "%u", queue_size(queue)); + queue_for_each(queue, &it) + file_writef(file, " %u", queue_iter_val(&it)->tr_dbe.dbe_index); +} + +void queue_load_tracks(struct queue *queue, struct file *file) +{ + unsigned int i, n, t; + + file_readf(file, "%u ", &n); + for (i = 0; i < n; i++) { + file_readf(file, "%u", &t); + queue_add(queue, track_get(t)); + } +} + void queue_set_flag(struct queue *queue, enum queue_flags flag) { queue->q_flags |= flag; diff --git a/core/tempq.c b/core/tempq.c index 4820e1d1..d80f37df 100644 --- a/core/tempq.c +++ b/core/tempq.c @@ -32,28 +32,18 @@ static void __tempq_free(struct queue *queue) static void __tempq_read_queue() { - unsigned int flags, count, i, track; struct queue *queue; + unsigned int flags; - file_readf(&tempq_file, "%u %u", &flags, &count); + file_readf(&tempq_file, "%u", &flags); queue = __tempq_alloc(flags); - - for (i = 0; i < count; i++) { - file_readf(&tempq_file, "%u", &track); - queue_add(queue, track_get(track)); - } + queue_load_tracks(queue, &tempq_file); } static void __tempq_write_queue(struct queue *queue) { - struct queue_iter it; - struct track *track; - - file_writef(&tempq_file, "%u %u", queue->q_flags, queue_size(queue)); - queue_for_each(queue, &it) { - track = queue_iter_val(&it); - file_writef(&tempq_file, " %u", track->tr_dbe.dbe_index); - } + file_writef(&tempq_file, "%u ", queue->q_flags); + queue_save_tracks(queue, &tempq_file); file_writef(&tempq_file, "\n"); } diff --git a/include/core/queue.h b/include/core/queue.h index bfe4bad9..237ca9dd 100644 --- a/include/core/queue.h +++ b/include/core/queue.h @@ -118,6 +118,13 @@ void queue_init(struct queue *, unsigned int, const struct queue_ops *); void queue_deinit(struct queue *); +/* Called to save the list of queued tracks. */ +void queue_save_tracks(struct queue *, struct file *); + +/* Called to load queued tracks from file. */ +void queue_load_tracks(struct queue *, struct file *); + + /* Called to set a queue flag. */ void queue_set_flag(struct queue *, enum queue_flags); diff --git a/tests/core/queue.c b/tests/core/queue.c index 5ef290b6..770dae59 100644 --- a/tests/core/queue.c +++ b/tests/core/queue.c @@ -488,6 +488,35 @@ static void test_sorting() test_equal(q.q_length, 0); test_equal(queue_size(&q), 0); test_equal((void *)q.q_sort, NULL); +} + +static void test_save_load() +{ + struct file f = FILE_INIT("queue.q", 0, 0); + struct queue q, r; + unsigned int i; + + queue_init(&q, 0, &test_ops); + queue_init(&r, 0, &test_ops); + + for (i = 0; i < 13; i++) + queue_add(&q, track_get(i)); + + test_equal(file_exists(&f), (bool)false); + test_equal(file_open(&f, OPEN_WRITE), (bool)true); + queue_save_tracks(&q, &f); + file_close(&f); + test_equal(file_exists(&f), (bool)true); + + test_equal(file_open(&f, OPEN_READ), (bool)true); + queue_load_tracks(&r, &f); + file_close(&f); + + test_equal(queue_size(&r), 13); + for (i = 0; i < 13; i++) { + test_loop_equal(queue_has(&r, track_get(i)), (bool)true, i); + } test_loop_passed(); + __test_deinit_core(); } @@ -499,4 +528,5 @@ DECLARE_UNIT_TESTS( UNIT_TEST("Queue Stress (n = 100,000)", test_stress_100K), UNIT_TEST("Queue Random Next and Selection", test_rand_select), UNIT_TEST("Queue Sorting", test_sorting), + UNIT_TEST("Queue Save and Load", test_save_load), );