Add overloads for C# ByteBuffer/FlatBufferBuilder to allow adding vector blocks from ArraySegments or IntPtr (#7193)

* Add overloads to Add/Put for ArraySegment and IntPtr

In order to allow using code to reduce memory allocations, add overloads to ByteBuffer's and FlatBuffersBuilder's Put/Add methods that take ArraySegment<T> or IntPtr respectively.
Also, adaptions to the c# code generator in flatc to emit corresponding CreateVectorBlock() overloads

* Add missing files generated with generate_code.py

The previous commit changed the C# code generate, but didn't contain the updated generated test files.

* Incorporate review findings

(1) Adhere to 80 characters limit.
(2) In FlatBufferBuilder.Add(IntPtr,int), move zero length check topmost and add sanity check against negative input
This commit is contained in:
Jamie-Jameson
2022-04-01 22:35:07 +02:00
committed by GitHub
parent 26c3b3adab
commit c9651b7420
11 changed files with 536 additions and 14 deletions

View File

@@ -1240,6 +1240,7 @@ class CSharpGenerator : public BaseGenerator {
code += "); return ";
code += "builder.EndVector(); }\n";
// add Create...VectorBlock() overloads for T[], ArraySegment<T> and IntPtr
code += " public static VectorOffset ";
code += "Create";
code += Name(field);
@@ -1250,6 +1251,25 @@ class CSharpGenerator : public BaseGenerator {
code += ", data.Length, ";
code += NumToString(alignment);
code += "); builder.Add(data); return builder.EndVector(); }\n";
code += " public static VectorOffset ";
code += "Create";
code += Name(field);
code += "VectorBlock(FlatBufferBuilder builder, ";
code += "ArraySegment<" + GenTypeBasic(vector_type) + "> data) ";
code += "{ builder.StartVector(";
code += NumToString(elem_size);
code += ", data.Count, ";
code += NumToString(alignment);
code += "); builder.Add(data); return builder.EndVector(); }\n";
code += " public static VectorOffset ";
code += "Create";
code += Name(field);
code += "VectorBlock(FlatBufferBuilder builder, ";
code += "IntPtr dataPtr, int sizeInBytes) ";
code += "{ builder.StartVector(1, sizeInBytes, 1); ";
code += "builder.Add<" + GenTypeBasic(vector_type) + ">(dataPtr, sizeInBytes); return builder.EndVector(); }\n";
}
// Generate a method to start a vector, data to be added manually
// after.