Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
flatbuffers
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
flatbuffers
Commits
8fdced4e
Commit
8fdced4e
authored
Aug 14, 2016
by
TGIshib
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update
parent
9031597f
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
183 additions
and
98 deletions
+183
-98
FlatBufferBuilder.java
java/com/google/flatbuffers/FlatBufferBuilder.java
+5
-13
Table.java
java/com/google/flatbuffers/Table.java
+55
-10
Table.cs
net/FlatBuffers/Table.cs
+30
-10
idl_gen_general.cpp
src/idl_gen_general.cpp
+87
-44
JavaTest.java
tests/JavaTest.java
+1
-1
Monster.cs
tests/MyGame/Example/Monster.cs
+2
-7
Monster.java
tests/MyGame/Example/Monster.java
+3
-13
No files found.
java/com/google/flatbuffers/FlatBufferBuilder.java
View file @
8fdced4e
...
...
@@ -375,7 +375,7 @@ public class FlatBufferBuilder {
*/
public
int
createVectorOfTables
(
int
[]
offsets
)
{
notNested
();
startVector
(
4
,
offsets
.
length
,
4
);
startVector
(
Constants
.
SIZEOF_INT
,
offsets
.
length
,
Constants
.
SIZEOF_INT
);
for
(
int
i
=
offsets
.
length
-
1
;
i
>=
0
;
i
--)
addOffset
(
offsets
[
i
]);
return
endVector
();
}
...
...
@@ -383,21 +383,13 @@ public class FlatBufferBuilder {
/**
* Create a vector of sorted by the key tables.
*
* @param
type Type of the table
s.
* @param
obj Instance of the table clas
s.
* @param offsets Offsets of the tables.
* @return Returns offset of the sorted vector.
*/
public
<
T
>
int
createSortedTableVector
(
Class
<
T
>
type
,
int
[]
offsets
)
{
try
{
return
(
int
)
type
.
getMethod
(
"createMySortedTableVector"
,
FlatBufferBuilder
.
class
,
ByteBuffer
.
class
,
int
[].
class
).
invoke
(
null
,
this
,
bb
,
offsets
);
}
catch
(
NoSuchMethodException
e
)
{
e
.
printStackTrace
();
}
catch
(
SecurityException
e
)
{
e
.
printStackTrace
();
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
return
0
;
public
<
T
extends
Table
>
int
createSortedTableVector
(
T
obj
,
int
[]
offsets
)
{
obj
.
sortTables
(
offsets
,
bb
);
return
createVectorOfTables
(
offsets
);
}
/**
...
...
java/com/google/flatbuffers/Table.java
View file @
8fdced4e
...
...
@@ -56,11 +56,14 @@ public class Table {
* @param vtable_offset An `int` offset to the vtable in the Table's ByteBuffer.
* @return Returns an offset into the object, or `0` if the field is not present.
*/
protected
int
__offset
(
int
vtable_offset
)
{
return
__offset
(
vtable_offset
,
bb_pos
-
bb
.
getInt
(
bb_pos
),
bb
,
false
);
}
protected
int
__offset
(
int
vtable_offset
)
{
int
vtable
=
bb_pos
-
bb
.
getInt
(
bb_pos
);
return
vtable_offset
<
bb
.
getShort
(
vtable
)
?
bb
.
getShort
(
vtable
+
vtable_offset
)
:
0
;
}
protected
static
int
__offset
(
int
vtable_offset
,
int
vtable
,
ByteBuffer
_bb
,
boolean
invoked_static
)
{
i
f
(!
invoked_static
)
return
vtable_offset
<
_bb
.
getShort
(
vtable
)
?
_bb
.
getShort
(
vtable
+
vtable_offset
)
:
0
;
else
return
_bb
.
getShort
(
vtable
+
vtable_offset
-
_
bb
.
getInt
(
vtable
))
+
vtable
;
protected
static
int
__offset
(
int
vtable_offset
,
int
offset
,
ByteBuffer
bb
)
{
i
nt
vtable
=
bb
.
array
().
length
-
offset
;
return
bb
.
getShort
(
vtable
+
vtable_offset
-
bb
.
getInt
(
vtable
))
+
vtable
;
}
/**
...
...
@@ -85,15 +88,11 @@ public class Table {
* @return Returns a `String` from the data stored inside the FlatBuffer at `offset`.
*/
protected
String
__string
(
int
offset
)
{
return
__string
(
offset
,
bb
);
}
protected
static
String
__string
(
int
offset
,
ByteBuffer
_bb
)
{
CharsetDecoder
decoder
=
UTF8_DECODER
.
get
();
decoder
.
reset
();
offset
+=
_
bb
.
getInt
(
offset
);
ByteBuffer
src
=
_
bb
.
duplicate
().
order
(
ByteOrder
.
LITTLE_ENDIAN
);
offset
+=
bb
.
getInt
(
offset
);
ByteBuffer
src
=
bb
.
duplicate
().
order
(
ByteOrder
.
LITTLE_ENDIAN
);
int
length
=
src
.
getInt
(
offset
);
src
.
position
(
offset
+
SIZEOF_INT
);
src
.
limit
(
offset
+
SIZEOF_INT
+
length
);
...
...
@@ -194,6 +193,52 @@ public class Table {
}
return
true
;
}
/**
* Sort tables by the key.
*
* @param offsets An 'int' indexes of the tables into the _bb.
* @param bb A {@code ByteBuffer} to get the tables.
*/
protected
void
sortTables
(
int
[]
offsets
,
ByteBuffer
bb
)
{
Integer
[]
off
=
new
Integer
[
offsets
.
length
];
for
(
int
i
=
0
;
i
<
offsets
.
length
;
i
++)
off
[
i
]
=
offsets
[
i
];
Arrays
.
sort
(
off
,
(
Integer
o1
,
Integer
o2
)
->
keysCompare
(
o1
,
o2
,
bb
));
for
(
int
i
=
0
;
i
<
offsets
.
length
;
i
++)
offsets
[
i
]
=
off
[
i
];
}
/**
* Compare two tables by the key.
*
* @param o1 An 'Integer' index of the first key into the _bb.
* @param o2 An 'Integer' index of the second key into the _bb.
* @param bb A {@code ByteBuffer} to get the keys.
*/
protected
int
keysCompare
(
Integer
o1
,
Integer
o2
,
ByteBuffer
bb
)
{
return
0
;
}
/**
* Compare two strings in the buffer.
*
* @param offset_1 An 'int' index of the first string into the bb.
* @param offset_2 An 'int' index of the second string into the bb.
* @param bb A {@code ByteBuffer} to get the strings.
*/
protected
static
int
compareStrings
(
int
offset_1
,
int
offset_2
,
ByteBuffer
bb
)
{
offset_1
+=
bb
.
getInt
(
offset_1
);
offset_2
+=
bb
.
getInt
(
offset_2
);
int
len_1
=
bb
.
getInt
(
offset_1
);
int
len_2
=
bb
.
getInt
(
offset_2
);
int
startPos_1
=
offset_1
+
SIZEOF_INT
;
int
startPos_2
=
offset_2
+
SIZEOF_INT
;
int
len
=
Math
.
min
(
len_1
,
len_2
);
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
if
(
bb
.
array
()[
i
+
startPos_1
]
!=
bb
.
array
()[
i
+
startPos_2
])
return
bb
.
array
()[
i
+
startPos_1
]
-
bb
.
array
()[
i
+
startPos_2
];
}
if
(
len_1
<
len_2
)
return
-
1
;
if
(
len_1
>
len_2
)
return
1
;
return
0
;
}
}
/// @endcond
net/FlatBuffers/Table.cs
View file @
8fdced4e
...
...
@@ -31,12 +31,16 @@ namespace FlatBuffers
// Look up a field in the vtable, return an offset into the object, or 0 if the field is not
// present.
protected
int
__offset
(
int
vtableOffset
)
{
return
__offset
(
vtableOffset
,
bb_pos
-
bb
.
GetInt
(
bb_pos
),
bb
,
false
);
}
protected
int
__offset
(
int
vtableOffset
)
{
int
vtable
=
bb_pos
-
bb
.
GetInt
(
bb_pos
);
return
vtableOffset
<
bb
.
GetShort
(
vtable
)
?
(
int
)
bb
.
GetShort
(
vtable
+
vtableOffset
)
:
0
;
}
protected
static
int
__offset
(
int
vtableOffset
,
int
vtable
,
ByteBuffer
_bb
,
bool
invoked_static
)
protected
static
int
__offset
(
int
vtableOffset
,
int
offset
,
ByteBuffer
bb
)
{
i
f
(!
invoked_static
)
return
vtableOffset
<
_bb
.
GetShort
(
vtable
)
?
(
int
)
_bb
.
GetShort
(
vtable
+
vtableOffset
)
:
0
;
else
return
(
int
)
_bb
.
GetShort
(
vtable
+
vtableOffset
-
_
bb
.
GetInt
(
vtable
))
+
vtable
;
i
nt
vtable
=
bb
.
Length
-
offset
;
return
(
int
)
bb
.
GetShort
(
vtable
+
vtableOffset
-
bb
.
GetInt
(
vtable
))
+
vtable
;
}
// Retrieve the relative offset stored at "offset"
...
...
@@ -46,14 +50,12 @@ namespace FlatBuffers
}
// Create a .NET String from UTF-8 data stored inside the flatbuffer.
protected
string
__string
(
int
offset
)
{
return
__string
(
offset
,
bb
);
}
protected
static
string
__string
(
int
offset
,
ByteBuffer
_bb
)
protected
string
__string
(
int
offset
)
{
offset
+=
_
bb
.
GetInt
(
offset
);
var
len
=
_
bb
.
GetInt
(
offset
);
offset
+=
bb
.
GetInt
(
offset
);
var
len
=
bb
.
GetInt
(
offset
);
var
startPos
=
offset
+
sizeof
(
int
);
return
Encoding
.
UTF8
.
GetString
(
_bb
.
Data
,
startPos
,
len
);
return
Encoding
.
UTF8
.
GetString
(
bb
.
Data
,
startPos
,
len
);
}
// Get the length of a vector whose offset is stored at "offset" in this object.
...
...
@@ -108,6 +110,24 @@ namespace FlatBuffers
return
true
;
}
// Compare strings in the ByteBuffer.
protected
static
int
CompareStrings
(
int
offset_1
,
int
offset_2
,
ByteBuffer
bb
)
{
offset_1
+=
bb
.
GetInt
(
offset_1
);
offset_2
+=
bb
.
GetInt
(
offset_2
);
var
len_1
=
bb
.
GetInt
(
offset_1
);
var
len_2
=
bb
.
GetInt
(
offset_2
);
var
startPos_1
=
offset_1
+
sizeof
(
int
);
var
startPos_2
=
offset_2
+
sizeof
(
int
);
var
len
=
Math
.
Min
(
len_1
,
len_2
);
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
if
(
bb
.
Data
[
i
+
startPos_1
]
!=
bb
.
Data
[
i
+
startPos_2
])
return
bb
.
Data
[
i
+
startPos_1
]
-
bb
.
Data
[
i
+
startPos_2
];
}
if
(
len_1
<
len_2
)
return
-
1
;
if
(
len_1
>
len_2
)
return
1
;
return
0
;
}
}
}
src/idl_gen_general.cpp
View file @
8fdced4e
...
...
@@ -669,6 +669,60 @@ void GenStructBody(const StructDef &struct_def, std::string *code_ptr, const cha
}
}
void
IncChar
(
std
::
string
&
str
)
{
static
int
index
=
-
1
,
num
=
1
;
if
(
index
<
0
)
{
for
(
size_t
i
=
0
;
i
<
str
.
length
();
i
++
)
{
if
(
str
[
i
]
==
'!'
)
{
index
=
i
;
break
;
}
}
}
str
[
index
]
=
(
char
)(
num
+
'0'
);
num
++
;
}
std
::
string
GenKeyGetter
(
flatbuffers
::
FieldDef
*
key_field
)
{
auto
data_buffer
=
(
lang_
.
language
==
IDLOptions
::
kCSharp
)
?
"builder.DataBuffer"
:
"_bb"
;
auto
get_offset
=
"__offset("
+
NumToString
(
key_field
->
value
.
offset
)
+
", o!"
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
".Value"
:
""
)
+
", "
+
data_buffer
+
")"
;
std
::
string
key_getter
=
""
;
if
(
key_field
->
value
.
type
.
base_type
==
BASE_TYPE_STRING
)
{
if
(
lang_
.
language
==
IDLOptions
::
kJava
)
key_getter
+=
" return "
;
key_getter
+=
FunctionStart
(
'C'
)
+
"ompareStrings("
;
IncChar
(
get_offset
);
key_getter
+=
get_offset
+
", "
;
IncChar
(
get_offset
);
key_getter
+=
get_offset
+
", "
+
data_buffer
+
")"
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
)
key_getter
+=
";"
;
}
else
{
auto
field_getter
=
data_buffer
+
GenGetter
(
key_field
->
value
.
type
).
substr
(
2
)
+
"("
+
get_offset
+
")"
;
IncChar
(
field_getter
);
if
(
lang_
.
language
==
IDLOptions
::
kCSharp
)
{
key_getter
+=
field_getter
;
IncChar
(
field_getter
);
key_getter
+=
".CompareTo("
+
field_getter
+
")"
;
}
else
{
key_getter
+=
"
\n
"
+
GenTypeGet
(
key_field
->
value
.
type
)
+
" off1 = "
;
key_getter
+=
field_getter
+
";
\n
"
+
GenTypeGet
(
key_field
->
value
.
type
);
key_getter
+=
" off2 = "
;
IncChar
(
field_getter
);
key_getter
+=
field_getter
+
";
\n
"
;
}
}
return
key_getter
;
}
void
GenStruct
(
StructDef
&
struct_def
,
std
::
string
*
code_ptr
)
{
if
(
struct_def
.
generated
)
return
;
std
::
string
&
code
=
*
code_ptr
;
...
...
@@ -1133,59 +1187,48 @@ void GenStruct(StructDef &struct_def, std::string *code_ptr) {
}
}
if
(
struct_def
.
has_key
)
{
bool
is_string
=
key_field
->
value
.
type
.
base_type
==
BASE_TYPE_STRING
;
std
::
string
key_name
=
lang_
.
language
==
IDLOptions
::
kCSharp
?
MakeCamel
(
key_field
->
name
)
:
key_field
->
name
+
"()"
;
std
::
string
key_type
=
GenTypeGet
(
key_field
->
value
.
type
);
std
::
string
key_offset
=
NumToString
(
key_field
->
value
.
offset
);
std
::
string
key_getter
=
is_string
?
GenGetter
(
key_field
->
value
.
type
)
:
GenGetter
(
key_field
->
value
.
type
).
substr
(
2
);
std
::
string
data_buffer
=
lang_
.
language
==
IDLOptions
::
kCSharp
?
"builder.DataBuffer"
:
"bb"
;
code
+=
"
\n
public static int "
+
FunctionStart
(
'K'
)
+
"eysCompare("
+
key_type
+
" o1, "
+
key_type
+
" o2) "
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
&&
!
is_string
)
{
code
+=
"{
\n
if (o1 < o2) return -1;
\n
"
;
code
+=
" else if (o1 == o2) return 0;
\n
"
;
code
+=
" else return 1;
\n
}
\n
"
;
}
else
{
code
+=
"{ return o1."
+
FunctionStart
(
'C'
)
+
"ompareTo(o2); }
\n
"
;
}
auto
is_string
=
key_field
->
value
.
type
.
base_type
==
BASE_TYPE_STRING
;
auto
key_name
=
"table."
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
MakeCamel
(
key_field
->
name
)
:
key_field
->
name
+
"()"
);
code
+=
"
\n
public int "
+
FunctionStart
(
'K'
)
+
"eyCompareWithValue("
+
key_type
+
" val) "
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
&&
!
is_string
)
{
code
+=
"{
\n
if ("
+
key_name
+
" < val) return -1;
\n
"
;
code
+=
" else if ("
+
key_name
+
" == val) return 0;
\n
"
;
code
+=
" else return 1;
\n
}
\n
"
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
)
{
code
+=
"
\n
@Override
\n
protected int keysCompare("
;
code
+=
"Integer o1, Integer o2, ByteBuffer _bb) {"
;
code
+=
GenKeyGetter
(
key_field
);
if
(
!
is_string
)
{
code
+=
" if (off1 < off2) return -1;
\n
"
;
code
+=
" else if (off1 == off2) return 0;
\n
"
;
code
+=
" else return 1;
\n
"
;
}
code
+=
" }
\n
"
;
}
else
{
code
+=
"{ return "
+
key_name
+
"."
+
FunctionStart
(
'C'
)
+
"ompareTo(val); }
\n
"
;
code
+=
"
\n
public static VectorOffset "
;
code
+=
"CreateMySortedTableVector(FlatBufferBuilder builder, "
;
code
+=
"Offset<"
+
struct_def
.
name
+
">"
;
code
+=
"[] offsets) {
\n
"
;
code
+=
" Array.Sort(offsets, (Offset<"
+
struct_def
.
name
+
"> o1, Offset<"
+
struct_def
.
name
+
"> o2) => "
+
GenKeyGetter
(
key_field
);
code
+=
");
\n
"
;
code
+=
" return builder.CreateVectorOfTables(offsets);
\n
}
\n
"
;
}
code
+=
"
\n
public static "
;
code
+=
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
"VectorOffset "
:
"int "
)
+
FunctionStart
(
'C'
)
+
"reateMySortedTableVector(FlatBufferBuilder builder, "
;
code
+=
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
" Offset<"
+
struct_def
.
name
+
">"
:
"ByteBuffer bb, int"
)
+
"[] off"
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
"sets"
:
""
)
+
") {
\n
"
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
)
{
code
+=
" Integer[] offsets = new Integer[off.length];
\n
"
;
code
+=
" for (int i = 0; i < off.length; i++) offsets[i] = off[i];
\n
"
;
}
code
+=
" Array"
;
code
+=
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
".S"
:
"s.s"
);
code
+=
"ort(offsets, ("
;
code
+=
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
"Offset<"
+
struct_def
.
name
+
"> o1, Offset<"
+
struct_def
.
name
+
"> o2) => "
:
"Integer o1, Integer o2) -> "
);
code
+=
FunctionStart
(
'K'
)
+
"eysCompare("
;
code
+=
(
is_string
?
key_getter
:
data_buffer
+
key_getter
)
+
"(__offset("
+
key_offset
+
", "
+
data_buffer
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
".Length - o1.Value"
:
".array().length - o1"
);
code
+=
", "
+
data_buffer
+
", true)"
+
(
is_string
?
", "
+
data_buffer
:
""
)
+
"),
\n
"
;
code
+=
(
is_string
?
key_getter
:
data_buffer
+
key_getter
)
+
"(__offset("
+
key_offset
+
", "
+
data_buffer
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
".Length - o2.Value"
:
".array().length - o2"
);
code
+=
", "
+
data_buffer
+
", true)"
+
(
is_string
?
", "
+
data_buffer
:
""
)
+
")));
\n
"
;
if
(
lang_
.
language
==
IDLOptions
::
kJava
)
code
+=
" for (int i = 0; i < off.length; i++) off[i] = offsets[i];
\n
"
;
code
+=
" return builder."
+
FunctionStart
(
'C'
)
+
"reateVectorOfTables(off"
+
(
lang_
.
language
==
IDLOptions
::
kCSharp
?
"sets"
:
""
)
+
");
\n
}
\n
"
;
code
+=
"
\n
public static "
+
struct_def
.
name
+
" "
+
FunctionStart
(
'L'
)
+
"ookupByKey("
+
struct_def
.
name
;
code
+=
"[] tables, "
+
key_type
+
" key) {
\n
"
;
code
+=
"
\n
public static "
+
struct_def
.
name
+
" "
+
FunctionStart
(
'L'
);
code
+=
"ookupByKey("
+
struct_def
.
name
;
code
+=
"[] tables, "
+
GenTypeGet
(
key_field
->
value
.
type
)
+
" key) {
\n
"
;
code
+=
" int span = tables."
+
FunctionStart
(
'L'
)
+
"ength, start = 0;
\n
"
;
code
+=
" while (span != 0) {
\n
"
;
code
+=
" int middle = span / 2;
\n
"
;
code
+=
" "
+
struct_def
.
name
+
" table = tables[start + middle];
\n
"
;
code
+=
" int comp = table."
+
FunctionStart
(
'K'
)
+
"eyCompareWithValue(key);
\n
"
;
if
(
lang_
.
language
==
IDLOptions
::
kCSharp
||
is_string
)
{
code
+=
" int comp = "
+
key_name
+
"."
+
FunctionStart
(
'C'
);
code
+=
"ompareTo(key);
\n
"
;
}
else
{
code
+=
" int comp = "
+
key_name
+
" > key ? 1 : "
+
key_name
;
code
+=
" < key ? -1 : 0;
\n
"
;
}
code
+=
" if (comp > 0) span = middle;
\n
"
;
code
+=
" else if (comp < 0) {
\n
"
;
code
+=
" middle++;
\n
"
;
...
...
tests/JavaTest.java
View file @
8fdced4e
...
...
@@ -62,7 +62,7 @@ class JavaTest {
Monster
.
startMonster
(
fbb
);
Monster
.
addName
(
fbb
,
names
[
2
]);
off
[
2
]
=
Monster
.
endMonster
(
fbb
);
int
sortMons
=
fbb
.
createSortedTableVector
(
Monster
.
class
,
off
);
int
sortMons
=
fbb
.
createSortedTableVector
(
new
Monster
()
,
off
);
// We set up the same values as monsterdata.json:
...
...
tests/MyGame/Example/Monster.cs
View file @
8fdced4e
...
...
@@ -130,13 +130,8 @@ public sealed class Monster : Table {
}
public
static
void
FinishMonsterBuffer
(
FlatBufferBuilder
builder
,
Offset
<
Monster
>
offset
)
{
builder
.
Finish
(
offset
.
Value
,
"MONS"
);
}
public
static
int
KeysCompare
(
string
o1
,
string
o2
)
{
return
o1
.
CompareTo
(
o2
);
}
public
int
KeyCompareWithValue
(
string
val
)
{
return
Name
.
CompareTo
(
val
);
}
public
static
VectorOffset
CreateMySortedTableVector
(
FlatBufferBuilder
builder
,
Offset
<
Monster
>[]
offsets
)
{
Array
.
Sort
(
offsets
,
(
Offset
<
Monster
>
o1
,
Offset
<
Monster
>
o2
)
=>
KeysCompare
(
__string
(
__offset
(
10
,
builder
.
DataBuffer
.
Length
-
o1
.
Value
,
builder
.
DataBuffer
,
true
),
builder
.
DataBuffer
),
__string
(
__offset
(
10
,
builder
.
DataBuffer
.
Length
-
o2
.
Value
,
builder
.
DataBuffer
,
true
),
builder
.
DataBuffer
)));
Array
.
Sort
(
offsets
,
(
Offset
<
Monster
>
o1
,
Offset
<
Monster
>
o2
)
=>
CompareStrings
(
__offset
(
10
,
o1
.
Value
,
builder
.
DataBuffer
),
__offset
(
10
,
o2
.
Value
,
builder
.
DataBuffer
),
builder
.
DataBuffer
));
return
builder
.
CreateVectorOfTables
(
offsets
);
}
...
...
@@ -145,7 +140,7 @@ public sealed class Monster : Table {
while
(
span
!=
0
)
{
int
middle
=
span
/
2
;
Monster
table
=
tables
[
start
+
middle
];
int
comp
=
table
.
KeyCompareWithValue
(
key
);
int
comp
=
table
.
Name
.
CompareTo
(
key
);
if
(
comp
>
0
)
span
=
middle
;
else
if
(
comp
<
0
)
{
middle
++;
...
...
tests/MyGame/Example/Monster.java
View file @
8fdced4e
...
...
@@ -136,25 +136,15 @@ public final class Monster extends Table {
}
public
static
void
finishMonsterBuffer
(
FlatBufferBuilder
builder
,
int
offset
)
{
builder
.
finish
(
offset
,
"MONS"
);
}
public
static
int
keysCompare
(
String
o1
,
String
o2
)
{
return
o1
.
compareTo
(
o2
);
}
public
int
keyCompareWithValue
(
String
val
)
{
return
name
().
compareTo
(
val
);
}
public
static
int
createMySortedTableVector
(
FlatBufferBuilder
builder
,
ByteBuffer
bb
,
int
[]
off
)
{
Integer
[]
offsets
=
new
Integer
[
off
.
length
];
for
(
int
i
=
0
;
i
<
off
.
length
;
i
++)
offsets
[
i
]
=
off
[
i
];
Arrays
.
sort
(
offsets
,
(
Integer
o1
,
Integer
o2
)
->
keysCompare
(
__string
(
__offset
(
10
,
bb
.
array
().
length
-
o1
,
bb
,
true
),
bb
),
__string
(
__offset
(
10
,
bb
.
array
().
length
-
o2
,
bb
,
true
),
bb
)));
for
(
int
i
=
0
;
i
<
off
.
length
;
i
++)
off
[
i
]
=
offsets
[
i
];
return
builder
.
createVectorOfTables
(
off
);
}
@Override
protected
int
keysCompare
(
Integer
o1
,
Integer
o2
,
ByteBuffer
_bb
)
{
return
compareStrings
(
__offset
(
10
,
o1
,
_bb
),
__offset
(
10
,
o2
,
_bb
),
_bb
);
}
public
static
Monster
lookupByKey
(
Monster
[]
tables
,
String
key
)
{
int
span
=
tables
.
length
,
start
=
0
;
while
(
span
!=
0
)
{
int
middle
=
span
/
2
;
Monster
table
=
tables
[
start
+
middle
];
int
comp
=
table
.
keyCompareWithValue
(
key
);
int
comp
=
table
.
name
().
compareTo
(
key
);
if
(
comp
>
0
)
span
=
middle
;
else
if
(
comp
<
0
)
{
middle
++;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment