flat c должен генерировать метод 'Create ...' для таблиц со структурными полями, когда также генерируется объектный API (C#) - PullRequest
0 голосов
/ 17 марта 2020

flat c генерирует stati c метод 'Create ...' только для таблиц без членов структуры, потому что структура должна создаваться inline.

Я думаю, что flat c может генерировать Метод 'Create ...', когда он также генерирует объектный API (--gen-object-api) и использует класс '... T', сгенерированный для базового API объекта (например, Vec3T) в качестве типа параметра. Внутри метода «Create ...» он может затем вызвать метод stati c Pack структуры (например, Vec3), чтобы создать его встроенным. Я попробовал это, и это то, что плоский c затем генерируется для примера TableInFirstNS:

public struct TableInFirstNS : IFlatbufferObject
{
...
  public static Offset<NamespaceA.TableInFirstNS> CreateTableInFirstNS(FlatBufferBuilder builder,
      Offset<NamespaceA.NamespaceB.TableInNestedNS> foo_tableOffset = default(Offset<NamespaceA.NamespaceB.TableInNestedNS>),
      NamespaceA.NamespaceB.EnumInNestedNS foo_enum = NamespaceA.NamespaceB.EnumInNestedNS.A,
      StructInNestedNST foo_struct = null) {
    builder.StartTable(3);
    TableInFirstNS.AddFooStruct(builder, NamespaceA.NamespaceB.StructInNestedNS.Pack(builder, foo_struct));
    TableInFirstNS.AddFooTable(builder, foo_tableOffset);
    TableInFirstNS.AddFooEnum(builder, foo_enum);
    return TableInFirstNS.EndTableInFirstNS(builder);
  }
...
  public static Offset<NamespaceA.TableInFirstNS> Pack(FlatBufferBuilder builder, TableInFirstNST _o) {
    if (_o == null) return default(Offset<NamespaceA.TableInFirstNS>);
    var _foo_table = _o.FooTable == null ? default(Offset<NamespaceA.NamespaceB.TableInNestedNS>) : NamespaceA.NamespaceB.TableInNestedNS.Pack(builder, _o.FooTable);
    return CreateTableInFirstNS(
      builder,
      _foo_table,
      _o.FooEnum,
      _o.FooStruct);
  }
};

, и это сгенерированный код для примера ArrayTable:

public struct ArrayTable : IFlatbufferObject
{
...
  public static Offset<MyGame.Example.ArrayTable> CreateArrayTable(FlatBufferBuilder builder,
      ArrayStructT a = null) {
    builder.StartTable(1);
    ArrayTable.AddA(builder, MyGame.Example.ArrayStruct.Pack(builder, a));
    return ArrayTable.EndArrayTable(builder);
  }
...
  public static Offset<MyGame.Example.ArrayTable> Pack(FlatBufferBuilder builder, ArrayTableT _o) {
    if (_o == null) return default(Offset<MyGame.Example.ArrayTable>);
    return CreateArrayTable(
      builder,
      _o.A);
  }
};

не будет это будет полезным расширением?

...