From 1671e097a24cd169f1ad4ea89b0cb3ae105b1e70 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 17 Jan 2023 17:21:55 +0100 Subject: [PATCH] Add basic Collator::find() method. --- src/lib/collator.cc | 21 +++++++++++++++++++++ src/lib/collator.h | 1 + test/collator_test.cc | 11 +++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/lib/collator.cc b/src/lib/collator.cc index 7bab36fa6..ba504fb6e 100644 --- a/src/lib/collator.cc +++ b/src/lib/collator.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -79,3 +80,23 @@ Collator::compare (string const& utf8_a, string const& utf8_b) const } } + +bool +Collator::find(string pattern, string text) const +{ + if (_collator) { + auto utf16_pattern = utf8_to_utf16(pattern); + auto utf16_text = utf8_to_utf16(text); + UErrorCode status = U_ZERO_ERROR; + auto search = usearch_openFromCollator(utf16_pattern.data(), -1, utf16_text.data(), -1, _collator, nullptr, &status); + DCPOMATIC_ASSERT(search); + auto const index = usearch_first(search, &status); + usearch_close(search); + return index != -1; + } else { + transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower); + transform(text.begin(), text.end(), text.begin(), ::tolower); + return pattern.find(text) != string::npos; + } +} + diff --git a/src/lib/collator.h b/src/lib/collator.h index d42278124..1768c43c0 100644 --- a/src/lib/collator.h +++ b/src/lib/collator.h @@ -39,6 +39,7 @@ public: Collator& operator=(Collator const&) = delete; int compare(std::string const& utf8_a, std::string const& utf8_b) const; + bool find(std::string pattern, std::string text) const; private: UCollator* _collator = nullptr; diff --git a/test/collator_test.cc b/test/collator_test.cc index fadc5f063..e88d71b06 100644 --- a/test/collator_test.cc +++ b/test/collator_test.cc @@ -30,3 +30,14 @@ BOOST_AUTO_TEST_CASE(collator_compare_works_and_ignores_case) BOOST_CHECK_EQUAL(collator.compare("So often YOU won't even notice", "SO OFTEN you won't even NOTiCE"), 0); BOOST_CHECK_EQUAL(collator.compare("So often YOU won't even notice", "SO OFTEN you won't even see"), -1); } + + + +BOOST_AUTO_TEST_CASE(collator_search_works_and_ignores_case) +{ + Collator collator; + + BOOST_CHECK(collator.find("outh", "With filthy mouths, and bad attitudes")); + BOOST_CHECK(collator.find("with", "With filthy mouths, and bad attitudes")); + BOOST_CHECK(!collator.find("ostrabagalous", "With filthy mouths, and bad attitudes")); +} -- 2.30.2