mirror of
https://github.com/google/flatbuffers.git
synced 2026-07-03 20:04:13 +00:00
Add enum name lookup method to Java/C# enums
Tested: on Linux for Java and C# Bug: 15781151 Change-Id: I7cb97bcc01d986cac2b24aaf7cb29521ddaa2f6b
This commit is contained in:
@@ -73,7 +73,7 @@ LanguageParameters language_parameters[] = {
|
|||||||
"String",
|
"String",
|
||||||
"boolean ",
|
"boolean ",
|
||||||
" {\n",
|
" {\n",
|
||||||
" public static final ",
|
" final ",
|
||||||
" extends ",
|
" extends ",
|
||||||
"package ",
|
"package ",
|
||||||
";",
|
";",
|
||||||
@@ -89,7 +89,7 @@ LanguageParameters language_parameters[] = {
|
|||||||
"string",
|
"string",
|
||||||
"bool ",
|
"bool ",
|
||||||
"\n{\n",
|
"\n{\n",
|
||||||
" public static ",
|
" readonly ",
|
||||||
" : ",
|
" : ",
|
||||||
"namespace ",
|
"namespace ",
|
||||||
"\n{",
|
"\n{",
|
||||||
@@ -164,11 +164,45 @@ static void GenEnum(const LanguageParameters &lang, EnumDef &enum_def,
|
|||||||
++it) {
|
++it) {
|
||||||
auto &ev = **it;
|
auto &ev = **it;
|
||||||
GenComment(ev.doc_comment, code_ptr, " ");
|
GenComment(ev.doc_comment, code_ptr, " ");
|
||||||
|
code += " public static";
|
||||||
code += lang.const_decl;
|
code += lang.const_decl;
|
||||||
code += GenTypeBasic(lang, enum_def.underlying_type);
|
code += GenTypeBasic(lang, enum_def.underlying_type);
|
||||||
code += " " + ev.name + " = ";
|
code += " " + ev.name + " = ";
|
||||||
code += NumToString(ev.value) + ";\n";
|
code += NumToString(ev.value) + ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate a generate string table for enum values.
|
||||||
|
// Problem is, if values are very sparse that could generate really big
|
||||||
|
// tables. Ideally in that case we generate a map lookup instead, but for
|
||||||
|
// the moment we simply don't output a table at all.
|
||||||
|
auto range = enum_def.vals.vec.back()->value -
|
||||||
|
enum_def.vals.vec.front()->value + 1;
|
||||||
|
// Average distance between values above which we consider a table
|
||||||
|
// "too sparse". Change at will.
|
||||||
|
static const int kMaxSparseness = 5;
|
||||||
|
if (range / static_cast<int64_t>(enum_def.vals.vec.size()) < kMaxSparseness) {
|
||||||
|
code += "\n private static";
|
||||||
|
code += lang.const_decl;
|
||||||
|
code += lang.string_type;
|
||||||
|
code += "[] names = { ";
|
||||||
|
auto val = enum_def.vals.vec.front()->value;
|
||||||
|
for (auto it = enum_def.vals.vec.begin();
|
||||||
|
it != enum_def.vals.vec.end();
|
||||||
|
++it) {
|
||||||
|
while (val++ != (*it)->value) code += "\"\", ";
|
||||||
|
code += "\"" + (*it)->name + "\", ";
|
||||||
|
}
|
||||||
|
code += "};\n\n";
|
||||||
|
code += " public static ";
|
||||||
|
code += lang.string_type;
|
||||||
|
code += " " + MakeCamel("name", lang.first_camel_upper);
|
||||||
|
code += "(int e) { return names[e";
|
||||||
|
if (enum_def.vals.vec.front()->value)
|
||||||
|
code += " - " + enum_def.vals.vec.front()->name;
|
||||||
|
code += "]; }\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the class
|
||||||
code += "};\n\n";
|
code += "};\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace FlatBuffers.Test
|
|||||||
{
|
{
|
||||||
CanCreateNewFlatBufferFromScratch();
|
CanCreateNewFlatBufferFromScratch();
|
||||||
CanReadCppGeneratedWireFile();
|
CanReadCppGeneratedWireFile();
|
||||||
|
TestEnums();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CanCreateNewFlatBufferFromScratch()
|
public void CanCreateNewFlatBufferFromScratch()
|
||||||
@@ -141,5 +142,13 @@ namespace FlatBuffers.Test
|
|||||||
var bb = new ByteBuffer(data);
|
var bb = new ByteBuffer(data);
|
||||||
TestBuffer(bb);
|
TestBuffer(bb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void TestEnums()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(Color.Name(Color.Red), "Red");
|
||||||
|
Assert.AreEqual(Color.Name(Color.Blue), "Blue");
|
||||||
|
Assert.AreEqual(Any.Name(Any.NONE), "NONE");
|
||||||
|
Assert.AreEqual(Any.Name(Any.Monster), "Monster");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,9 +106,18 @@ class JavaTest {
|
|||||||
// (see Table.__string).
|
// (see Table.__string).
|
||||||
TestBuffer(fbb.dataBuffer().asReadOnlyBuffer());
|
TestBuffer(fbb.dataBuffer().asReadOnlyBuffer());
|
||||||
|
|
||||||
|
TestEnums();
|
||||||
|
|
||||||
System.out.println("FlatBuffers test: completed successfully");
|
System.out.println("FlatBuffers test: completed successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void TestEnums() {
|
||||||
|
TestEq(Color.name(Color.Red), "Red");
|
||||||
|
TestEq(Color.name(Color.Blue), "Blue");
|
||||||
|
TestEq(Any.name(Any.NONE), "NONE");
|
||||||
|
TestEq(Any.name(Any.Monster), "Monster");
|
||||||
|
}
|
||||||
|
|
||||||
static void TestBuffer(ByteBuffer bb) {
|
static void TestBuffer(ByteBuffer bb) {
|
||||||
TestEq(Monster.MonsterBufferHasIdentifier(bb), true);
|
TestEq(Monster.MonsterBufferHasIdentifier(bb), true);
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,12 @@ namespace MyGame.Example
|
|||||||
|
|
||||||
public class Any
|
public class Any
|
||||||
{
|
{
|
||||||
public static byte NONE = 0;
|
public static readonly byte NONE = 0;
|
||||||
public static byte Monster = 1;
|
public static readonly byte Monster = 1;
|
||||||
|
|
||||||
|
private static readonly string[] names = { "NONE", "Monster", };
|
||||||
|
|
||||||
|
public static string Name(int e) { return names[e]; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
tests/MyGame/Example/Any.java
Executable file → Normal file
4
tests/MyGame/Example/Any.java
Executable file → Normal file
@@ -5,5 +5,9 @@ package MyGame.Example;
|
|||||||
public class Any {
|
public class Any {
|
||||||
public static final byte NONE = 0;
|
public static final byte NONE = 0;
|
||||||
public static final byte Monster = 1;
|
public static final byte Monster = 1;
|
||||||
|
|
||||||
|
private static final String[] names = { "NONE", "Monster", };
|
||||||
|
|
||||||
|
public static String name(int e) { return names[e]; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ namespace MyGame.Example
|
|||||||
|
|
||||||
public class Color
|
public class Color
|
||||||
{
|
{
|
||||||
public static sbyte Red = 1;
|
public static readonly sbyte Red = 1;
|
||||||
public static sbyte Green = 2;
|
public static readonly sbyte Green = 2;
|
||||||
public static sbyte Blue = 8;
|
public static readonly sbyte Blue = 8;
|
||||||
|
|
||||||
|
private static readonly string[] names = { "Red", "Green", "", "", "", "", "", "Blue", };
|
||||||
|
|
||||||
|
public static string Name(int e) { return names[e - Red]; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
tests/MyGame/Example/Color.java
Executable file → Normal file
4
tests/MyGame/Example/Color.java
Executable file → Normal file
@@ -6,5 +6,9 @@ public class Color {
|
|||||||
public static final byte Red = 1;
|
public static final byte Red = 1;
|
||||||
public static final byte Green = 2;
|
public static final byte Green = 2;
|
||||||
public static final byte Blue = 8;
|
public static final byte Blue = 8;
|
||||||
|
|
||||||
|
private static final String[] names = { "Red", "Green", "", "", "", "", "", "Blue", };
|
||||||
|
|
||||||
|
public static String name(int e) { return names[e - Red]; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
0
tests/MyGame/Example/Monster.java
Executable file → Normal file
0
tests/MyGame/Example/Monster.java
Executable file → Normal file
0
tests/MyGame/Example/Test.java
Executable file → Normal file
0
tests/MyGame/Example/Test.java
Executable file → Normal file
0
tests/MyGame/Example/Vec3.java
Executable file → Normal file
0
tests/MyGame/Example/Vec3.java
Executable file → Normal file
Reference in New Issue
Block a user