/*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* @throws std::underflow_error if n exceeds the number of bytes
* in the queue.
*/
- std::unique_ptr<folly::IOBuf> split(size_t n);
+ std::unique_ptr<folly::IOBuf> split(size_t n) {
+ return split(n, true);
+ }
+
+ /**
+ * Similar to split, but will return the entire queue instead of throwing
+ * if n exceeds the number of bytes in the queue.
+ */
+ std::unique_ptr<folly::IOBuf> splitAtMost(size_t n) {
+ return split(n, false);
+ }
/**
* Similar to IOBuf::trimStart, but works on the whole queue. Will
*/
void trimStart(size_t amount);
+ /**
+ * Similar to trimStart, but will trim at most amount bytes and returns
+ * the number of bytes trimmed.
+ */
+ size_t trimStartAtMost(size_t amount);
+
/**
* Similar to IOBuf::trimEnd, but works on the whole queue. Will
* pop off buffers that have been completely trimmed.
*/
void trimEnd(size_t amount);
+ /**
+ * Similar to trimEnd, but will trim at most amount bytes and returns
+ * the number of bytes trimmed.
+ */
+ size_t trimEndAtMost(size_t amount);
+
/**
* Transfer ownership of the queue's entire IOBuf chain to the caller.
*/
private:
IOBuf* tailBuf() const {
- if (UNLIKELY(!head_)) return nullptr;
+ if (UNLIKELY(!head_)) {
+ return nullptr;
+ }
IOBuf* buf = head_->prev();
return LIKELY(!buf->isSharedOne()) ? buf : nullptr;
}
std::pair<void*,uint64_t> preallocateSlow(
uint64_t min, uint64_t newAllocationSize, uint64_t max);
+ std::unique_ptr<folly::IOBuf> split(size_t n, bool throwOnUnderflow);
+
static const size_t kChainLengthNotCached = (size_t)-1;
/** Not copyable */
IOBufQueue(const IOBufQueue&) = delete;
std::unique_ptr<folly::IOBuf> head_;
};
-} // folly
+} // namespace folly