From b7b592098f1cf10b4811bdee5d95e2c88f7a4d58 Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Mon, 5 Jan 2026 21:06:42 +0100 Subject: [PATCH] refactor(emojis): use `std::variant` and `QStringView` (#6714) --- CHANGELOG.md | 1 + benchmarks/src/Emojis.cpp | 18 ++++----- .../commands/builtin/twitch/SendWhisper.cpp | 6 ++- src/messages/MessageBuilder.cpp | 38 +++++++++---------- src/messages/MessageElement.cpp | 8 ++-- src/providers/emoji/Emojis.cpp | 11 +++--- src/providers/emoji/Emojis.hpp | 10 ++--- tests/src/Emojis.cpp | 12 +++--- 8 files changed, 52 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9554b9b..add85f89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -82,6 +82,7 @@ - Dev: Enable C++ 23. (#6693) - Dev: Prefer `std::expected` over `nonstd::expected_lite`. (#6693) - Dev: Moved Twitch PubSub to liveupdates. (#6638) +- Dev: Refactored types used for emoji parsing. (#6714) ## 2.5.4 diff --git a/benchmarks/src/Emojis.cpp b/benchmarks/src/Emojis.cpp index aa64efc6..195beabb 100644 --- a/benchmarks/src/Emojis.cpp +++ b/benchmarks/src/Emojis.cpp @@ -64,7 +64,7 @@ static void BM_EmojiParsing(benchmark::State &state) struct TestCase { QString input; - std::vector> expectedOutput; + std::vector> expectedOutput; }; const auto &emojiMap = emojis.getEmojis(); @@ -89,9 +89,9 @@ static void BM_EmojiParsing(benchmark::State &state) "foo 🐧 bar", // expected output { - "foo ", + u"foo ", penguinEmoji, - " bar", + u" bar", }, }, { @@ -99,7 +99,7 @@ static void BM_EmojiParsing(benchmark::State &state) "foo bar", // expected output { - "foo bar", + u"foo bar", }, }, { @@ -107,9 +107,9 @@ static void BM_EmojiParsing(benchmark::State &state) "foo 🐧 bar 🐧🐧🐧🐧🐧", // expected output { - "foo ", + u"foo ", penguinEmoji, - " bar ", + u" bar ", penguinEmoji, penguinEmoji, penguinEmoji, @@ -133,9 +133,9 @@ static void BM_EmojiParsing(benchmark::State &state) qDebug() << "BAD BENCH"; for (const auto &v : output) { - if (v.type() == typeid(QString)) + if (std::holds_alternative(v)) { - qDebug() << "output:" << boost::get(v); + qDebug() << "output:" << std::get(v); } } } @@ -158,7 +158,7 @@ static void BM_EmojiParsing2(benchmark::State &state, const QString &input, int actualNumEmojis = 0; for (const auto &part : output) { - if (part.type() == typeid(EmotePtr)) + if (std::holds_alternative(part)) { ++actualNumEmojis; } diff --git a/src/controllers/commands/builtin/twitch/SendWhisper.cpp b/src/controllers/commands/builtin/twitch/SendWhisper.cpp index 5414ebe2..0c43fbd8 100644 --- a/src/controllers/commands/builtin/twitch/SendWhisper.cpp +++ b/src/controllers/commands/builtin/twitch/SendWhisper.cpp @@ -143,9 +143,11 @@ bool appendWhisperMessageWordsLocally(const QStringList &words) b.emplace(emote, MessageElementFlag::EmojiAll); } - void operator()(const QString &string, + void operator()(QStringView stringView, MessageBuilder &b) const { + QString string = + stringView.toString(); // FIXME: use string view auto link = linkparser::parse(string); if (link) { @@ -158,7 +160,7 @@ bool appendWhisperMessageWordsLocally(const QStringList &words) } } } visitor; - boost::apply_visitor( + std::visit( [&b](auto &&arg) { visitor(arg, b); }, diff --git a/src/messages/MessageBuilder.cpp b/src/messages/MessageBuilder.cpp index 76c5830b..da11e52a 100644 --- a/src/messages/MessageBuilder.cpp +++ b/src/messages/MessageBuilder.cpp @@ -2363,16 +2363,15 @@ void MessageBuilder::addWords( for (auto variant : getApp()->getEmotes()->getEmojis()->parse(preText)) { - boost::apply_visitor(variant::Overloaded{ - [&](const EmotePtr &emote) { - this->addEmoji(emote); - }, - [&](QString text) { - this->addTextOrEmote( - state, std::move(text)); - }, - }, - variant); + std::visit(variant::Overloaded{ + [&](const EmotePtr &emote) { + this->addEmoji(emote); + }, + [&](QStringView text) { + this->addTextOrEmote(state, text.toString()); + }, + }, + variant); } cursor += preText.size(); @@ -2388,16 +2387,15 @@ void MessageBuilder::addWords( // split words for (auto variant : getApp()->getEmotes()->getEmojis()->parse(word)) { - boost::apply_visitor(variant::Overloaded{ - [&](const EmotePtr &emote) { - this->addEmoji(emote); - }, - [&](QString text) { - this->addTextOrEmote(state, - std::move(text)); - }, - }, - variant); + std::visit(variant::Overloaded{ + [&](const EmotePtr &emote) { + this->addEmoji(emote); + }, + [&](QStringView text) { + this->addTextOrEmote(state, text.toString()); + }, + }, + variant); } cursor += word.size() + 1; diff --git a/src/messages/MessageElement.cpp b/src/messages/MessageElement.cpp index c5084df9..647264a1 100644 --- a/src/messages/MessageElement.cpp +++ b/src/messages/MessageElement.cpp @@ -929,9 +929,9 @@ void SingleLineTextElement::addToContainer(MessageLayoutContainer &container, for (const auto &parsedWord : app->getEmotes()->getEmojis()->parse(word)) { - if (parsedWord.type() == typeid(QString)) + if (std::holds_alternative(parsedWord)) { - currentText += boost::get(parsedWord); + currentText += std::get(parsedWord); QString prev = currentText; // only increments the ref-count currentText = @@ -943,9 +943,9 @@ void SingleLineTextElement::addToContainer(MessageLayoutContainer &container, break; } } - else if (parsedWord.type() == typeid(EmotePtr)) + else if (std::holds_alternative(parsedWord)) { - auto emote = boost::get(parsedWord); + auto emote = std::get(parsedWord); auto image = emote->images.getImageOrLoaded(container.getScale()); if (!image->isEmpty()) diff --git a/src/providers/emoji/Emojis.cpp b/src/providers/emoji/Emojis.cpp index 3d49d892..163fb7d7 100644 --- a/src/providers/emoji/Emojis.cpp +++ b/src/providers/emoji/Emojis.cpp @@ -312,10 +312,10 @@ void Emojis::loadEmojiSet() }); } -std::vector> Emojis::parse( - const QString &text) const +std::vector> Emojis::parse( + QStringView text) const { - auto result = std::vector>(); + auto result = std::vector>(); QString::size_type lastParsedEmojiEndIndex = 0; for (qsizetype i = 0; i < text.length(); ++i) @@ -351,7 +351,7 @@ std::vector> Emojis::parse( { // look in emoji->value bool match = QStringView{emoji->value}.mid(1) == - QStringView{text}.mid(i + 1, emojiExtraCharacters); + text.mid(i + 1, emojiExtraCharacters); if (match) { @@ -367,8 +367,7 @@ std::vector> Emojis::parse( // This checking here relies on the fact that the nonQualified string // always starts with the same byte as value (the unified string) bool match = QStringView{emoji->nonQualified}.mid(1) == - QStringView{text}.mid( - i + 1, emojiNonQualifiedExtraCharacters); + text.mid(i + 1, emojiNonQualifiedExtraCharacters); if (match) { diff --git a/src/providers/emoji/Emojis.hpp b/src/providers/emoji/Emojis.hpp index e650804e..b2ad048f 100644 --- a/src/providers/emoji/Emojis.hpp +++ b/src/providers/emoji/Emojis.hpp @@ -3,12 +3,12 @@ #include "common/FlagsEnum.hpp" #include "providers/emoji/EmojiStyle.hpp" -#include #include #include #include #include +#include #include namespace chatterino { @@ -50,8 +50,8 @@ class IEmojis public: virtual ~IEmojis() = default; - virtual std::vector> parse( - const QString &text) const = 0; + virtual std::vector> parse( + QStringView text) const = 0; virtual const std::vector &getEmojis() const = 0; virtual const std::vector &getShortCodes() const = 0; virtual QString replaceShortCodes(const QString &text) const = 0; @@ -61,8 +61,8 @@ class Emojis : public IEmojis { public: void load(); - std::vector> parse( - const QString &text) const override; + std::vector> parse( + QStringView text) const override; std::vector shortCodes; QString replaceShortCodes(const QString &text) const override; diff --git a/tests/src/Emojis.cpp b/tests/src/Emojis.cpp index 42df110a..1c8ace1e 100644 --- a/tests/src/Emojis.cpp +++ b/tests/src/Emojis.cpp @@ -65,7 +65,7 @@ TEST(Emojis, Parse) struct TestCase { QString input; - std::vector> expectedOutput; + std::vector> expectedOutput; }; auto getEmoji = [&](auto code) { @@ -96,23 +96,23 @@ TEST(Emojis, Parse) const std::vector tests{ { "abc", - {"abc"}, + {u"abc"}, }, { "abc def", - {"abc def"}, + {u"abc def"}, }, { "abc🐧def", - {"abc", penguin, "def"}, + {u"abc", penguin, u"def"}, }, { "abc 🐧def", - {"abc ", penguin, "def"}, + {u"abc ", penguin, u"def"}, }, { " abc🐧 def ", - {" abc", penguin, " def "}, + {u" abc", penguin, u" def "}, }, { "🐧",