core/tempq: Switch queue list to store a queue pointer

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-12-14 12:10:10 -05:00
parent 27eab88b9c
commit 17981f4393
1 changed files with 28 additions and 26 deletions

View File

@ -8,17 +8,17 @@ extern "C" {
#include <core/deck.h>
#include <core/file.h>
static std::list<struct queue> queue_deck;
static std::list<struct queue *> queue_deck;
static struct file deck_file;
static unsigned int __tempq_index(struct queue *queue)
{
unsigned int i = 0;
std::list<struct queue>::iterator it;
std::list<struct queue *>::iterator it;
for (it = queue_deck.begin(); it != queue_deck.end(); it++) {
if (&(*it) == queue)
if (*it == queue)
return i;
i++;
}
@ -47,20 +47,23 @@ void tempq_init(struct queue_ops *ops)
file_readf(&deck_file, "%u", &id);
queue_add(queue, track_get(id));
}
queue_deck.back().q_ops = ops;
queue_deck.back()->q_ops = ops;
}
file_close(&deck_file);
}
void tempq_deinit()
{
while (queue_deck.size() > 0)
while (queue_deck.size() > 0) {
queue_deinit(*queue_deck.begin());
delete *queue_deck.begin();
queue_deck.erase(queue_deck.begin());
}
}
void tempq_save(struct queue *queue, enum queue_flags flag)
{
std::list<struct queue>::iterator it;
std::list<struct queue *>::iterator it;
unsigned int i;
if (!file_open(&deck_file, OPEN_WRITE))
@ -68,10 +71,10 @@ void tempq_save(struct queue *queue, enum queue_flags flag)
file_writef(&deck_file, "%zu\n", queue_deck.size());
for (it = queue_deck.begin(); it != queue_deck.end(); it++) {
file_writef(&deck_file, "%u %zu", it->q_flags, queue_size(&(*it)));
for (i = 0; i < queue_size(&(*it)); i++) {
file_writef(&deck_file, "%u %zu", (*it)->q_flags, queue_size(*it));
for (i = 0; i < queue_size(*it); i++) {
file_writef(&deck_file, " %u",
queue_at(&(*it), i)->tr_dbe.dbe_index);
queue_at(*it, i)->tr_dbe.dbe_index);
}
file_writef(&deck_file, "\n");
}
@ -81,11 +84,9 @@ void tempq_save(struct queue *queue, enum queue_flags flag)
struct queue *tempq_alloc(struct queue_ops *ops, unsigned int flags)
{
struct queue *queue;
struct queue new_queue;
struct queue *queue = new struct queue;
queue_deck.push_back(new_queue);
queue = &queue_deck.back();
queue_deck.push_back(queue);
queue_init(queue, flags | Q_ENABLED | Q_SAVE_FLAGS | Q_SAVE_SORT, ops);
tempq_save(queue, Q_ENABLED);
return queue;
@ -93,13 +94,14 @@ struct queue *tempq_alloc(struct queue_ops *ops, unsigned int flags)
void tempq_free(struct queue *queue)
{
std::list<struct queue>::iterator it;
std::list<struct queue *>::iterator it;
for (it = queue_deck.begin(); it != queue_deck.end(); it++) {
if (&(*it) == queue) {
queue_deinit(&(*it));
if (*it == queue) {
queue_deck.erase(it);
tempq_save(NULL, Q_ENABLED);
tempq_save(queue, Q_ENABLED);
queue_deinit(queue);
delete queue;
return;
}
}
@ -108,13 +110,13 @@ void tempq_free(struct queue *queue)
struct queue *tempq_get(unsigned int index)
{
std::list<struct queue>::iterator it;
std::list<struct queue *>::iterator it;
unsigned int i;
it = queue_deck.begin();
for (i = 0; i < queue_deck.size(); i++) {
if (i == index)
return &(*it);
return *it;
it++;
}
return NULL;
@ -123,8 +125,8 @@ struct queue *tempq_get(unsigned int index)
void tempq_move(struct queue *queue, unsigned int index)
{
unsigned int old_pos = __tempq_index(queue);
std::list<struct queue>::iterator it_old = queue_deck.begin();
std::list<struct queue>::iterator it_new = queue_deck.begin();
std::list<struct queue *>::iterator it_old = queue_deck.begin();
std::list<struct queue *>::iterator it_new = queue_deck.begin();
for (unsigned int i = 0; i < queue_deck.size(); i++) {
if (i < old_pos)
@ -144,15 +146,15 @@ void tempq_move(struct queue *queue, unsigned int index)
struct track *tempq_next()
{
struct track *track = NULL;
std::list<struct queue>::iterator it;
std::list<struct queue *>::iterator it;
for (it = queue_deck.begin(); it != queue_deck.end(); it++) {
if (queue_has_flag(&(*it), Q_ENABLED) == false)
if (queue_has_flag(*it, Q_ENABLED) == false)
continue;
track = queue_next(&(*it));
if (queue_size(&(*it)) == 0)
tempq_free(&(*it));
track = queue_next(*it);
if (queue_size(*it) == 0)
tempq_free(*it);
break;
}