Exemplo n.º 1
0
    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
        });
    }
Exemplo n.º 3
0
    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
        });
    }