44#pragma once
55
66#include < algorithm>
7+ #include < deque>
78#include < memory>
8- #include < queue>
99
1010namespace silkworm ::rpc::http {
1111
@@ -27,28 +27,27 @@ class Chunker {
2727 // creates chunk: even if new:buffer is greater kDefaultMaxChunkSize
2828 while (position < new_buffer.size ()) {
2929 size_t available_space = kDefaultMaxChunkSize - current_chunk_.size ();
30- size_t chunk_size = std::min (available_space, new_buffer.size () - position);
30+ const size_t chunk_size = std::min (available_space, new_buffer.size () - position);
3131
3232 current_chunk_.append (new_buffer, position, chunk_size);
3333 position += chunk_size;
3434
35- // one chunk is completed copy it in complet_chunk
36- if (current_chunk_.size () = = kDefaultMaxChunkSize ) {
37- complete_chunk_.push ( current_chunk_);
35+ // one chunk is completed copy it in complete_chunk queue
36+ if (current_chunk_.size () > = kDefaultMaxChunkSize ) {
37+ complete_chunk_.push_back ( std::move ( current_chunk_) );
3838 current_chunk_.clear ();
39- current_chunk_.reserve (kDefaultMaxChunkSize );
4039 }
4140 }
4241 }
4342
4443 std::pair<std::string, bool > get_complete_chunk () {
4544 if (!complete_chunk_.empty ()) {
46- // at least one chunk is availble return it , indicating if first chunk or not
45+ // at least one chunk is available return it , indicating if first chunk or not
4746 auto ret_first_chunk = !first_chunk_completed_;
4847 first_chunk_completed_ = true ;
49- std::string chunk = complete_chunk_.front ();
50- complete_chunk_.pop ();
51- return std::make_pair (chunk, ret_first_chunk);
48+ std::string chunk = std::move ( complete_chunk_.front () );
49+ complete_chunk_.pop_front ();
50+ return std::make_pair (std::move ( chunk) , ret_first_chunk);
5251 }
5352 // queue is empty no chunk are available
5453 return std::make_pair (" " , false );
@@ -58,18 +57,18 @@ class Chunker {
5857 return !complete_chunk_.empty ();
5958 }
6059
61- std::pair<std::string, bool > get_remainder () const {
60+ std::pair<std::string, bool > get_remainder () {
6261 if (current_chunk_.empty ()) {
6362 // no bytes are present on current_chunk so return empty string and indication if first chunk or not
6463 // we are in two possible cases: at least one completed chunk is already produced, or any chunk are produced
6564 return std::make_pair (" " , !first_chunk_completed_);
6665 }
6766 // returns the chunk
68- return std::make_pair (current_chunk_, !first_chunk_completed_);
67+ return std::make_pair (std::move ( current_chunk_) , !first_chunk_completed_);
6968 }
7069
7170 private:
72- std::queue <std::string> complete_chunk_;
71+ std::deque <std::string> complete_chunk_;
7372 std::string current_chunk_;
7473 bool first_chunk_completed_{false };
7574};
0 commit comments