From 5e2fb0d52085e29dbaec29be08b0381cca8e2b09 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 18 May 2025 15:00:05 +0200 Subject: Core/Commands: Modernize string parsing for EXACT_SEQUENCE command arguments (cherry picked from commit de5f2ff7985f6572ee61e9a505008cc701feeb71) --- .../game/Chat/ChatCommands/ChatCommandTags.h | 37 +++++++++------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.h b/src/server/game/Chat/ChatCommands/ChatCommandTags.h index c84d85c671f..3e31108adec 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.h @@ -23,8 +23,6 @@ #include "ObjectGuid.h" #include "Optional.h" #include "Util.h" -#include -#include #include #include #include @@ -50,21 +48,21 @@ namespace Trinity::Impl::ChatCommands using type = typename T::value_type; }; - template - inline constexpr char GetChar(char const (&s)[N], size_t i) + template + struct string_literal { - static_assert(N <= 25, "The EXACT_SEQUENCE macro can only be used with up to 25 character long literals. Specify them char-by-char (null terminated) as parameters to ExactSequence<> instead."); - return i >= N ? '\0' : s[i]; - } - -#define CHATCOMMANDS_IMPL_SPLIT_LITERAL_EXTRACT_CHAR(z, i, strliteral) \ - BOOST_PP_COMMA_IF(i) Trinity::Impl::ChatCommands::GetChar(strliteral, i) + constexpr string_literal(char const (&str)[Size]) + { + std::ranges::copy_n(str, Size, value.begin()); + } -#define CHATCOMMANDS_IMPL_SPLIT_LITERAL_CONSTRAINED(maxlen, strliteral) \ - BOOST_PP_REPEAT(maxlen, CHATCOMMANDS_IMPL_SPLIT_LITERAL_EXTRACT_CHAR, strliteral) + constexpr operator std::string_view() const + { + return { value.data(), value.size() - 1 }; + } - // this creates always 25 elements - "abc" -> 'a', 'b', 'c', '\0', '\0', ... up to 25 -#define CHATCOMMANDS_IMPL_SPLIT_LITERAL(strliteral) CHATCOMMANDS_IMPL_SPLIT_LITERAL_CONSTRAINED(25, strliteral) + std::array value; + }; TC_GAME_API ChatCommandResult TryConsumExactSequencee(std::string_view sequence, ChatHandler const* handler, std::string_view args); } @@ -85,23 +83,18 @@ namespace Trinity::ChatCommands |* *| \****************************************************************************************/ - template + template struct ExactSequence : Trinity::Impl::ChatCommands::ContainerTag { using value_type = void; ChatCommandResult TryConsume(ChatHandler const* handler, std::string_view args) const { - return Trinity::Impl::ChatCommands::TryConsumExactSequencee(_string, handler, args); + return Trinity::Impl::ChatCommands::TryConsumExactSequencee(Sequence, handler, args); } - - private: - static constexpr std::array _storage = { chars... }; - static_assert(!_storage.empty() && (_storage.back() == '\0'), "ExactSequence parameters must be null terminated! Use the EXACT_SEQUENCE macro to make this easier!"); - static constexpr std::string_view _string = { _storage.data(), std::string_view::traits_type::length(_storage.data()) }; }; -#define EXACT_SEQUENCE(str) Trinity::ChatCommands::ExactSequence +#define EXACT_SEQUENCE(str) Trinity::ChatCommands::ExactSequence struct Tail : std::string_view, Trinity::Impl::ChatCommands::ContainerTag { -- cgit v1.2.3