1818namespace boost {
1919namespace http_proto {
2020
21- class serializer ::const_buf_gen_base
21+ class serializer ::cbs_gen
2222{
2323public:
24- // Return the next non-empty buffer,
25- // or an empty buffer if none remain.
24+ struct stats_t
25+ {
26+ std::size_t size = 0 ;
27+ std::size_t count = 0 ;
28+ };
29+
30+ // Return the next non-empty buffer or an
31+ // empty buffer if none remain.
2632 virtual
2733 buffers::const_buffer
2834 next () = 0 ;
2935
30- // Size of remaining buffers
31- virtual
32- std::size_t
33- size () const = 0 ;
34-
35- // Count of remaining non-empty buffers
36+ // Return the total size and count of
37+ // remaining non-empty buffers.
3638 virtual
37- std:: size_t
38- count () const = 0 ;
39+ stats_t
40+ stats () const = 0 ;
3941
40- // Return true when there is no buffer or
41- // the remaining buffers are empty
42+ // Return true if there are no remaining
43+ // non-empty buffers.
4244 virtual
4345 bool
4446 is_empty () const = 0 ;
4547};
4648
4749template <class ConstBufferSequence >
48- class serializer ::const_buf_gen
49- : public const_buf_gen_base
50+ class serializer ::cbs_gen_impl
51+ : public cbs_gen
5052{
5153 using it_t = decltype (buffers::begin(
5254 std::declval<ConstBufferSequence>()));
5355
5456 ConstBufferSequence cbs_;
55- it_t current_ ;
57+ it_t curr_ ;
5658
5759public:
5860 using const_buffer =
5961 buffers::const_buffer;
6062
6163 explicit
62- const_buf_gen (ConstBufferSequence cbs)
64+ cbs_gen_impl (ConstBufferSequence cbs)
6365 : cbs_(std::move(cbs))
64- , current_ (buffers::begin(cbs_))
66+ , curr_ (buffers::begin(cbs_))
6567 {
6668 }
6769
6870 const_buffer
6971 next () override
7072 {
71- while (current_ != buffers::end (cbs_))
73+ while (curr_ != buffers::end (cbs_))
7274 {
73- const_buffer buf = *current_++;
75+ // triggers conversion operator
76+ const_buffer buf = *curr_++;
7477 if (buf.size () != 0 )
7578 return buf;
7679 }
7780 return {};
7881 }
7982
80- std::size_t
81- size () const override
82- {
83- return std::accumulate (
84- current_,
85- buffers::end (cbs_),
86- std::size_t {},
87- [](std::size_t sum, const_buffer cb)
88- {
89- return sum + cb.size ();
90- });
91- }
92-
93- std::size_t
94- count () const override
83+ stats_t
84+ stats () const override
9585 {
96- return std::count_if (
97- current_,
98- buffers::end (cbs_),
99- [](const_buffer cb)
86+ stats_t r;
87+ for (auto it = curr_; it != buffers::end (cbs_); ++it)
88+ {
89+ // triggers conversion operator
90+ const_buffer buf = *it;
91+ if (buf.size () != 0 )
10092 {
101- return cb.size () != 0 ;
102- });
93+ r.size += buf.size ();
94+ r.count += 1 ;
95+ }
96+ }
97+ return r;
10398 }
10499
105100 bool
106101 is_empty () const override
107102 {
108- return std::all_of (
109- current_,
110- buffers::end (cbs_),
111- [](const_buffer cb)
112- {
113- return cb.size () == 0 ;
114- });
103+ for (auto it = curr_; it != buffers::end (cbs_); ++it)
104+ {
105+ // triggers conversion operator
106+ const_buffer buf = *it;
107+ if (buf.size () != 0 )
108+ return false ;
109+ }
110+ return true ;
115111 }
116112};
117113
@@ -131,8 +127,8 @@ start(
131127 " ConstBufferSequence type requirements not met" );
132128
133129 start_init (m);
134- buf_gen_ = std::addressof (
135- ws_.emplace <const_buf_gen <typename
130+ cbs_gen_ = std::addressof (
131+ ws_.emplace <cbs_gen_impl <typename
136132 std::decay<ConstBufferSequence>::type>>(
137133 std::forward<ConstBufferSequence>(cbs)));
138134 start_buffers (m);
0 commit comments