31 using std::unique_ptr;
34 #define SCL(x) (x), sizeof(x) - 1 38 IOBufQueue::Options clOptions;
41 clOptions.cacheChainLength =
true;
44 Initializer initializer;
46 unique_ptr<IOBuf> stringToIOBuf(
const char*
s,
size_t len) {
47 unique_ptr<IOBuf> buf = IOBuf::create(len);
53 void checkConsistency(
const IOBufQueue& queue) {
67 queue.
append(unique_ptr<IOBuf>());
80 checkConsistency(queue);
81 checkConsistency(queue2);
83 checkConsistency(queue);
84 checkConsistency(queue2);
97 checkConsistency(queue);
98 checkConsistency(queue2);
100 checkConsistency(queue);
101 checkConsistency(queue2);
112 queue.
append(s.data(), s.length());
114 checkConsistency(queue);
115 checkConsistency(queue2);
125 queue.
append(stringToIOBuf(
SCL(
"Hello")));
129 queue.
append(stringToIOBuf(
SCL(
"World")));
130 checkConsistency(queue);
134 checkConsistency(queue);
138 checkConsistency(queue);
139 EXPECT_EQ(2, prefix->computeChainDataLength());
141 prefix = queue.
split(3);
142 checkConsistency(queue);
143 EXPECT_EQ(3, prefix->computeChainDataLength());
145 prefix = queue.
split(1);
146 checkConsistency(queue);
147 EXPECT_EQ(1, prefix->computeChainDataLength());
149 prefix = queue.
split(5);
150 checkConsistency(queue);
151 EXPECT_EQ(5, prefix->computeChainDataLength());
154 queue.
append(stringToIOBuf(
SCL(
"Hello,")));
155 queue.
append(stringToIOBuf(
SCL(
" World")));
156 checkConsistency(queue);
158 checkConsistency(queue);
163 queue.
append(stringToIOBuf(
SCL(
"Hello,")));
164 queue.
append(stringToIOBuf(
SCL(
" World")));
166 EXPECT_EQ(buf->computeChainDataLength(), 12);
172 queue.
append(stringToIOBuf(
SCL(
"Hello world")));
173 auto buf = queue.
split(0);
174 EXPECT_EQ(buf->computeChainDataLength(), 0);
179 queue.
append(
string(
"Hello"));
181 checkConsistency(queue);
182 EXPECT_NE((
void*)
nullptr, writable.first);
185 memcpy(writable.first,
SCL(
", "));
187 checkConsistency(queue);
190 checkConsistency(queue);
194 checkConsistency(queue);
202 checkConsistency(queue);
208 const char* buf =
"hello world goodbye";
209 size_t len = strlen(buf);
211 auto iob = queue.
move();
212 EXPECT_EQ((len - 1) / 6 + 1, iob->countChainElements());
217 StringPiece(reinterpret_cast<const char*>(iob->data()), iob->length()));
222 unique_ptr<IOBuf>
a = IOBuf::create(4);
225 checkConsistency(queue);
226 a = IOBuf::create(6);
229 checkConsistency(queue);
230 a = IOBuf::create(8);
233 checkConsistency(queue);
234 a = IOBuf::create(10);
237 checkConsistency(queue);
244 checkConsistency(queue);
250 checkConsistency(queue);
256 checkConsistency(queue);
262 checkConsistency(queue);
268 checkConsistency(queue);
272 checkConsistency(queue);
275 checkConsistency(queue);
280 unique_ptr<IOBuf>
a = IOBuf::create(4);
283 checkConsistency(queue);
284 a = IOBuf::create(6);
287 checkConsistency(queue);
288 a = IOBuf::create(8);
291 checkConsistency(queue);
292 a = IOBuf::create(10);
295 checkConsistency(queue);
302 checkConsistency(queue);
308 checkConsistency(queue);
315 unique_ptr<IOBuf>
a = IOBuf::create(4);
318 checkConsistency(queue);
319 a = IOBuf::create(6);
322 checkConsistency(queue);
323 a = IOBuf::create(8);
326 checkConsistency(queue);
327 a = IOBuf::create(10);
330 checkConsistency(queue);
337 checkConsistency(queue);
343 checkConsistency(queue);
350 unique_ptr<IOBuf>
a = IOBuf::create(64);
353 checkConsistency(queue);
354 a = IOBuf::create(6);
357 checkConsistency(queue);
358 a = IOBuf::create(8);
361 checkConsistency(queue);
362 a = IOBuf::create(10);
365 checkConsistency(queue);
372 checkConsistency(queue);
378 checkConsistency(queue);
384 checkConsistency(queue);
390 checkConsistency(queue);
396 checkConsistency(queue);
400 checkConsistency(queue);
403 checkConsistency(queue);
418 auto out = queue.
move();
422 StringPiece(reinterpret_cast<const char*>(out->data()), out->length()));
426 IOBufQueue queue(IOBufQueue::cacheChainLength());
427 const char*
strings[] = {
"Hello",
",",
" ",
"",
"World"};
429 const size_t numStrings =
sizeof(
strings) /
sizeof(*strings);
430 size_t chainLength = 0;
431 for (
size_t i = 0;
i < numStrings; ++
i) {
432 queue.
append(stringToIOBuf(strings[
i], strlen(strings[i])));
433 checkConsistency(queue);
434 chainLength += strlen(strings[i]);
437 unique_ptr<IOBuf>
first;
438 for (
size_t i = 0;
i < numStrings; ++
i) {
439 checkConsistency(queue);
443 chainLength -= strlen(strings[
i]);
444 EXPECT_EQ(strlen(strings[i]), first->computeChainDataLength());
446 checkConsistency(queue);
453 checkConsistency(queue);
460 queue.
append(
"hello ", 6);
470 queue.
append(stringToIOBuf(
SCL(
"hello ")));
471 queue.
append(stringToIOBuf(
SCL(
"world")));
478 reinterpret_cast<const char*>(queue.
front()->
data()),
#define EXPECT_LE(val1, val2)
std::unique_ptr< folly::IOBuf > split(size_t n)
const folly::IOBuf * front() const
void append(std::unique_ptr< folly::IOBuf > &&buf, bool pack=false)
size_t chainLength() const
void prepend(const void *buf, std::size_t n)
std::unique_ptr< folly::IOBuf > splitAtMost(size_t n)
#define EXPECT_THROW(statement, expected_exception)
static std::unique_ptr< IOBuf > create(std::size_t capacity)
#define EXPECT_EQ(val1, val2)
constexpr detail::Map< Move > move
const uint8_t * data() const
std::unique_ptr< folly::IOBuf > move()
size_t countChainElements() const
void appendToString(std::string &out) const
bool prefix(Cursor &c, uint32_t expected)
#define EXPECT_GE(val1, val2)
const Options & options() const
std::pair< void *, std::size_t > preallocate(std::size_t min, std::size_t newAllocationSize, std::size_t max=std::numeric_limits< std::size_t >::max())
size_t trimStartAtMost(size_t amount)
std::size_t length() const
void wrapBuffer(const void *buf, size_t len, std::size_t blockSize=(1U<< 31))
size_t trimEndAtMost(size_t amount)
std::size_t computeChainDataLength() const
#define EXPECT_TRUE(condition)
#define EXPECT_NE(val1, val2)
void trimStart(size_t amount)
Range< const char * > StringPiece
void trimEnd(size_t amount)
static vector< fbstring > strings
void postallocate(std::size_t n)
void gather(std::size_t maxLength)
void append(std::size_t amount)
std::unique_ptr< folly::IOBuf > pop_front()
constexpr detail::First first