Skip to content

Commit 7873ab0

Browse files
committed
[Java] More efficient types handling in OTF.
1 parent b869221 commit 7873ab0

File tree

5 files changed

+82
-69
lines changed

5 files changed

+82
-69
lines changed

sbe-samples/src/main/java/uk/co/real_logic/sbe/examples/ExampleTokenListener.java

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,10 @@
1717

1818
import uk.co.real_logic.agrona.DirectBuffer;
1919
import uk.co.real_logic.sbe.PrimitiveValue;
20-
import uk.co.real_logic.sbe.codec.java.CodecUtil;
2120
import uk.co.real_logic.sbe.ir.Encoding;
2221
import uk.co.real_logic.sbe.ir.Token;
2322
import uk.co.real_logic.sbe.otf.TokenListener;
24-
import uk.co.real_logic.sbe.otf.Util;
23+
import uk.co.real_logic.sbe.otf.Types;
2524

2625
import java.io.PrintWriter;
2726
import java.io.UnsupportedEncodingException;
@@ -190,7 +189,7 @@ private static CharSequence readEncodingAsString(
190189

191190
for (int i = 0, size = typeToken.arrayLength(); i < size; i++)
192191
{
193-
mapEncodingToString(sb, buffer, index + (i * elementSize), encoding);
192+
Types.appendAsString(sb, buffer, index + (i * elementSize), encoding);
194193
sb.append(", ");
195194
}
196195

@@ -208,7 +207,7 @@ private long readEncodingAsLong(
208207
return constOrNotPresentValue.longValue();
209208
}
210209

211-
return Util.getLong(buffer, bufferIndex, typeToken.encoding());
210+
return Types.getLong(buffer, bufferIndex, typeToken.encoding());
212211
}
213212

214213
private static PrimitiveValue constOrNotPresentValue(final Token token, final int actingVersion)
@@ -229,57 +228,6 @@ else if (token.isOptionalEncoding())
229228
return null;
230229
}
231230

232-
private static void mapEncodingToString(
233-
final StringBuilder sb, final DirectBuffer buffer, final int index, final Encoding encoding)
234-
{
235-
switch (encoding.primitiveType())
236-
{
237-
case CHAR:
238-
sb.append('\'').append((char)CodecUtil.charGet(buffer, index)).append('\'');
239-
break;
240-
241-
case INT8:
242-
sb.append(CodecUtil.int8Get(buffer, index));
243-
break;
244-
245-
case INT16:
246-
sb.append(CodecUtil.int16Get(buffer, index, encoding.byteOrder()));
247-
break;
248-
249-
case INT32:
250-
sb.append(CodecUtil.int32Get(buffer, index, encoding.byteOrder()));
251-
break;
252-
253-
case INT64:
254-
sb.append(CodecUtil.int64Get(buffer, index, encoding.byteOrder()));
255-
break;
256-
257-
case UINT8:
258-
sb.append(CodecUtil.uint8Get(buffer, index));
259-
break;
260-
261-
case UINT16:
262-
sb.append(CodecUtil.uint16Get(buffer, index, encoding.byteOrder()));
263-
break;
264-
265-
case UINT32:
266-
sb.append(CodecUtil.uint32Get(buffer, index, encoding.byteOrder()));
267-
break;
268-
269-
case UINT64:
270-
sb.append(CodecUtil.uint64Get(buffer, index, encoding.byteOrder()));
271-
break;
272-
273-
case FLOAT:
274-
sb.append(CodecUtil.floatGet(buffer, index, encoding.byteOrder()));
275-
break;
276-
277-
case DOUBLE:
278-
sb.append(CodecUtil.doubleGet(buffer, index, encoding.byteOrder()));
279-
break;
280-
}
281-
}
282-
283231
private void printScope()
284232
{
285233
final Iterator<String> i = namedScope.descendingIterator();

sbe-tool/src/main/java/uk/co/real_logic/sbe/otf/OtfHeaderDecoder.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public int encodedLength()
106106
*/
107107
public int getTemplateId(final DirectBuffer buffer, final int bufferOffset)
108108
{
109-
return Util.getInt(buffer, bufferOffset + templateIdOffset, templateIdType, templateIdByteOrder);
109+
return Types.getInt(buffer, bufferOffset + templateIdOffset, templateIdType, templateIdByteOrder);
110110
}
111111

112112
/**
@@ -118,7 +118,7 @@ public int getTemplateId(final DirectBuffer buffer, final int bufferOffset)
118118
*/
119119
public int getSchemaId(final DirectBuffer buffer, final int bufferOffset)
120120
{
121-
return Util.getInt(buffer, bufferOffset + schemaIdOffset, schemaIdType, schemaIdByteOrder);
121+
return Types.getInt(buffer, bufferOffset + schemaIdOffset, schemaIdType, schemaIdByteOrder);
122122
}
123123

124124
/**
@@ -130,7 +130,7 @@ public int getSchemaId(final DirectBuffer buffer, final int bufferOffset)
130130
*/
131131
public int getSchemaVersion(final DirectBuffer buffer, final int bufferOffset)
132132
{
133-
return Util.getInt(buffer, bufferOffset + schemaVersionOffset, schemaVersionType, schemaVersionByteOrder);
133+
return Types.getInt(buffer, bufferOffset + schemaVersionOffset, schemaVersionType, schemaVersionByteOrder);
134134
}
135135

136136
/**
@@ -142,6 +142,6 @@ public int getSchemaVersion(final DirectBuffer buffer, final int bufferOffset)
142142
*/
143143
public int getBlockLength(final DirectBuffer buffer, final int bufferOffset)
144144
{
145-
return Util.getInt(buffer, bufferOffset + blockLengthOffset, blockLengthType, blockLengthByteOrder);
145+
return Types.getInt(buffer, bufferOffset + blockLengthOffset, blockLengthType, blockLengthByteOrder);
146146
}
147147
}

sbe-tool/src/main/java/uk/co/real_logic/sbe/otf/OtfMessageDecoder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import java.util.List;
2323

24-
import static uk.co.real_logic.sbe.otf.Util.getInt;
24+
import static uk.co.real_logic.sbe.otf.Types.getInt;
2525

2626
/**
2727
* On-the-fly decoder that dynamically decodes messages based on the IR for a schema.

sbe-tool/src/main/java/uk/co/real_logic/sbe/otf/Util.java renamed to sbe-tool/src/main/java/uk/co/real_logic/sbe/otf/Types.java

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222
import java.nio.ByteOrder;
2323

2424
/**
25-
* Utility functions to help with on-the-fly decoding.
25+
* Utility functions for applying to types to help with on-the-fly (OTF) decoding.
2626
*/
27-
public class Util
27+
public class Types
2828
{
2929
/**
3030
* Get an integer value from a buffer at a given index for a {@link PrimitiveType}.
@@ -102,4 +102,63 @@ public static long getLong(final DirectBuffer buffer, final int index, final Enc
102102
throw new IllegalArgumentException("Unsupported type for long: " + encoding.primitiveType());
103103
}
104104
}
105+
106+
/**
107+
* Append an encoding as a String to a {@link StringBuilder}.
108+
*
109+
* @param sb to append the encoding to.
110+
* @param buffer containing the encoded value.
111+
* @param index at which the encoded value exists.
112+
* @param encoding representing the encoded value.
113+
*/
114+
public static void appendAsString(
115+
final StringBuilder sb, final DirectBuffer buffer, final int index, final Encoding encoding)
116+
{
117+
switch (encoding.primitiveType())
118+
{
119+
case CHAR:
120+
sb.append('\'').append((char)buffer.getByte(index)).append('\'');
121+
break;
122+
123+
case INT8:
124+
sb.append(buffer.getByte(index));
125+
break;
126+
127+
case INT16:
128+
sb.append(buffer.getShort(index, encoding.byteOrder()));
129+
break;
130+
131+
case INT32:
132+
sb.append(buffer.getInt(index, encoding.byteOrder()));
133+
break;
134+
135+
case INT64:
136+
sb.append(buffer.getLong(index, encoding.byteOrder()));
137+
break;
138+
139+
case UINT8:
140+
sb.append((short)(buffer.getByte(index) & 0xFF));
141+
break;
142+
143+
case UINT16:
144+
sb.append(buffer.getShort(index, encoding.byteOrder()) & 0xFFFF);
145+
break;
146+
147+
case UINT32:
148+
sb.append(buffer.getInt(index, encoding.byteOrder()) & 0xFFFF_FFFFL);
149+
break;
150+
151+
case UINT64:
152+
sb.append(buffer.getLong(index, encoding.byteOrder()));
153+
break;
154+
155+
case FLOAT:
156+
sb.append(buffer.getFloat(index, encoding.byteOrder()));
157+
break;
158+
159+
case DOUBLE:
160+
sb.append(buffer.getDouble(index, encoding.byteOrder()));
161+
break;
162+
}
163+
}
105164
}

sbe-tool/src/test/java/uk/co/real_logic/sbe/codec/java/CodecUtilTest.java renamed to sbe-tool/src/test/java/uk/co/real_logic/sbe/codec/java/TypesTest.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import static org.junit.Assert.assertThat;
2727
import static org.junit.Assert.assertTrue;
2828

29-
public class CodecUtilTest
29+
public class TypesTest
3030
{
3131
private static final ByteOrder BYTE_ORDER = ByteOrder.nativeOrder();
3232
private static final int BUFFER_CAPACITY = 64;
@@ -43,7 +43,7 @@ public void shouldTestBitInByte()
4343

4444
for (int i = 0; i < 8; i++)
4545
{
46-
final boolean result = CodecUtil.uint8GetChoice(buffer, bufferIndex, i);
46+
final boolean result = 0 != (buffer.getByte(bufferIndex) & (1 << i));
4747
if (bitIndex == i)
4848
{
4949
assertTrue(result);
@@ -63,7 +63,9 @@ public void shouldSetBitInByte()
6363
short total = 0;
6464
for (int i = 0; i < 8; i++)
6565
{
66-
CodecUtil.uint8PutChoice(buffer, bufferIndex, i, true);
66+
byte bits = buffer.getByte(bufferIndex);
67+
bits = (byte)(bits | (1 << i));
68+
buffer.putByte(bufferIndex, bits);
6769
total += (1 << i);
6870
assertThat(buffer.getByte(bufferIndex), is((byte)total));
6971
}
@@ -79,7 +81,7 @@ public void shouldTestBitInShort()
7981

8082
for (int i = 0; i < 16; i++)
8183
{
82-
final boolean result = CodecUtil.uint16GetChoice(buffer, bufferIndex, i, BYTE_ORDER);
84+
final boolean result = 0 != (buffer.getShort(bufferIndex, BYTE_ORDER) & (1 << i));
8385
if (bitIndex == i)
8486
{
8587
assertTrue(result);
@@ -99,7 +101,9 @@ public void shouldSetBitInShort()
99101
int total = 0;
100102
for (int i = 0; i < 16; i++)
101103
{
102-
CodecUtil.uint16PutChoice(buffer, bufferIndex, i, true, BYTE_ORDER);
104+
short bits = buffer.getShort(bufferIndex, BYTE_ORDER);
105+
bits = (short)(bits | (1 << i));
106+
buffer.putShort(bufferIndex, bits, BYTE_ORDER);
103107
total += (1 << i);
104108
assertThat(buffer.getShort(bufferIndex, BYTE_ORDER), is((short)total));
105109
}
@@ -115,7 +119,7 @@ public void shouldTestBitInInt()
115119

116120
for (int i = 0; i < 32; i++)
117121
{
118-
final boolean result = CodecUtil.uint32GetChoice(buffer, bufferIndex, i, BYTE_ORDER);
122+
final boolean result = 0 != (buffer.getInt(bufferIndex, BYTE_ORDER) & (1 << i));
119123
if (bitIndex == i)
120124
{
121125
assertTrue(result);
@@ -135,7 +139,9 @@ public void shouldSetBitInInt()
135139

136140
for (int i = 0; i < 32; i++)
137141
{
138-
CodecUtil.uint32PutChoice(buffer, bufferIndex, i, true, BYTE_ORDER);
142+
int bits = buffer.getInt(bufferIndex, BYTE_ORDER);
143+
bits = bits | (1 << i);
144+
buffer.putInt(bufferIndex, bits, BYTE_ORDER);
139145
total += (1 << i);
140146
assertThat(buffer.getInt(bufferIndex, BYTE_ORDER), is((int)total));
141147
}

0 commit comments

Comments
 (0)