Skip to content
This repository was archived by the owner on Aug 16, 2024. It is now read-only.

Commit f968413

Browse files
authored
Merge pull request #27 from cyanray/dev/cyanray
MessageChain 性能提升;
2 parents 20bbe3c + 8b95f10 commit f968413

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

UnitTest/main.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ TEST(MessageChain_Test, Add_and_Get) {
2222
ASSERT_TRUE(m.Text() == "Hello");
2323
}
2424

25+
TEST(MessageChain_Test, Add_and_Get2) {
26+
using namespace Cyan;
27+
MessageChain mc;
28+
mc.Add<PlainMessage>("Hello");
29+
auto m = mc.GetFirst<PlainMessage>();
30+
ASSERT_TRUE(m.Text() == "Hello");
31+
}
32+
2533
TEST(MessageChain_Test, GetAll) {
2634
using namespace Cyan;
2735
MessageChain mc;
@@ -105,7 +113,7 @@ TEST(MessageChain_Test, AtMessage) {
105113
MessageChain mc;
106114
mc.Add(AtMessage(1234_qq));
107115
auto at = mc.GetFirst<AtMessage>();
108-
ASSERT_TRUE(at.Target().QQ == 1234);
116+
ASSERT_TRUE(at.Target().ToInt64() == 1234);
109117
}
110118

111119
TEST(MessageChain_Test, AtAllMessage) {

include/defs/message_chain.hpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ namespace Cyan
8181
return *this;
8282
}
8383

84+
template<class T,class... Args>
85+
MessageChain& Add(Args&&... args)
86+
{
87+
static_assert(std::is_base_of<IMessage, T>::value, "只能接受 IMessage 的派生类");
88+
std::shared_ptr<IMessage> m_ptr(new T(args...));
89+
messages_.push_back(m_ptr);
90+
return *this;
91+
}
92+
8493
template<class T>
8594
void Remove(const T& m)
8695
{
@@ -109,17 +118,17 @@ namespace Cyan
109118

110119
MessageChain& At(const QQ_t qq)
111120
{
112-
return this->Add(AtMessage(qq));
121+
return this->Add<AtMessage>(qq);
113122
}
114123

115124
MessageChain& AtAll()
116125
{
117-
return this->Add(AtAllMessage());
126+
return this->Add<AtAllMessage>();
118127
}
119128

120129
MessageChain& Face(int faceID)
121130
{
122-
return this->Add(FaceMessage(faceID));
131+
return this->Add<FaceMessage>(faceID);
123132
}
124133

125134
MessageChain& Face(const string& name)
@@ -131,45 +140,45 @@ namespace Cyan
131140

132141
MessageChain& Plain(const string& plainText)
133142
{
134-
return this->Add(PlainMessage(plainText));
143+
return this->Add<PlainMessage>(plainText);
135144
}
136145

137146
template<typename T>
138147
MessageChain& Plain(const T& val)
139148
{
140149
std::stringstream ss;
141150
ss << val;
142-
return this->Add(PlainMessage(ss.str()));
151+
return this->Add<PlainMessage>(ss.str());
143152
}
144153

145154
MessageChain& Image(const MiraiImage& Image)
146155
{
147-
return this->Add(ImageMessage(Image));
156+
return this->Add<ImageMessage>(Image);
148157
}
149158

150159
MessageChain& FlashImage(const MiraiImage& Image)
151160
{
152-
return this->Add(FlashImageMessage(Image));
161+
return this->Add<FlashImageMessage>(Image);
153162
}
154163

155164
MessageChain& Xml(const string& xml_str)
156165
{
157-
return this->Add(XmlMessage(xml_str));
166+
return this->Add<XmlMessage>(xml_str);
158167
}
159168

160169
MessageChain& Json(const string& json_str)
161170
{
162-
return this->Add(JsonMessage(json_str));
171+
return this->Add<JsonMessage>(json_str);
163172
}
164173

165174
MessageChain& App(const string& app_str)
166175
{
167-
return this->Add(AppMessage(app_str));
176+
return this->Add<AppMessage>(app_str);
168177
}
169178

170179
MessageChain& Poke(PokeType poke)
171180
{
172-
return this->Add(PokeMessage(poke));
181+
return this->Add<PokeMessage>(poke);
173182
}
174183

175184
string GetPlainText() const;

0 commit comments

Comments
 (0)