/*
- * Copyright 2013 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.
* limitations under the License.
*/
-#ifndef FOLLY_IO_TYPEDIOBUF_H_
-#define FOLLY_IO_TYPEDIOBUF_H_
+#pragma once
#include <algorithm>
#include <iterator>
#include <type_traits>
-#include "folly/io/IOBuf.h"
+
+#include <folly/Malloc.h>
+#include <folly/io/IOBuf.h>
namespace folly {
return data()[idx];
}
+ T& operator[](ssize_t idx) {
+ assert(idx >= 0 && idx < length());
+ return writableData()[idx];
+ }
+
/**
* Append one element.
*/
*/
template <class IT>
void push(IT begin, IT end) {
- auto n = std::distance(begin, end);
- reserve(headroom(), n);
+ uint32_t n = std::distance(begin, end);
+ if (usingJEMalloc()) {
+ // Rely on xallocx() and avoid exponential growth to limit
+ // amount of memory wasted.
+ reserve(headroom(), n);
+ } else if (tailroom() < n) {
+ reserve(headroom(), std::max(n, 3 + size() / 2));
+ }
std::copy(begin, end, writableTail());
append(n);
}
};
} // namespace folly
-
-#endif /* FOLLY_IO_TYPEDIOBUF_H_ */
-