From 362acf163b04480defb157237ace1e69fc77be04 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 28 Jan 2014 09:42:38 -0500 Subject: [PATCH] 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 --- include/playqueue.h | 2 +- lib/playqueue.cpp | 52 +++++++++++++++++---------------------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/include/playqueue.h b/include/playqueue.h index 779a238a..7234cffe 100644 --- a/include/playqueue.h +++ b/include/playqueue.h @@ -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: diff --git a/lib/playqueue.cpp b/lib/playqueue.cpp index c2d1555f..6a5b895e 100644 --- a/lib/playqueue.cpp +++ b/lib/playqueue.cpp @@ -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); }