@@ -138,12 +138,7 @@ namespace crow
138
138
// / Usually invoked to check if the other point is still online.
139
139
void send_ping (std::string msg) override
140
140
{
141
- dispatch ([this , msg = std::move (msg)]() mutable {
142
- auto header = build_header (0x9 , msg.size ());
143
- write_buffers_.emplace_back (std::move (header));
144
- write_buffers_.emplace_back (std::move (msg));
145
- do_write ();
146
- });
141
+ send_data (0x9 , std::move (msg));
147
142
}
148
143
149
144
// / Send a "Pong" message.
@@ -152,34 +147,19 @@ namespace crow
152
147
// / Usually automatically invoked as a response to a "Ping" message.
153
148
void send_pong (std::string msg) override
154
149
{
155
- dispatch ([this , msg = std::move (msg)]() mutable {
156
- auto header = build_header (0xA , msg.size ());
157
- write_buffers_.emplace_back (std::move (header));
158
- write_buffers_.emplace_back (std::move (msg));
159
- do_write ();
160
- });
150
+ send_data (0xA , std::move (msg));
161
151
}
162
152
163
153
// / Send a binary encoded message.
164
154
void send_binary (std::string msg) override
165
155
{
166
- dispatch ([this , msg = std::move (msg)]() mutable {
167
- auto header = build_header (2 , msg.size ());
168
- write_buffers_.emplace_back (std::move (header));
169
- write_buffers_.emplace_back (std::move (msg));
170
- do_write ();
171
- });
156
+ send_data (0x2 , std::move (msg));
172
157
}
173
158
174
159
// / Send a plaintext message.
175
160
void send_text (std::string msg) override
176
161
{
177
- dispatch ([this , msg = std::move (msg)]() mutable {
178
- auto header = build_header (1 , msg.size ());
179
- write_buffers_.emplace_back (std::move (header));
180
- write_buffers_.emplace_back (std::move (msg));
181
- do_write ();
182
- });
162
+ send_data (0x1 , std::move (msg));
183
163
}
184
164
185
165
// / Send a close signal.
@@ -657,6 +637,42 @@ namespace crow
657
637
delete this ;
658
638
}
659
639
640
+
641
+ struct SendMessageType
642
+ {
643
+ std::string payload;
644
+ Connection* self;
645
+ int opcode;
646
+
647
+ void operator ()()
648
+ {
649
+ self->send_data_impl (this );
650
+ }
651
+ };
652
+
653
+ static_assert (
654
+ std::is_nothrow_move_assignable<SendMessageType>::value &&
655
+ std::is_nothrow_move_constructible<SendMessageType>::value,
656
+ " SendMessageType must be nothrow movable!" );
657
+
658
+ void send_data_impl (SendMessageType* s)
659
+ {
660
+ auto header = build_header (s->opcode , s->payload .size ());
661
+ write_buffers_.emplace_back (std::move (header));
662
+ write_buffers_.emplace_back (std::move (s->payload ));
663
+ do_write ();
664
+ }
665
+
666
+ void send_data (int opcode, std::string&& msg)
667
+ {
668
+ SendMessageType event_arg{
669
+ std::move (msg),
670
+ this ,
671
+ opcode};
672
+
673
+ post (std::move (event_arg));
674
+ }
675
+
660
676
private:
661
677
Adaptor adaptor_;
662
678
Handler* handler_;
0 commit comments