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 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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue