mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-30 19:10:00 +00:00
flatbuffer_builder: Prevent Finish() from being called twice
This commit is contained in:
@@ -221,21 +221,13 @@ template<bool Is64Aware = false> class FlatBufferBuilderImpl {
|
|||||||
/// @return Returns a `uint8_t` pointer to the unfinished buffer.
|
/// @return Returns a `uint8_t` pointer to the unfinished buffer.
|
||||||
uint8_t *GetCurrentBufferPointer() const { return buf_.data(); }
|
uint8_t *GetCurrentBufferPointer() const { return buf_.data(); }
|
||||||
|
|
||||||
/// @brief Get the released pointer to the serialized buffer.
|
|
||||||
/// @warning Do NOT attempt to use this FlatBufferBuilder afterwards!
|
|
||||||
/// @return A `FlatBuffer` that owns the buffer and its allocator and
|
|
||||||
/// behaves similar to a `unique_ptr` with a deleter.
|
|
||||||
FLATBUFFERS_ATTRIBUTE([[deprecated("use Release() instead")]])
|
|
||||||
DetachedBuffer ReleaseBufferPointer() {
|
|
||||||
Finished();
|
|
||||||
return buf_.release();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Get the released DetachedBuffer.
|
/// @brief Get the released DetachedBuffer.
|
||||||
/// @return A `DetachedBuffer` that owns the buffer and its allocator.
|
/// @return A `DetachedBuffer` that owns the buffer and its allocator.
|
||||||
DetachedBuffer Release() {
|
DetachedBuffer Release() {
|
||||||
Finished();
|
Finished();
|
||||||
return buf_.release();
|
DetachedBuffer buffer = buf_.release();
|
||||||
|
Clear();
|
||||||
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Get the released pointer to the serialized buffer.
|
/// @brief Get the released pointer to the serialized buffer.
|
||||||
@@ -246,10 +238,12 @@ template<bool Is64Aware = false> class FlatBufferBuilderImpl {
|
|||||||
/// @return A raw pointer to the start of the memory block containing
|
/// @return A raw pointer to the start of the memory block containing
|
||||||
/// the serialized `FlatBuffer`.
|
/// the serialized `FlatBuffer`.
|
||||||
/// @remark If the allocator is owned, it gets deleted when the destructor is
|
/// @remark If the allocator is owned, it gets deleted when the destructor is
|
||||||
/// called..
|
/// called.
|
||||||
uint8_t *ReleaseRaw(size_t &size, size_t &offset) {
|
uint8_t *ReleaseRaw(size_t &size, size_t &offset) {
|
||||||
Finished();
|
Finished();
|
||||||
return buf_.release_raw(size, offset);
|
uint8_t* raw = buf_.release_raw(size, offset);
|
||||||
|
Clear();
|
||||||
|
return raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief get the minimum alignment this buffer needs to be accessed
|
/// @brief get the minimum alignment this buffer needs to be accessed
|
||||||
@@ -1261,6 +1255,9 @@ template<bool Is64Aware = false> class FlatBufferBuilderImpl {
|
|||||||
FlatBufferBuilderImpl &operator=(const FlatBufferBuilderImpl &);
|
FlatBufferBuilderImpl &operator=(const FlatBufferBuilderImpl &);
|
||||||
|
|
||||||
void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) {
|
void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) {
|
||||||
|
// A buffer can only be finished once. To reuse a builder use `clear()`.
|
||||||
|
FLATBUFFERS_ASSERT(!finished);
|
||||||
|
|
||||||
NotNested();
|
NotNested();
|
||||||
buf_.clear_scratch();
|
buf_.clear_scratch();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user