Skip to content

Commit 4bb4fd0

Browse files
committed
serializer has simpler buffer logic
1 parent c584084 commit 4bb4fd0

4 files changed

Lines changed: 130 additions & 216 deletions

File tree

include/boost/http_proto/impl/serializer.hpp

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,100 +18,96 @@
1818
namespace boost {
1919
namespace http_proto {
2020

21-
class serializer::const_buf_gen_base
21+
class serializer::cbs_gen
2222
{
2323
public:
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

4749
template<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

5759
public:
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);

include/boost/http_proto/serializer.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -553,9 +553,9 @@ class serializer
553553
}
554554

555555
private:
556-
class const_buf_gen_base;
556+
class cbs_gen;
557557
template<class>
558-
class const_buf_gen;
558+
class cbs_gen_impl;
559559

560560
detail::array_of_const_buffers
561561
make_array(std::size_t n);
@@ -648,7 +648,7 @@ class serializer
648648
detail::workspace ws_;
649649

650650
detail::filter* filter_ = nullptr;
651-
const_buf_gen_base* buf_gen_ = nullptr;
651+
cbs_gen* cbs_gen_ = nullptr;
652652
source* source_ = nullptr;
653653

654654
buffers::circular_buffer out_;

src/detail/impl/array_of_const_buffers.cpp renamed to src/detail/array_of_const_buffers.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ namespace detail {
2020
array_of_const_buffers::
2121
array_of_const_buffers(
2222
value_type* p,
23-
std::uint16_t n) noexcept
23+
std::uint16_t capacity) noexcept
2424
: base_(p)
25-
, cap_(n)
25+
, cap_(capacity)
2626
, pos_(0)
27-
, size_(n)
27+
, size_(0)
2828
{
2929
}
3030

0 commit comments

Comments
 (0)