[Java] Implement optional scalars (#6212)

Java implementation of optional scalars, following issue #6014.
This commit is contained in:
Paulo Pinheiro
2020-10-27 01:46:50 +01:00
committed by GitHub
parent c7586e85aa
commit f9a18ea635
7 changed files with 394 additions and 19 deletions

View File

@@ -264,21 +264,26 @@ class JavaGenerator : public BaseGenerator {
std::string GenDefaultValue(const FieldDef &field) const {
auto &value = field.value;
auto constant = field.IsScalarOptional() ? "0" : value.constant;
auto longSuffix = "L";
switch (value.type.base_type) {
case BASE_TYPE_BOOL: return value.constant == "0" ? "false" : "true";
case BASE_TYPE_BOOL: return constant == "0" ? "false" : "true";
case BASE_TYPE_ULONG: {
// Converts the ulong into its bits signed equivalent
uint64_t defaultValue = StringToUInt(value.constant.c_str());
uint64_t defaultValue = StringToUInt(constant.c_str());
return NumToString(static_cast<int64_t>(defaultValue)) + longSuffix;
}
case BASE_TYPE_UINT:
case BASE_TYPE_LONG: return value.constant + longSuffix;
case BASE_TYPE_LONG: return constant + longSuffix;
default:
if (IsFloat(value.type.base_type))
if (IsFloat(value.type.base_type)) {
if (field.IsScalarOptional()) {
return value.type.base_type == BASE_TYPE_DOUBLE ? "0.0" : "0f";
}
return JavaFloatGen.GenFloatConstant(field);
else
return value.constant;
} else {
return constant;
}
}
}
@@ -672,6 +677,7 @@ class JavaGenerator : public BaseGenerator {
code += "(new " + type_name + "(), j); }\n";
}
if (field.IsScalarOptional()) { code += GenOptionalScalarCheck(field); }
std::string getter = dest_cast + GenGetter(field.value.type);
code += method_start;
std::string default_cast = "";
@@ -1155,6 +1161,13 @@ class JavaGenerator : public BaseGenerator {
code += "\n\n";
}
std::string GenOptionalScalarCheck(FieldDef &field) const {
if (!field.IsScalarOptional()) return "";
return " public boolean has" + MakeCamel(field.name, true) +
"() { return 0 != __offset(" + NumToString(field.value.offset) +
"); }\n";
}
void GenVectorAccessObject(StructDef &struct_def,
std::string *code_ptr) const {
auto &code = *code_ptr;