core/queue: Add queue_{save|load}_tracks() function

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2016-04-25 07:58:19 -04:00 committed by Anna Schumaker
parent 9ec2497ac5
commit 9a98a009e9
4 changed files with 62 additions and 15 deletions

View File

@ -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;

View File

@ -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");
}

View File

@ -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);

View File

@ -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),
);