[C#] support Object API (#5710)

* [C#] support Object API

* fix sign-compare

* fix indent

* add new line before for loop.

* using auto whenever possible

* reduce the amout of blank lines.

* wip: support vectors of union

* done: support unions of vectors

* set C# version to 4.0
* remove null propagation operator
* remove auto property initializer
* remove expression-bodied method
* remove pattern matching

* add Example2 to NetTest.sh

* separate JavaUsage.md and CsharpUsage.md from JavaCsharpUsage.md

* add C# Object based API notes.

* support vs2010.

* remove range based for loop.

* remove System.Linq

* fix indent

* CreateSharedString to CreateString

* check shared attribute

* snake case
This commit is contained in:
mugisoba
2020-01-31 03:18:28 +09:00
committed by GitHub
parent c580fa284c
commit 7418d85872
36 changed files with 2548 additions and 107 deletions

View File

@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Attacker : IFlatbufferObject
@@ -31,5 +32,28 @@ public struct Attacker : IFlatbufferObject
int o = builder.EndTable();
return new Offset<Attacker>(o);
}
public AttackerT UnPack() {
var _o = new AttackerT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(AttackerT _o) {
_o.SwordAttackDamage = this.SwordAttackDamage;
}
public static Offset<Attacker> Pack(FlatBufferBuilder builder, AttackerT _o) {
if (_o == null) return default(Offset<Attacker>);
return CreateAttacker(
builder,
_o.SwordAttackDamage);
}
};
public class AttackerT
{
public int SwordAttackDamage { get; set; }
public AttackerT() {
this.SwordAttackDamage = 0;
}
}

View File

@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
public struct BookReader : IFlatbufferObject
@@ -20,5 +21,28 @@ public struct BookReader : IFlatbufferObject
builder.PutInt(BooksRead);
return new Offset<BookReader>(builder.Offset);
}
public BookReaderT UnPack() {
var _o = new BookReaderT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(BookReaderT _o) {
_o.BooksRead = this.BooksRead;
}
public static Offset<BookReader> Pack(FlatBufferBuilder builder, BookReaderT _o) {
if (_o == null) return default(Offset<BookReader>);
return CreateBookReader(
builder,
_o.BooksRead);
}
};
public class BookReaderT
{
public int BooksRead { get; set; }
public BookReaderT() {
this.BooksRead = 0;
}
}

View File

@@ -13,3 +13,33 @@ public enum Character : byte
Unused = 6,
};
public class CharacterUnion {
public Character Type { get; set; }
public object Value { get; set; }
public CharacterUnion() {
this.Type = Character.NONE;
this.Value = null;
}
public T As<T>() where T : class { return this.Value as T; }
public AttackerT AsMuLan() { return this.As<AttackerT>(); }
public RapunzelT AsRapunzel() { return this.As<RapunzelT>(); }
public BookReaderT AsBelle() { return this.As<BookReaderT>(); }
public BookReaderT AsBookFan() { return this.As<BookReaderT>(); }
public string AsOther() { return this.As<string>(); }
public string AsUnused() { return this.As<string>(); }
public static int Pack(FlatBuffers.FlatBufferBuilder builder, CharacterUnion _o) {
switch (_o.Type) {
default: return 0;
case Character.MuLan: return Attacker.Pack(builder, _o.AsMuLan()).Value;
case Character.Rapunzel: return Rapunzel.Pack(builder, _o.AsRapunzel()).Value;
case Character.Belle: return BookReader.Pack(builder, _o.AsBelle()).Value;
case Character.BookFan: return BookReader.Pack(builder, _o.AsBookFan()).Value;
case Character.Other: return builder.CreateString(_o.AsOther()).Value;
case Character.Unused: return builder.CreateString(_o.AsUnused()).Value;
}
}
}

View File

@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Movie : IFlatbufferObject
@@ -18,6 +19,7 @@ public struct Movie : IFlatbufferObject
public Character MainCharacterType { get { int o = __p.__offset(4); return o != 0 ? (Character)__p.bb.Get(o + __p.bb_pos) : Character.NONE; } }
public TTable? MainCharacter<TTable>() where TTable : struct, IFlatbufferObject { int o = __p.__offset(6); return o != 0 ? (TTable?)__p.__union<TTable>(o + __p.bb_pos) : null; }
public string MainCharacterAsString() { int o = __p.__offset(6); return o != 0 ? __p.__string(o + __p.bb_pos) : null; }
public Character CharactersType(int j) { int o = __p.__offset(8); return o != 0 ? (Character)__p.bb.Get(__p.__vector(o) + j * 1) : (Character)0; }
public int CharactersTypeLength { get { int o = __p.__offset(8); return o != 0 ? __p.__vector_len(o) : 0; } }
#if ENABLE_SPAN_T
@@ -27,6 +29,7 @@ public struct Movie : IFlatbufferObject
#endif
public Character[] GetCharactersTypeArray() { int o = __p.__offset(8); if (o == 0) return null; int p = __p.__vector(o); int l = __p.__vector_len(o); Character[] a = new Character[l]; for (int i = 0; i < l; i++) { a[i] = (Character)__p.bb.Get(p + i * 1); } return a; }
public TTable? Characters<TTable>(int j) where TTable : struct, IFlatbufferObject { int o = __p.__offset(10); return o != 0 ? (TTable?)__p.__union<TTable>(__p.__vector(o) + j * 4) : null; }
public string CharactersAsString(int j) { int o = __p.__offset(10); return o != 0 ? __p.__string(__p.__vector(o) + j * 4) : null; }
public int CharactersLength { get { int o = __p.__offset(10); return o != 0 ? __p.__vector_len(o) : 0; } }
public static Offset<Movie> CreateMovie(FlatBufferBuilder builder,
@@ -59,5 +62,96 @@ public struct Movie : IFlatbufferObject
}
public static void FinishMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.Finish(offset.Value, "MOVI"); }
public static void FinishSizePrefixedMovieBuffer(FlatBufferBuilder builder, Offset<Movie> offset) { builder.FinishSizePrefixed(offset.Value, "MOVI"); }
public MovieT UnPack() {
var _o = new MovieT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(MovieT _o) {
_o.MainCharacter = new CharacterUnion();
_o.MainCharacter.Type = this.MainCharacterType;
switch (this.MainCharacterType) {
default: break;
case Character.MuLan:
_o.MainCharacter.Value = this.MainCharacter<Attacker>().HasValue ? this.MainCharacter<Attacker>().Value.UnPack() : null;
break;
case Character.Rapunzel:
_o.MainCharacter.Value = this.MainCharacter<Rapunzel>().HasValue ? this.MainCharacter<Rapunzel>().Value.UnPack() : null;
break;
case Character.Belle:
_o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;
break;
case Character.BookFan:
_o.MainCharacter.Value = this.MainCharacter<BookReader>().HasValue ? this.MainCharacter<BookReader>().Value.UnPack() : null;
break;
case Character.Other:
_o.MainCharacter.Value = this.MainCharacterAsString();
break;
case Character.Unused:
_o.MainCharacter.Value = this.MainCharacterAsString();
break;
}
_o.Characters = new List<CharacterUnion>();
for (var _j = 0; _j < this.CharactersLength; ++_j) {
var _o_Characters = new CharacterUnion();
_o_Characters.Type = this.CharactersType(_j);
switch (this.CharactersType(_j)) {
default: break;
case Character.MuLan:
_o_Characters.Value = this.Characters<Attacker>(_j).HasValue ? this.Characters<Attacker>(_j).Value.UnPack() : null;
break;
case Character.Rapunzel:
_o_Characters.Value = this.Characters<Rapunzel>(_j).HasValue ? this.Characters<Rapunzel>(_j).Value.UnPack() : null;
break;
case Character.Belle:
_o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;
break;
case Character.BookFan:
_o_Characters.Value = this.Characters<BookReader>(_j).HasValue ? this.Characters<BookReader>(_j).Value.UnPack() : null;
break;
case Character.Other:
_o_Characters.Value = this.CharactersAsString(_j);
break;
case Character.Unused:
_o_Characters.Value = this.CharactersAsString(_j);
break;
}
_o.Characters.Add(_o_Characters);
}
}
public static Offset<Movie> Pack(FlatBufferBuilder builder, MovieT _o) {
if (_o == null) return default(Offset<Movie>);
var _main_character_type = _o.MainCharacter == null ? Character.NONE : _o.MainCharacter.Type;
var _main_character = _o.MainCharacter == null ? 0 : CharacterUnion.Pack(builder, _o.MainCharacter);
var _characters_type = default(VectorOffset);
if (_o.Characters != null) {
var __characters_type = new Character[_o.Characters.Count];
for (var _j = 0; _j < __characters_type.Length; ++_j) { __characters_type[_j] = _o.Characters[_j].Type; }
_characters_type = CreateCharactersTypeVector(builder, __characters_type);
}
var _characters = default(VectorOffset);
if (_o.Characters != null) {
var __characters = new int[_o.Characters.Count];
for (var _j = 0; _j < __characters.Length; ++_j) { __characters[_j] = CharacterUnion.Pack(builder, _o.Characters[_j]); }
_characters = CreateCharactersVector(builder, __characters);
}
return CreateMovie(
builder,
_main_character_type,
_main_character,
_characters_type,
_characters);
}
};
public class MovieT
{
public CharacterUnion MainCharacter { get; set; }
public List<CharacterUnion> Characters { get; set; }
public MovieT() {
this.MainCharacter = null;
this.Characters = null;
}
}

View File

@@ -3,6 +3,7 @@
// </auto-generated>
using global::System;
using global::System.Collections.Generic;
using global::FlatBuffers;
public struct Rapunzel : IFlatbufferObject
@@ -20,5 +21,28 @@ public struct Rapunzel : IFlatbufferObject
builder.PutInt(HairLength);
return new Offset<Rapunzel>(builder.Offset);
}
public RapunzelT UnPack() {
var _o = new RapunzelT();
this.UnPackTo(_o);
return _o;
}
public void UnPackTo(RapunzelT _o) {
_o.HairLength = this.HairLength;
}
public static Offset<Rapunzel> Pack(FlatBufferBuilder builder, RapunzelT _o) {
if (_o == null) return default(Offset<Rapunzel>);
return CreateRapunzel(
builder,
_o.HairLength);
}
};
public class RapunzelT
{
public int HairLength { get; set; }
public RapunzelT() {
this.HairLength = 0;
}
}