@@ -222,16 +222,12 @@ nano::transport::tcp_channel_queue::tcp_channel_queue ()
222
222
223
223
bool nano::transport::tcp_channel_queue::empty () const
224
224
{
225
- return std::all_of (queues.begin (), queues.end (), [] (auto const & queue) {
226
- return queue.second .empty ();
227
- });
225
+ return total_size == 0 ;
228
226
}
229
227
230
228
size_t nano::transport::tcp_channel_queue::size () const
231
229
{
232
- return std::accumulate (queues.begin (), queues.end (), size_t { 0 }, [] (size_t acc, auto const & queue) {
233
- return acc + queue.second .size ();
234
- });
230
+ return total_size;
235
231
}
236
232
237
233
size_t nano::transport::tcp_channel_queue::size (traffic_type type) const
@@ -252,7 +248,8 @@ bool nano::transport::tcp_channel_queue::full (traffic_type type) const
252
248
void nano::transport::tcp_channel_queue::push (traffic_type type, entry_t entry)
253
249
{
254
250
debug_assert (!full (type)); // Should be checked before calling this function
255
- queues.at (type).second .push_back (entry);
251
+ queues.at (type).second .push_back (std::move (entry));
252
+ ++total_size;
256
253
}
257
254
258
255
auto nano::transport::tcp_channel_queue::next () -> value_t
@@ -277,6 +274,22 @@ auto nano::transport::tcp_channel_queue::next () -> value_t
277
274
return false ;
278
275
};
279
276
277
+ auto seek_next = [&, this ] () {
278
+ counter = 0 ;
279
+ do
280
+ {
281
+ if (current != queues.end ())
282
+ {
283
+ ++current;
284
+ }
285
+ if (current == queues.end ())
286
+ {
287
+ current = queues.begin ();
288
+ }
289
+ release_assert (current != queues.end ());
290
+ } while (current->second .empty ());
291
+ };
292
+
280
293
if (should_seek ())
281
294
{
282
295
seek_next ();
@@ -288,16 +301,16 @@ auto nano::transport::tcp_channel_queue::next () -> value_t
288
301
auto & queue = current->second ;
289
302
290
303
++counter;
304
+ --total_size;
291
305
292
306
release_assert (!queue.empty ());
293
- auto entry = queue.front ();
307
+ auto entry = std::move ( queue.front () );
294
308
queue.pop_front ();
295
- return { source, entry };
309
+ return { source, std::move ( entry) };
296
310
}
297
311
298
312
auto nano::transport::tcp_channel_queue::next_batch (size_t max_count) -> batch_t
299
313
{
300
- // TODO: Naive implementation, could be optimized
301
314
std::deque<value_t > result;
302
315
while (!empty () && result.size () < max_count)
303
316
{
@@ -316,21 +329,4 @@ size_t nano::transport::tcp_channel_queue::priority (traffic_type type) const
316
329
default :
317
330
return 4 ;
318
331
}
319
- }
320
-
321
- void nano::transport::tcp_channel_queue::seek_next ()
322
- {
323
- counter = 0 ;
324
- do
325
- {
326
- if (current != queues.end ())
327
- {
328
- ++current;
329
- }
330
- if (current == queues.end ())
331
- {
332
- current = queues.begin ();
333
- }
334
- release_assert (current != queues.end ());
335
- } while (current->second .empty ());
336
- }
332
+ }
0 commit comments