@@ -12,38 +12,18 @@ using namespace facebook::react;
1212namespace facebook {
1313namespace react {
1414
15- // TODO T83483191: Add asserts to check overflowing on additions
16- MapBufferBuilder::MapBufferBuilder ()
17- : MapBufferBuilder::MapBufferBuilder(INITIAL_KEY_VALUE_SIZE) {}
18-
1915MapBuffer MapBufferBuilder::EMPTY () {
2016 return MapBufferBuilder ().build ();
2117}
2218
23- MapBufferBuilder::MapBufferBuilder (uint16_t initialSize) {
24- keyValuesSize_ = initialSize;
25- keyValues_ = new Byte[keyValuesSize_];
26- // First Key should be written right after the header.
27- keyValuesOffset_ = HEADER_SIZE;
19+ MapBufferBuilder::MapBufferBuilder (uint32_t initialSize) {
20+ buckets_.reserve (initialSize);
2821
2922 dynamicDataSize_ = 0 ;
3023 dynamicDataValues_ = nullptr ;
3124 dynamicDataOffset_ = 0 ;
3225}
3326
34- void MapBufferBuilder::ensureKeyValueSpace () {
35- int32_t oldKeyValuesSize = keyValuesSize_;
36- react_native_assert (
37- (keyValuesSize_ < std::numeric_limits<uint16_t >::max () / 2 ) &&
38- " Error trying to assign a value beyond the capacity of uint16_t: " );
39- keyValuesSize_ *= 2 ;
40- uint8_t *newKeyValues = new Byte[keyValuesSize_];
41- uint8_t *oldKeyValues = keyValues_;
42- memcpy (newKeyValues, keyValues_, oldKeyValuesSize);
43- keyValues_ = newKeyValues;
44- delete[] oldKeyValues;
45- }
46-
4727void MapBufferBuilder::storeKeyValue (
4828 Key key,
4929 uint8_t *value,
@@ -58,24 +38,15 @@ void MapBufferBuilder::storeKeyValue(
5838 abort ();
5939 }
6040
61- // TODO T83483191: header.count points to the next index
62- // TODO T83483191: add test to verify storage of sparse keys
63- int32_t keyOffset = getKeyOffset (_header.count );
64- int32_t valueOffset = keyOffset + KEY_SIZE;
65-
66- int32_t nextKeyValueOffset = keyOffset + BUCKET_SIZE;
67- if (nextKeyValueOffset >= keyValuesSize_) {
68- ensureKeyValueSpace ();
69- }
41+ uint64_t data = 0 ;
42+ auto *dataPtr = reinterpret_cast <uint8_t *>(&data);
43+ memcpy (dataPtr, value, valueSize);
7044
71- memcpy (keyValues_ + keyOffset, &key, KEY_SIZE);
72- memcpy (keyValues_ + valueOffset, value, valueSize);
45+ buckets_.emplace_back (key, data);
7346
7447 _header.count ++;
7548
7649 minKeyToStore_ = key + 1 ;
77- // Move keyValuesOffset_ to the next available [key, value] position
78- keyValuesOffset_ = std::max (nextKeyValueOffset, keyValuesOffset_);
7950}
8051
8152void MapBufferBuilder::putBool (Key key, bool value) {
@@ -168,56 +139,27 @@ void MapBufferBuilder::putMapBuffer(Key key, MapBuffer const &map) {
168139}
169140
170141MapBuffer MapBufferBuilder::build () {
171- react_native_assert (
172- (keyValues_ != nullptr ) &&
173- " Error when building mapbuffer with invalid datastructures." );
174-
175142 // Create buffer: [header] + [key, values] + [dynamic data]
176- int32_t bufferSize = keyValuesOffset_ + dynamicDataOffset_;
143+ auto bucketSize = buckets_.size () * BUCKET_SIZE;
144+ int32_t bufferSize = HEADER_SIZE + bucketSize + dynamicDataOffset_;
177145
178146 _header.bufferSize = bufferSize;
179147
180- // Copy header at the beginning of "keyValues_"
181- memcpy (keyValues_, &_header, HEADER_SIZE);
182-
183148 std::vector<uint8_t > buffer (bufferSize);
184-
185- memcpy (buffer.data (), keyValues_, keyValuesOffset_ );
149+ memcpy (buffer. data (), &_header, HEADER_SIZE);
150+ memcpy (buffer.data () + HEADER_SIZE, buckets_. data (), bucketSize );
186151
187152 if (dynamicDataValues_ != nullptr ) {
188153 memcpy (
189- buffer.data () + keyValuesOffset_ ,
154+ buffer.data () + HEADER_SIZE + bucketSize ,
190155 dynamicDataValues_,
191156 dynamicDataOffset_);
192157 }
193158
194- auto map = MapBuffer (std::move (buffer));
195-
196- // TODO T83483191: we should invalidate the class once the build() method is
197- // called.
198-
199- if (keyValues_ != nullptr ) {
200- delete[] keyValues_;
201- }
202- keyValues_ = nullptr ;
203- keyValuesSize_ = 0 ;
204- keyValuesOffset_ = 0 ;
205-
206- if (dynamicDataValues_ != nullptr ) {
207- delete[] dynamicDataValues_;
208- dynamicDataValues_ = nullptr ;
209- }
210- dynamicDataSize_ = 0 ;
211- dynamicDataOffset_ = 0 ;
212- _header = {ALIGNMENT, 0 , 0 };
213-
214- return map;
159+ return MapBuffer (std::move (buffer));
215160}
216161
217162MapBufferBuilder::~MapBufferBuilder () {
218- if (keyValues_ != nullptr ) {
219- delete[] keyValues_;
220- }
221163 if (dynamicDataValues_ != nullptr ) {
222164 delete[] dynamicDataValues_;
223165 }
0 commit comments