@@ -449,7 +449,7 @@ class FlatBufferBuilder {
449449 }
450450 template <typename T> void PreAlign (size_t len) {
451451 AssertScalarT<T>();
452- PreAlign (len, sizeof (T ));
452+ PreAlign (len, AlignOf<T>( ));
453453 }
454454 // / @endcond
455455
@@ -589,11 +589,15 @@ class FlatBufferBuilder {
589589 return PushElement (static_cast <uoffset_t >(len));
590590 }
591591
592- void StartVector (size_t len, size_t elemsize) {
592+ void StartVector (size_t len, size_t elemsize, size_t alignment ) {
593593 NotNested ();
594594 nested = true ;
595595 PreAlign<uoffset_t >(len * elemsize);
596- PreAlign (len * elemsize, elemsize); // Just in case elemsize > uoffset_t.
596+ PreAlign (len * elemsize, alignment); // Just in case elemsize > uoffset_t.
597+ }
598+
599+ template <typename T> void StartVector (size_t len) {
600+ return StartVector (len, sizeof (T), AlignOf<T>());
597601 }
598602
599603 // Call this right before StartVector/CreateVector if you want to force the
@@ -627,7 +631,7 @@ class FlatBufferBuilder {
627631 // If this assert hits, you're specifying a template argument that is
628632 // causing the wrong overload to be selected, remove it.
629633 AssertScalarT<T>();
630- StartVector (len, sizeof (T) );
634+ StartVector<T> (len);
631635 if (len == 0 ) { return Offset<Vector<T>>(EndVector (len)); }
632636 // clang-format off
633637 #if FLATBUFFERS_LITTLEENDIAN
@@ -668,7 +672,7 @@ class FlatBufferBuilder {
668672
669673 template <typename T>
670674 Offset<Vector<Offset<T>>> CreateVector (const Offset<T> *v, size_t len) {
671- StartVector (len, sizeof ( Offset<T>) );
675+ StartVector< Offset<T>>(len );
672676 for (auto i = len; i > 0 ;) { PushElement (v[--i]); }
673677 return Offset<Vector<Offset<T>>>(EndVector (len));
674678 }
@@ -688,7 +692,7 @@ class FlatBufferBuilder {
688692 // an array. Instead, read elements manually.
689693 // Background: https://isocpp.org/blog/2012/11/on-vectorbool
690694 Offset<Vector<uint8_t >> CreateVector (const std::vector<bool > &v) {
691- StartVector (v.size (), sizeof ( uint8_t ));
695+ StartVector< uint8_t > (v.size ());
692696 for (auto i = v.size (); i > 0 ;) {
693697 PushElement (static_cast <uint8_t >(v[--i]));
694698 }
@@ -762,7 +766,7 @@ class FlatBufferBuilder {
762766 for (auto it = begin; it != end; ++it) {
763767 buf_.scratch_push_small (CreateString (*it));
764768 }
765- StartVector (size, sizeof ( Offset<String>) );
769+ StartVector< Offset<String>>(size );
766770 for (auto i = 1 ; i <= size; i++) {
767771 // Note we re-evaluate the buf location each iteration to account for any
768772 // underlying buffer resizing that may occur.
@@ -782,7 +786,7 @@ class FlatBufferBuilder {
782786 // / where the vector is stored.
783787 template <typename T>
784788 Offset<Vector<const T *>> CreateVectorOfStructs (const T *v, size_t len) {
785- StartVector (len * sizeof (T) / AlignOf<T>(), AlignOf<T>());
789+ StartVector (len * sizeof (T) / AlignOf<T>(), sizeof (T), AlignOf<T>());
786790 if (len > 0 ) {
787791 PushBytes (reinterpret_cast <const uint8_t *>(v), sizeof (T) * len);
788792 }
@@ -1025,16 +1029,22 @@ class FlatBufferBuilder {
10251029 // / written to at a later time to serialize the data into a `vector`
10261030 // / in the buffer.
10271031 uoffset_t CreateUninitializedVector (size_t len, size_t elemsize,
1028- uint8_t **buf) {
1032+ size_t alignment, uint8_t **buf) {
10291033 NotNested ();
1030- StartVector (len, elemsize);
1034+ StartVector (len, elemsize, alignment );
10311035 buf_.make_space (len * elemsize);
10321036 auto vec_start = GetSize ();
10331037 auto vec_end = EndVector (len);
10341038 *buf = buf_.data_at (vec_start);
10351039 return vec_end;
10361040 }
10371041
1042+ FLATBUFFERS_ATTRIBUTE ([[deprecated(" call the version above instead" )]])
1043+ uoffset_t CreateUninitializedVector (size_t len, size_t elemsize,
1044+ uint8_t **buf) {
1045+ return CreateUninitializedVector (len, elemsize, elemsize, buf);
1046+ }
1047+
10381048 // / @brief Specialized version of `CreateVector` for non-copying use cases.
10391049 // / Write the data any time later to the returned buffer pointer `buf`.
10401050 // / @tparam T The data type of the data that will be stored in the buffer
@@ -1046,14 +1056,14 @@ class FlatBufferBuilder {
10461056 template <typename T>
10471057 Offset<Vector<T>> CreateUninitializedVector (size_t len, T **buf) {
10481058 AssertScalarT<T>();
1049- return CreateUninitializedVector (len, sizeof (T),
1059+ return CreateUninitializedVector (len, sizeof (T), AlignOf<T>(),
10501060 reinterpret_cast <uint8_t **>(buf));
10511061 }
10521062
10531063 template <typename T>
10541064 Offset<Vector<const T *>> CreateUninitializedVectorOfStructs (size_t len,
10551065 T **buf) {
1056- return CreateUninitializedVector (len, sizeof (T),
1066+ return CreateUninitializedVector (len, sizeof (T), AlignOf<T>(),
10571067 reinterpret_cast <uint8_t **>(buf));
10581068 }
10591069
@@ -1064,7 +1074,7 @@ class FlatBufferBuilder {
10641074 Offset<Vector<T>> CreateVectorScalarCast (const U *v, size_t len) {
10651075 AssertScalarT<T>();
10661076 AssertScalarT<U>();
1067- StartVector (len, sizeof (T) );
1077+ StartVector<T> (len);
10681078 for (auto i = len; i > 0 ;) { PushElement (static_cast <T>(v[--i])); }
10691079 return Offset<Vector<T>>(EndVector (len));
10701080 }
@@ -1173,7 +1183,7 @@ class FlatBufferBuilder {
11731183 // Allocates space for a vector of structures.
11741184 // Must be completed with EndVectorOfStructs().
11751185 template <typename T> T *StartVectorOfStructs (size_t vector_size) {
1176- StartVector (vector_size * sizeof (T) / AlignOf<T>(), AlignOf<T>());
1186+ StartVector (vector_size * sizeof (T) / AlignOf<T>(), sizeof (T), AlignOf<T>());
11771187 return reinterpret_cast <T *>(buf_.make_space (vector_size * sizeof (T)));
11781188 }
11791189
0 commit comments