Skip to content

Commit e18556b

Browse files
author
Michael Ward
committed
[Rust] refactored codegen of primitive array encoding to accept slice instead of array
1 parent ded0bca commit e18556b

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/LibRsDef.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,9 @@ static void generateWriteBuf(final Writer writer, final ByteOrder byteOrder) thr
276276
indent(writer, 2, "dest.clone_from_slice(src);\n");
277277
indent(writer, 2, "len\n");
278278
indent(writer, 1, "}\n");
279-
280279
indent(writer, 0, "}\n");
281280

281+
// impl From<WriteBuf> for &[u8]
282282
indent(writer, 0, "impl<%s> From<&%1$s mut %2$s<%1$s>> for &%1$s mut [u8] {\n", BUF_LIFETIME, WRITE_BUF_TYPE);
283283
indent(writer, 1, "#[inline]\n");
284284
indent(writer, 1, "fn from(buf: &%s mut %2$s<%1$s>) -> &%1$s mut [u8] {\n", BUF_LIFETIME, WRITE_BUF_TYPE);

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/rust/RustGenerator.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -383,18 +383,21 @@ private static void generatePrimitiveEncoder(
383383
indent(sb, level, "/// - encodedLength: %d\n", typeToken.encodedLength());
384384
indent(sb, level, "/// - version: %d\n", typeToken.version());
385385
indent(sb, level, "#[inline]\n");
386-
indent(sb, level, "pub fn %s(&mut self, value: &[%s; %d]) {\n",
386+
indent(sb, level, "pub fn %s(&mut self, value: &[%s]) {\n",
387387
formatFunctionName(name),
388-
rustPrimitiveType,
389-
arrayLength);
388+
rustPrimitiveType);
390389

391390
// NB: must create variable 'offset' before calling mutable self.get_buf_mut()
392391
indent(sb, level + 1, "let offset = self.%s;\n", getBufOffset(typeToken));
393392
indent(sb, level + 1, "let buf = self.get_buf_mut();\n");
394393

395394
if (rustPrimitiveType.equals("u8"))
396395
{
397-
indent(sb, level + 1, "buf.put_bytes_at(offset, value);\n");
396+
indent(sb, level + 1, "let mid = %d.min(value.len());\n", arrayLength);
397+
indent(sb, level + 1, "buf.put_slice_at(offset, value.split_at(mid).0);\n");
398+
indent(sb, level + 1, "for i in mid..%d {\n", arrayLength);
399+
indent(sb, level + 2, "buf.put_u8_at(offset + (i * 1), %s_u8);\n", encoding.applicableNullValue());
400+
indent(sb, level + 1, "}\n");
398401
indent(sb, level, "}\n\n");
399402
return;
400403
}

0 commit comments

Comments
 (0)