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 length;
unsigned int add_sorted(unsigned int, library :: Song &);
unsigned int find_sorted_id(library :: Song &);
void _add_sort(sort_t);
public:

View File

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