playqueue: More sorting improvements

- Reimplement binary search for neater code
- Flip sort order when resetting sort if the first field is the one we
  are sorting by.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
This commit is contained in:
Anna Schumaker 2014-01-28 09:42:38 -05:00 committed by Anna Schumaker
parent 77e7101f85
commit 362acf163b
2 changed files with 21 additions and 33 deletions

View File

@ -42,7 +42,7 @@ private:
unsigned int cur; unsigned int cur;
unsigned int length; unsigned int length;
unsigned int add_sorted(unsigned int, library :: Song &); unsigned int find_sorted_id(library :: Song &);
void _add_sort(sort_t); void _add_sort(sort_t);
public: public:

View File

@ -178,43 +178,31 @@ static bool track_less_than(library :: Song &lhs, library :: Song &rhs,
return res; return res;
} }
unsigned int Playqueue :: add_sorted(unsigned int track_id, library :: Song &rhs) unsigned int Playqueue :: find_sorted_id(library :: Song &rhs)
{ {
library :: Song lhs; library :: Song lhs;
unsigned int cur, start = 0, end = (tracks.size() - 1); unsigned int begin = 0, end = (tracks.size() - 1), mid;
if (tracks.size() == 0) { if (tracks.size() == 0)
tracks.push_back(track_id);
return 0; return 0;
} else if (tracks.size() == 1) {
library :: lookup(tracks[0], &lhs);
if (track_less_than(lhs, rhs, sort_order)) {
tracks.push_back(track_id);
return 1;
}
tracks.insert(tracks.begin(), track_id);
return 0;
}
while (end - start > 1) { while (end > begin) {
cur = start + ((end - start) / 2); mid = begin + ((end - begin) / 2);
library :: lookup(tracks[cur], &lhs); library :: lookup(tracks[mid], &lhs);
if (track_less_than(lhs, rhs, sort_order)) if (track_less_than(lhs, rhs, sort_order))
start = cur; begin = mid + 1;
else else {
end = cur; if (mid == begin)
} return begin;
else
if (end != start) { end = mid - 1;
for (cur = start; cur <= end; cur++) {
library :: lookup(tracks[cur], &lhs);
if (!track_less_than(lhs, rhs, sort_order))
break;
} }
} }
tracks.insert(tracks.begin() + cur, track_id); library :: lookup(tracks[begin], &lhs);
return cur; if (track_less_than(lhs, rhs, sort_order))
return begin + 1;
return begin;
} }
unsigned int Playqueue :: add(unsigned int track_id) unsigned int Playqueue :: add(unsigned int track_id)
@ -224,10 +212,9 @@ unsigned int Playqueue :: add(unsigned int track_id)
library :: lookup(track_id, &song); library :: lookup(track_id, &song);
if (sort_order.size() > 0) if (sort_order.size() > 0)
add_sorted(track_id, song); id = find_sorted_id(song);
else
tracks.push_back(track_id);
tracks.insert(tracks.begin() + id, track_id);
length += song.track->length; length += song.track->length;
get_callbacks()->on_queue_track_add(this, id); get_callbacks()->on_queue_track_add(this, id);
if (!(flags & PQ_DISABLE_CHANGED_SIZE)) if (!(flags & PQ_DISABLE_CHANGED_SIZE))
@ -330,7 +317,8 @@ void Playqueue :: reset_sort(sort_t field)
{ {
if (flags & PQ_NEVER_SORT) if (flags & PQ_NEVER_SORT)
return; return;
sort_order.clear(); if (sort_order.front().field != field)
sort_order.clear();
add_sort(field); add_sort(field);
} }