Commit 0b379211 authored by Raman's avatar Raman Committed by Wouter van Oortmerssen

Fixed problem with uint keys (#4172)

* Fixed problem with uint keys

* removed excess check

* Resolved problem with big uint, ubyte keys in Java
parent bb223da2
...@@ -587,6 +587,22 @@ std::string GenGetter(const Type &type) { ...@@ -587,6 +587,22 @@ std::string GenGetter(const Type &type) {
} }
} }
// Returns the function name that is able to read a value of the given type.
std::string GenGetterForLookupByKey(flatbuffers::FieldDef *key_field,
const std::string &data_buffer,
const char *num = nullptr) {
auto type = key_field->value.type;
auto dest_mask = DestinationMask(type, true);
auto dest_cast = DestinationCast(type);
auto getter = data_buffer + "." + FunctionStart('G') + "et";
if (GenTypeBasic(type, false) != "byte") {
getter += MakeCamel(GenTypeBasic(type, false));
}
getter = dest_cast + getter + "(" + GenOffsetGetter(key_field, num) + ")"
+ dest_mask;
return getter;
}
// Direct mutation is only allowed for scalar fields. // Direct mutation is only allowed for scalar fields.
// Hence a setter method will only be generated for such fields. // Hence a setter method will only be generated for such fields.
std::string GenSetter(const Type &type) { std::string GenSetter(const Type &type) {
...@@ -699,12 +715,11 @@ std::string GenLookupKeyGetter(flatbuffers::FieldDef *key_field) { ...@@ -699,12 +715,11 @@ std::string GenLookupKeyGetter(flatbuffers::FieldDef *key_field) {
key_getter += GenOffsetGetter(key_field); key_getter += GenOffsetGetter(key_field);
key_getter += ", byteKey, bb);\n"; key_getter += ", byteKey, bb);\n";
} else { } else {
auto get_val = GenGetter(key_field->value.type) + auto get_val = GenGetterForLookupByKey(key_field, "bb");
"(" + GenOffsetGetter(key_field) + ")";
if (lang_.language == IDLOptions::kCSharp) { if (lang_.language == IDLOptions::kCSharp) {
key_getter += "int comp = " + get_val + ".CompareTo(key);\n"; key_getter += "int comp = " + get_val + ".CompareTo(key);\n";
} else { } else {
key_getter += GenTypeGet(key_field->value.type) + " val = "; key_getter += GenTypeNameDest(key_field->value.type) + " val = ";
key_getter += get_val + ";\n"; key_getter += get_val + ";\n";
key_getter += " int comp = val > key ? 1 : val < key ? -1 : 0;\n"; key_getter += " int comp = val > key ? 1 : val < key ? -1 : 0;\n";
} }
...@@ -728,20 +743,17 @@ std::string GenKeyGetter(flatbuffers::FieldDef *key_field) { ...@@ -728,20 +743,17 @@ std::string GenKeyGetter(flatbuffers::FieldDef *key_field) {
key_getter += ";"; key_getter += ";";
} }
else { else {
auto field_getter = data_buffer + GenGetter(key_field->value.type).substr(2) + auto field_getter = GenGetterForLookupByKey(key_field, data_buffer, "o1");
"(" + GenOffsetGetter(key_field, "o1") + ")";
if (lang_.language == IDLOptions::kCSharp) { if (lang_.language == IDLOptions::kCSharp) {
key_getter += field_getter; key_getter += field_getter;
field_getter = data_buffer + GenGetter(key_field->value.type).substr(2) + field_getter = GenGetterForLookupByKey(key_field, data_buffer, "o2");
"(" + GenOffsetGetter(key_field, "o2") + ")";
key_getter += ".CompareTo(" + field_getter + ")"; key_getter += ".CompareTo(" + field_getter + ")";
} }
else { else {
key_getter += "\n " + GenTypeGet(key_field->value.type) + " val_1 = "; key_getter += "\n " + GenTypeNameDest(key_field->value.type) + " val_1 = ";
key_getter += field_getter + ";\n " + GenTypeGet(key_field->value.type); key_getter += field_getter + ";\n " + GenTypeNameDest(key_field->value.type);
key_getter += " val_2 = "; key_getter += " val_2 = ";
field_getter = data_buffer + GenGetter(key_field->value.type).substr(2) + field_getter = GenGetterForLookupByKey(key_field, data_buffer, "o2");
"(" + GenOffsetGetter(key_field, "o2") + ")";
key_getter += field_getter + ";\n"; key_getter += field_getter + ";\n";
key_getter += " return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n "; key_getter += " return val_1 > val_2 ? 1 : val_1 < val_2 ? -1 : 0;\n ";
} }
...@@ -1299,7 +1311,7 @@ void GenStruct(StructDef &struct_def, std::string *code_ptr) { ...@@ -1299,7 +1311,7 @@ void GenStruct(StructDef &struct_def, std::string *code_ptr) {
code += "\n public static " + struct_def.name + lang_.optional_suffix; code += "\n public static " + struct_def.name + lang_.optional_suffix;
code += " " + FunctionStart('L') + "ookupByKey(" + GenVectorOffsetType(); code += " " + FunctionStart('L') + "ookupByKey(" + GenVectorOffsetType();
code += " vectorOffset, " + GenTypeGet(key_field->value.type); code += " vectorOffset, " + GenTypeNameDest(key_field->value.type);
code += " key, ByteBuffer bb) {\n"; code += " key, ByteBuffer bb) {\n";
if (key_field->value.type.base_type == BASE_TYPE_STRING) { if (key_field->value.type.base_type == BASE_TYPE_STRING) {
code += " byte[] byteKey = "; code += " byte[] byteKey = ";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment