core/queue: Add a function to resort the queue

This can be combined with the Q_ADD_FRONT flag for efficient bulk
insertions.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-12-03 10:03:52 -05:00
parent 0b84b6180c
commit 9701da5392
4 changed files with 28 additions and 6 deletions

View File

@ -153,6 +153,7 @@ void collection :: init(struct queue_ops *ops)
if (TRACK(track)->tr_library->li_enabled) if (TRACK(track)->tr_library->li_enabled)
queue_add(&library_q, TRACK(track)); queue_add(&library_q, TRACK(track));
} }
queue_unset_flag(&library_q, Q_ADD_FRONT);
library_q.load(); library_q.load();
if (!library_q.q_sort) { if (!library_q.q_sort) {
@ -161,7 +162,6 @@ void collection :: init(struct queue_ops *ops)
queue_sort(&library_q, COMPARE_TRACK, false); queue_sort(&library_q, COMPARE_TRACK, false);
} }
queue_unset_flag(&library_q, Q_ADD_FRONT);
queue_set_flag(&library_q, Q_SAVE_SORT); queue_set_flag(&library_q, Q_SAVE_SORT);
queue_set_flag(&library_q, Q_SAVE_FLAGS); queue_set_flag(&library_q, Q_SAVE_FLAGS);
} }
@ -222,6 +222,7 @@ void collection :: set_enabled(struct library *library, bool enabled)
return; return;
library_set_enabled(library, enabled); library_set_enabled(library, enabled);
queue_set_flag(&library_q, Q_ADD_FRONT);
db_for_each(dbe, next, track_db_get()) { db_for_each(dbe, next, track_db_get()) {
track = TRACK(dbe); track = TRACK(dbe);
@ -232,6 +233,9 @@ void collection :: set_enabled(struct library *library, bool enabled)
queue_remove_all(&library_q, track); queue_remove_all(&library_q, track);
} }
} }
queue_unset_flag(&library_q, Q_ADD_FRONT);
queue_resort(&library_q);
} }
queue *collection :: get_queue() queue *collection :: get_queue()

View File

@ -19,8 +19,13 @@ public:
struct set_iter it; struct set_iter it;
clear(); clear();
queue_set_flag(this, Q_ADD_FRONT);
set_for_each(&ent->ie_set, &it) set_for_each(&ent->ie_set, &it)
queue_add(this, track_get(it.it_val)); queue_add(this, track_get(it.it_val));
queue_unset_flag(this, Q_ADD_FRONT);
queue_resort(this);
} }
unsigned int find_average_count() unsigned int find_average_count()
@ -57,8 +62,13 @@ public:
avg = find_average_count(); avg = find_average_count();
clear(); clear();
queue_set_flag(this, Q_ADD_FRONT);
db_for_each(track, next, track_db_get()) db_for_each(track, next, track_db_get())
dynamic_add(name, TRACK(track), avg); dynamic_add(name, TRACK(track), avg);
queue_unset_flag(this, Q_ADD_FRONT);
queue_resort(this);
} }
}; };

View File

@ -174,6 +174,14 @@ struct track *queue_next(struct queue *queue)
return __queue_selected(queue); return __queue_selected(queue);
} }
void queue_resort(struct queue *queue)
{
_q_sort(&queue->q_tracks, track_less_than, queue->q_sort);
for (unsigned int i = 0; i < queue_size(queue); i++)
__queue_updated(queue, i);
}
void queue_sort(struct queue *queue, enum compare_t sort, bool reset) void queue_sort(struct queue *queue, enum compare_t sort, bool reset)
{ {
GSList *cur = NULL; GSList *cur = NULL;
@ -199,9 +207,6 @@ void queue_sort(struct queue *queue, enum compare_t sort, bool reset)
queue->q_sort = g_slist_append(queue->q_sort, GINT_TO_POINTER(sort)); queue->q_sort = g_slist_append(queue->q_sort, GINT_TO_POINTER(sort));
out_sort: out_sort:
_q_sort(&queue->q_tracks, track_less_than, queue->q_sort); queue_resort(queue);
for (unsigned int i = 0; i < queue_size(queue); i++)
__queue_updated(queue, i);
__queue_save(queue, Q_SAVE_SORT); __queue_save(queue, Q_SAVE_SORT);
} }

View File

@ -100,7 +100,10 @@ void queue_selected(struct queue *, unsigned int);
/* Called to pick the next track from the queue. */ /* Called to pick the next track from the queue. */
struct track *queue_next(struct queue *); struct track *queue_next(struct queue *);
/* Called to sort the queue. */ /* Called to sort the queue without changing sort order. */
void queue_resort(struct queue *);
/* Called to change the sort order and resort the queue. */
void queue_sort(struct queue *, enum compare_t, bool); void queue_sort(struct queue *, enum compare_t, bool);
#endif /* OCARINA_CORE_QUEUE_H */ #endif /* OCARINA_CORE_QUEUE_H */