aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-18 15:00:05 +0200
committerShauren <shauren.trinity@gmail.com>2025-05-18 15:00:05 +0200
commitde5f2ff7985f6572ee61e9a505008cc701feeb71 (patch)
tree9f658a4c3aa1e677e48081d49253f67dffdfd971 /src
parent031fddd2c736055d1f9f389c3a514e14b4562610 (diff)
Core/Commands: Modernize string parsing for EXACT_SEQUENCE command arguments
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandTags.h37
1 files 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 <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <fmt/ostream.h>
#include <string>
#include <string_view>
@@ -50,21 +48,21 @@ namespace Trinity::Impl::ChatCommands
using type = typename T::value_type;
};
- template <size_t N>
- inline constexpr char GetChar(char const (&s)[N], size_t i)
+ template <std::size_t Size>
+ 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<char, Size> 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 <char... chars>
+ template <Impl::ChatCommands::string_literal Sequence>
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<char, sizeof...(chars)> _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<CHATCOMMANDS_IMPL_SPLIT_LITERAL(str)>
+#define EXACT_SEQUENCE(str) Trinity::ChatCommands::ExactSequence<str>
struct Tail : std::string_view, Trinity::Impl::ChatCommands::ContainerTag
{