public override CodeGeneratedMethod CreateParseMethodBody(ParserCodeGenContext context) { if (!context.Options.GreedyDeserialize) { throw new InvalidFlatBufferDefinitionException("Array vectors may only be used with Greedy serializers."); } var(classDef, className) = FlatBufferVectorHelpers.CreateFlatBufferVectorOfUnionSubclass( this.ItemTypeModel, context); FlatSharpInternal.Assert(!string.IsNullOrEmpty(context.TableFieldContextVariableName), "expecting table field context"); string createFlatBufferVector = $@"new {className}<{context.InputBufferTypeName}>( {context.InputBufferVariableName}, {context.OffsetVariableName}.offset0 + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}.offset0), {context.OffsetVariableName}.offset1 + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}.offset1), {context.TableFieldContextVariableName})"; string body = $"return ({createFlatBufferVector}).ToArray();"; return(new CodeGeneratedMethod(body) { ClassDefinition = classDef }); }
public override CodeGeneratedMethod CreateParseMethodBody(ParserCodeGenContext context) { string body; FlatSharpInternal.Assert(this.ItemTypeModel is not null, "Flatsharp internal error: ItemTypeModel null"); if (!context.Options.GreedyDeserialize) { throw new InvalidFlatBufferDefinitionException("Array vectors may only be used with Greedy serializers."); } ValidateWriteThrough( writeThroughSupported: false, this, context.AllFieldContexts, context.Options); (string vectorClassDef, string vectorClassName) = (string.Empty, string.Empty); if (this.ItemTypeModel.ClrType == typeof(byte)) { // can handle this as memory. string method = nameof(InputBufferExtensions.ReadByteReadOnlyMemoryBlock); string memoryVectorRead = $"{context.InputBufferVariableName}.{method}({context.OffsetVariableName})"; body = $"return {memoryVectorRead}.ToArray();"; } else { (vectorClassDef, vectorClassName) = FlatBufferVectorHelpers.CreateFlatBufferVectorSubclass( this.ItemTypeModel, context); FlatSharpInternal.Assert(!string.IsNullOrEmpty(context.TableFieldContextVariableName), "expecting table field context"); string createFlatBufferVector = $@"new {vectorClassName}<{context.InputBufferTypeName}>( {context.InputBufferVariableName}, {context.OffsetVariableName} + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}), {this.PaddedMemberInlineSize}, {context.TableFieldContextVariableName})"; body = $"return ({createFlatBufferVector}).ToArray();"; } return(new CodeGeneratedMethod(body) { ClassDefinition = vectorClassDef }); }
public override CodeGeneratedMethod CreateParseMethodBody(ParserCodeGenContext context) { ValidateWriteThrough( writeThroughSupported: false, this, context.AllFieldContexts, context.Options); string body; string keyTypeName = CSharpHelpers.GetGlobalCompilableTypeName(this.keyTypeModel.ClrType); string valueTypeName = CSharpHelpers.GetGlobalCompilableTypeName(this.valueTypeModel.ClrType); (string vectorClassDef, string vectorClassName) = FlatBufferVectorHelpers.CreateFlatBufferVectorSubclass( this.valueTypeModel, context); FlatSharpInternal.Assert(!string.IsNullOrEmpty(context.TableFieldContextVariableName), "field context was null/empty"); string createFlatBufferVector = $@"new {vectorClassName}<{context.InputBufferTypeName}>( {context.InputBufferVariableName}, {context.OffsetVariableName} + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}), {this.PaddedMemberInlineSize}, {context.TableFieldContextVariableName})"; string mutable = context.Options.GenerateMutableObjects.ToString().ToLowerInvariant(); if (context.Options.GreedyDeserialize) { // Eager indexed vector. body = $@"return new {nameof(IndexedVector<string, string>)}<{keyTypeName}, {valueTypeName}>({createFlatBufferVector}, {mutable});"; } else if (context.Options.Lazy) { // Lazy indexed vector. body = $@"return new {nameof(FlatBufferIndexedVector<string, string, IInputBuffer>)}<{keyTypeName}, {valueTypeName}, {context.InputBufferTypeName}>({createFlatBufferVector});"; } else { FlatSharpInternal.Assert(context.Options.Progressive, "expecting progressive"); body = $@"return new {nameof(FlatBufferProgressiveIndexedVector<string, string, IInputBuffer>)}<{keyTypeName}, {valueTypeName}, {context.InputBufferTypeName}>({createFlatBufferVector});"; } return(new CodeGeneratedMethod(body) { IsMethodInline = true, ClassDefinition = vectorClassDef }); }
public override CodeGeneratedMethod CreateParseMethodBody(ParserCodeGenContext context) { var(classDef, className) = FlatBufferVectorHelpers.CreateFlatBufferVectorOfUnionSubclass( this.ItemTypeModel, context); string createFlatBufferVector = $@"new {className}<{context.InputBufferTypeName}>( {context.InputBufferVariableName}, {context.OffsetVariableName}.offset0 + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}.offset0), {context.OffsetVariableName}.offset1 + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}.offset1), {context.TableFieldContextVariableName})"; return(new CodeGeneratedMethod(ListVectorTypeModel.CreateParseBody( this.ItemTypeModel, createFlatBufferVector, context)) { ClassDefinition = classDef }); }
public override CodeGeneratedMethod CreateParseMethodBody(ParserCodeGenContext context) { ValidateWriteThrough( writeThroughSupported: !this.isReadOnly, this, context.AllFieldContexts, context.Options); (string vectorClassDef, string vectorClassName) = FlatBufferVectorHelpers.CreateFlatBufferVectorSubclass( this.ItemTypeModel, context); string createFlatBufferVector = $@"new {vectorClassName}<{context.InputBufferTypeName}>( {context.InputBufferVariableName}, {context.OffsetVariableName} + {context.InputBufferVariableName}.{nameof(InputBufferExtensions.ReadUOffset)}({context.OffsetVariableName}), {this.PaddedMemberInlineSize}, {context.TableFieldContextVariableName})"; return(new CodeGeneratedMethod(CreateParseBody(this.ItemTypeModel, createFlatBufferVector, context)) { ClassDefinition = vectorClassDef }); }