Storage Engine API
aligned_builder.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include "mongo/base/string_data.h"
32 #include "mongo/bson/util/builder.h"
33 
34 namespace mongo {
35 
38 public:
39  AlignedBuilder(unsigned init_size);
41  kill();
42  }
43 
45  void reset(unsigned sz);
46 
48  void reset();
49 
51  const char* buf() const {
52  return _p._data;
53  }
54 
58  size_t skip(unsigned n) {
59  unsigned l = len();
60  grow(n);
61  return l;
62  }
63 
65  char* atOfs(unsigned ofs) {
66  return _p._data + ofs;
67  }
68 
70  char* cur() {
71  return _p._data + _len;
72  }
73 
74  void appendChar(char j) {
75  *((char*)grow(sizeof(char))) = j;
76  }
77  void appendNum(char j) {
78  *((char*)grow(sizeof(char))) = j;
79  }
80  void appendNum(short j) {
81  *((short*)grow(sizeof(short))) = j;
82  }
83  void appendNum(int j) {
84  *((int*)grow(sizeof(int))) = j;
85  }
86  void appendNum(unsigned j) {
87  *((unsigned*)grow(sizeof(unsigned))) = j;
88  }
89  void appendNum(bool j) {
90  *((bool*)grow(sizeof(bool))) = j;
91  }
92  void appendNum(double j) {
93  *((double*)grow(sizeof(double))) = j;
94  }
95  void appendNum(long long j) {
96  *((long long*)grow(sizeof(long long))) = j;
97  }
98  void appendNum(unsigned long long j) {
99  *((unsigned long long*)grow(sizeof(unsigned long long))) = j;
100  }
101 
102  void appendBuf(const void* src, size_t len) {
103  memcpy(grow((unsigned)len), src, len);
104  }
105 
106  template <class T>
107  void appendStruct(const T& s) {
108  appendBuf(&s, sizeof(T));
109  }
110 
111  void appendStr(StringData str, bool includeEOO = true) {
112  const unsigned len = str.size() + (includeEOO ? 1 : 0);
113  verify(len < (unsigned)BSONObjMaxUserSize);
114  str.copyTo(grow(len), includeEOO);
115  }
116 
118  unsigned len() const {
119  return _len;
120  }
121 
122 private:
123  static const unsigned Alignment = 8192;
124 
126  inline char* grow(unsigned by) {
127  unsigned oldlen = _len;
128  _len += by;
129  if (MONGO_unlikely(_len > _p._size)) {
130  growReallocate(oldlen);
131  }
132  return _p._data + oldlen;
133  }
134 
135  void growReallocate(unsigned oldLenInUse);
136  void kill();
137  void mallocSelfAligned(unsigned sz);
138  void _malloc(unsigned sz);
139  void _realloc(unsigned newSize, unsigned oldLenInUse);
140  void _free(void*);
141 
142  struct AllocationInfo {
143  char* _data;
145  unsigned _size;
146  } _p;
147  unsigned _len; // bytes in use
148 };
149 }
unsigned len() const
Definition: aligned_builder.h:118
void appendNum(double j)
Definition: aligned_builder.h:92
void growReallocate(unsigned oldLenInUse)
Definition: aligned_builder.cpp:96
void appendNum(bool j)
Definition: aligned_builder.h:89
int ofs
Definition: btree_interface.cpp:337
struct mongo::AlignedBuilder::AllocationInfo _p
void appendNum(short j)
Definition: aligned_builder.h:80
char * atOfs(unsigned ofs)
if buffer grows pointer no longer valid
Definition: aligned_builder.h:65
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
static const unsigned Alignment
Definition: aligned_builder.h:123
void reset()
reset for a re-use.
Definition: aligned_builder.cpp:52
char * grow(unsigned by)
returns the pre-grow write position
Definition: aligned_builder.h:126
~AlignedBuilder()
Definition: aligned_builder.h:40
Definition: aligned_builder.h:142
void mallocSelfAligned(unsigned sz)
Definition: aligned_builder.cpp:82
char * cur()
if buffer grows pointer no longer valid
Definition: aligned_builder.h:70
void appendChar(char j)
Definition: aligned_builder.h:74
Journal j
Definition: dur_journal.cpp:193
a page-aligned BufBuilder.
Definition: aligned_builder.h:37
unsigned _len
Definition: aligned_builder.h:147
void appendStruct(const T &s)
Definition: aligned_builder.h:107
void _realloc(unsigned newSize, unsigned oldLenInUse)
Definition: aligned_builder.cpp:153
void kill()
Definition: aligned_builder.cpp:170
const char * buf() const
note this may be deallocated (realloced) if you keep writing or reset().
Definition: aligned_builder.h:51
void appendStr(StringData str, bool includeEOO=true)
Definition: aligned_builder.h:111
void appendNum(int j)
Definition: aligned_builder.h:83
void _malloc(unsigned sz)
Definition: aligned_builder.cpp:133
void _free(void *)
Definition: aligned_builder.cpp:162
size_t skip(unsigned n)
leave room for some stuff later
Definition: aligned_builder.h:58
unsigned _size
Definition: aligned_builder.h:145
char * _data
Definition: aligned_builder.h:143
void appendNum(long long j)
Definition: aligned_builder.h:95
void appendNum(unsigned j)
Definition: aligned_builder.h:86
void * _allocationAddress
Definition: aligned_builder.h:144
void appendNum(char j)
Definition: aligned_builder.h:77
AlignedBuilder(unsigned init_size)
Definition: aligned_builder.cpp:43
void appendBuf(const void *src, size_t len)
Definition: aligned_builder.h:102
void appendNum(unsigned long long j)
Definition: aligned_builder.h:98