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:
parent
77e7101f85
commit
362acf163b
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue