summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/mmap_v1/aligned_builder.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/storage/mmap_v1/aligned_builder.h')
-rw-r--r--src/mongo/db/storage/mmap_v1/aligned_builder.h211
1 files changed, 112 insertions, 99 deletions
diff --git a/src/mongo/db/storage/mmap_v1/aligned_builder.h b/src/mongo/db/storage/mmap_v1/aligned_builder.h
index fb184424b66..f43cbee7d5d 100644
--- a/src/mongo/db/storage/mmap_v1/aligned_builder.h
+++ b/src/mongo/db/storage/mmap_v1/aligned_builder.h
@@ -33,104 +33,117 @@
namespace mongo {
- /** a page-aligned BufBuilder. */
- class AlignedBuilder {
- public:
- AlignedBuilder(unsigned init_size);
- ~AlignedBuilder() { kill(); }
-
- /** reset with a hint as to the upcoming needed size specified */
- void reset(unsigned sz);
-
- /** reset for a re-use. shrinks if > 128MB */
- void reset();
-
- /** note this may be deallocated (realloced) if you keep writing or reset(). */
- const char* buf() const { return _p._data; }
-
- /** leave room for some stuff later
- @return offset in the buffer that was our current position
- */
- size_t skip(unsigned n) {
- unsigned l = len();
- grow(n);
- return l;
+/** a page-aligned BufBuilder. */
+class AlignedBuilder {
+public:
+ AlignedBuilder(unsigned init_size);
+ ~AlignedBuilder() {
+ kill();
+ }
+
+ /** reset with a hint as to the upcoming needed size specified */
+ void reset(unsigned sz);
+
+ /** reset for a re-use. shrinks if > 128MB */
+ void reset();
+
+ /** note this may be deallocated (realloced) if you keep writing or reset(). */
+ const char* buf() const {
+ return _p._data;
+ }
+
+ /** leave room for some stuff later
+ @return offset in the buffer that was our current position
+ */
+ size_t skip(unsigned n) {
+ unsigned l = len();
+ grow(n);
+ return l;
+ }
+
+ /** if buffer grows pointer no longer valid */
+ char* atOfs(unsigned ofs) {
+ return _p._data + ofs;
+ }
+
+ /** if buffer grows pointer no longer valid */
+ char* cur() {
+ return _p._data + _len;
+ }
+
+ void appendChar(char j) {
+ *((char*)grow(sizeof(char))) = j;
+ }
+ void appendNum(char j) {
+ *((char*)grow(sizeof(char))) = j;
+ }
+ void appendNum(short j) {
+ *((short*)grow(sizeof(short))) = j;
+ }
+ void appendNum(int j) {
+ *((int*)grow(sizeof(int))) = j;
+ }
+ void appendNum(unsigned j) {
+ *((unsigned*)grow(sizeof(unsigned))) = j;
+ }
+ void appendNum(bool j) {
+ *((bool*)grow(sizeof(bool))) = j;
+ }
+ void appendNum(double j) {
+ *((double*)grow(sizeof(double))) = j;
+ }
+ void appendNum(long long j) {
+ *((long long*)grow(sizeof(long long))) = j;
+ }
+ void appendNum(unsigned long long j) {
+ *((unsigned long long*)grow(sizeof(unsigned long long))) = j;
+ }
+
+ void appendBuf(const void* src, size_t len) {
+ memcpy(grow((unsigned)len), src, len);
+ }
+
+ template <class T>
+ void appendStruct(const T& s) {
+ appendBuf(&s, sizeof(T));
+ }
+
+ void appendStr(StringData str, bool includeEOO = true) {
+ const unsigned len = str.size() + (includeEOO ? 1 : 0);
+ verify(len < (unsigned)BSONObjMaxUserSize);
+ str.copyTo(grow(len), includeEOO);
+ }
+
+ /** @return the in-use length */
+ unsigned len() const {
+ return _len;
+ }
+
+private:
+ static const unsigned Alignment = 8192;
+
+ /** returns the pre-grow write position */
+ inline char* grow(unsigned by) {
+ unsigned oldlen = _len;
+ _len += by;
+ if (MONGO_unlikely(_len > _p._size)) {
+ growReallocate(oldlen);
}
-
- /** if buffer grows pointer no longer valid */
- char* atOfs(unsigned ofs) { return _p._data + ofs; }
-
- /** if buffer grows pointer no longer valid */
- char* cur() { return _p._data + _len; }
-
- void appendChar(char j) {
- *((char*)grow(sizeof(char))) = j;
- }
- void appendNum(char j) {
- *((char*)grow(sizeof(char))) = j;
- }
- void appendNum(short j) {
- *((short*)grow(sizeof(short))) = j;
- }
- void appendNum(int j) {
- *((int*)grow(sizeof(int))) = j;
- }
- void appendNum(unsigned j) {
- *((unsigned*)grow(sizeof(unsigned))) = j;
- }
- void appendNum(bool j) {
- *((bool*)grow(sizeof(bool))) = j;
- }
- void appendNum(double j) {
- *((double*)grow(sizeof(double))) = j;
- }
- void appendNum(long long j) {
- *((long long*)grow(sizeof(long long))) = j;
- }
- void appendNum(unsigned long long j) {
- *((unsigned long long*)grow(sizeof(unsigned long long))) = j;
- }
-
- void appendBuf(const void *src, size_t len) { memcpy(grow((unsigned) len), src, len); }
-
- template<class T>
- void appendStruct(const T& s) { appendBuf(&s, sizeof(T)); }
-
- void appendStr(StringData str , bool includeEOO = true ) {
- const unsigned len = str.size() + ( includeEOO ? 1 : 0 );
- verify( len < (unsigned) BSONObjMaxUserSize );
- str.copyTo( grow(len), includeEOO );
- }
-
- /** @return the in-use length */
- unsigned len() const { return _len; }
-
- private:
- static const unsigned Alignment = 8192;
-
- /** returns the pre-grow write position */
- inline char* grow(unsigned by) {
- unsigned oldlen = _len;
- _len += by;
- if (MONGO_unlikely( _len > _p._size )) {
- growReallocate(oldlen);
- }
- return _p._data + oldlen;
- }
-
- void growReallocate(unsigned oldLenInUse);
- void kill();
- void mallocSelfAligned(unsigned sz);
- void _malloc(unsigned sz);
- void _realloc(unsigned newSize, unsigned oldLenInUse);
- void _free(void*);
-
- struct AllocationInfo {
- char *_data;
- void *_allocationAddress;
- unsigned _size;
- } _p;
- unsigned _len; // bytes in use
- };
-
+ return _p._data + oldlen;
+ }
+
+ void growReallocate(unsigned oldLenInUse);
+ void kill();
+ void mallocSelfAligned(unsigned sz);
+ void _malloc(unsigned sz);
+ void _realloc(unsigned newSize, unsigned oldLenInUse);
+ void _free(void*);
+
+ struct AllocationInfo {
+ char* _data;
+ void* _allocationAddress;
+ unsigned _size;
+ } _p;
+ unsigned _len; // bytes in use
+};
}