class Endian {
public:
+ enum class Order : uint8_t {
+ LITTLE,
+ BIG
+ };
+
+ static constexpr Order order =
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ Order::LITTLE;
+#elif __BYTE_ORDER == __BIG_ENDIAN
+ Order::BIG;
+#else
+# error Your machine uses a weird endianness!
+#endif /* __BYTE_ORDER */
+
template <class T> static T swap(T x) {
return detail::EndianInt<T>::swap(x);
}
bool cacheChainLength;
};
+ /**
+ * Commonly used Options, currently the only possible value other than
+ * the default.
+ */
+ static Options cacheChainLength() {
+ Options options;
+ options.cacheChainLength = true;
+ return options;
+ }
+
explicit IOBufQueue(const Options& options = Options());
/**
#ifndef FOLLY_IO_TYPEDIOBUF_H_
#define FOLLY_IO_TYPEDIOBUF_H_
+#include <algorithm>
+#include <iterator>
#include <type_traits>
#include "folly/experimental/io/IOBuf.h"
buf_->reserve(smul(minHeadroom), smul(minTailroom));
}
+ /**
+ * Simple wrapper to make it easier to treat this TypedIOBuf as an array of
+ * T.
+ */
+ const T& operator[](ssize_t idx) const {
+ assert(idx >= 0 && idx < length());
+ return data()[idx];
+ }
+
+ /**
+ * Append one element.
+ */
+ void push(const T& data) {
+ push(&data, &data + 1);
+ }
+
+ /**
+ * Append multiple elements in a sequence; will call distance().
+ */
+ template <class IT>
+ void push(IT begin, IT end) {
+ auto n = std::distance(begin, end);
+ reserve(headroom(), n);
+ std::copy(begin, end, writableTail());
+ append(n);
+ }
+
// Movable
TypedIOBuf(TypedIOBuf&&) = default;
TypedIOBuf& operator=(TypedIOBuf&&) = default;