From cbcd9c594d4abd3dd54ac1b6f1aed4e8305d281b Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Tue, 18 Nov 2014 08:22:13 -0500 Subject: [PATCH] GenericTag: Add a function for comparing tag names I was only ever comparing the lowercase version of the name, so this should be done in a single place (the GenericTag) to make maintenance easier. Signed-off-by: Anna Schumaker --- core/tags.cpp | 6 +++--- core/tags/generic.cpp | 9 +++++++++ include/core/tags/generic.h | 10 ++++++++++ tests/core/tags/generic.cpp | 14 ++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/core/tags.cpp b/core/tags.cpp index 15c3b4e7..9843bc78 100644 --- a/core/tags.cpp +++ b/core/tags.cpp @@ -179,13 +179,13 @@ int Track :: less_than(Track *rhs, sort_t field) int ret; switch (field) { case SORT_ARTIST: - return compare_string(artist->lowercase(), rhs->artist->lowercase()); + return artist->compare(rhs->artist); case SORT_ALBUM: - return compare_string(album->lowercase(), rhs->album->lowercase()); + return album->compare(rhs->album); case SORT_COUNT: return compare_uint(play_count, rhs->play_count); case SORT_GENRE: - return compare_string(genre->lowercase(), rhs->genre->lowercase()); + return genre->compare(rhs->genre); case SORT_LENGTH: return compare_uint(length, rhs->length); case SORT_PLAYED: diff --git a/core/tags/generic.cpp b/core/tags/generic.cpp index 30cbfe08..5e76f145 100644 --- a/core/tags/generic.cpp +++ b/core/tags/generic.cpp @@ -37,3 +37,12 @@ const std::string &GenericTag :: lowercase() { return _lower; } + +int GenericTag :: compare(const GenericTag *rhs) +{ + if (_lower.size() == 0) + return 1; + if (rhs->_lower.size() == 0) + return -1; + return _lower.compare(rhs->_lower); +} diff --git a/include/core/tags/generic.h b/include/core/tags/generic.h index 8a79a614..90eab757 100644 --- a/include/core/tags/generic.h +++ b/include/core/tags/generic.h @@ -69,6 +69,16 @@ public: * @return GenericTag::_lower. */ const std::string &lowercase(); + + /** + * Called to compare the names of two GenericTags + * + * @param rhs The other tag that we are comparing with. + * @return < 0: lhs < rhs, or rhs is empty. + * @return 0: lhs == rhs. + * @return > 0: rhs > lhs, or lhs is empty. + */ + int compare(const GenericTag *); }; #endif /* OCARINA_CORE_TAGS_GENERIC_H */ diff --git a/tests/core/tags/generic.cpp b/tests/core/tags/generic.cpp index 79a4c758..73877535 100644 --- a/tests/core/tags/generic.cpp +++ b/tests/core/tags/generic.cpp @@ -32,8 +32,22 @@ static void test_generic_tag() test_equal(tag.primary_key(), (std::string)"Generic Tag"); } +static void test_generic_tag_comparison() +{ + GenericTag A("A"), a("a"), B("B"), empty(""); + + test_equal(A.compare(&A), 0); + test_equal(a.compare(&a), 0); + test_equal(A.compare(&B), -1); + test_equal(B.compare(&A), 1); + + test_equal(empty.compare(&A), 1); + test_equal(A.compare(&empty), -1); +} + int main(int argc, char **argv) { run_test("Generic Tag Test", test_generic_tag); + run_test("Generic Tag Compare Test", test_generic_tag_comparison); return 0; }