Skip to content

Commit 8527a10

Browse files
author
Michael Ward
committed
[Rust] updated generator to create "_from_iter" and "_zero_padded" functions for primitive array
1 parent a322d9f commit 8527a10

File tree

3 files changed

+100
-44
lines changed

3 files changed

+100
-44
lines changed

rust/tests/extension_test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ fn encode_car_from_scratch() -> SbeResult<(usize, Vec<u8>)> {
187187
car.available(BooleanType::T);
188188
car.code(Model::A);
189189
car.some_numbers(&[0, 1, 2, 3]);
190-
car.vehicle_code_from_iter(b"abcdef_extra_is_ignored".iter().map(|x| *x)); // abcdef
190+
car.vehicle_code_from_iter(b"abcdef_extra_is_ignored".into_iter().copied()); // abcdef
191191

192192
extras.set_cruise_control(true);
193193
extras.set_sports_pack(true);

rust/tests/fixed_sized_primitive_array.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ fn test_encode_then_decode_u8_slice() {
7474
let mut buffer = [uninit; 1024];
7575
let mut encoder = create_encoder(&mut buffer);
7676

77-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
77+
encode_func(&mut encoder, each_slice.into_iter().copied());
7878

7979
let end = 1i32;
8080
end_encode_func(&mut encoder, end);
@@ -295,7 +295,7 @@ fn test_encode_then_decode_non_u8_signed_primitive_slice() {
295295
let mut buffer = [uninit; 1024];
296296
let mut encoder = create_encoder(&mut buffer);
297297

298-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
298+
encode_func(&mut encoder, each_slice.into_iter().copied());
299299

300300
let end = 1i32;
301301
end_encode_func(&mut encoder, end);
@@ -500,7 +500,7 @@ fn test_encode_then_decode_non_u8_unsigned_primitive_slice() {
500500
let mut buffer = [uninit; 1024];
501501
let mut encoder = create_encoder(&mut buffer);
502502

503-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
503+
encode_func(&mut encoder, each_slice.into_iter().copied());
504504

505505
let end = 1i32;
506506
end_encode_func(&mut encoder, end);
@@ -628,7 +628,7 @@ fn test_encode_then_decode_u8_slice_padded() {
628628
let mut buffer = [uninit; 1024];
629629
let mut encoder = create_encoder(&mut buffer);
630630

631-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
631+
encode_func(&mut encoder, each_slice);
632632

633633
let end = 1i32;
634634
end_encode_func(&mut encoder, end);
@@ -660,49 +660,49 @@ fn test_encode_then_decode_u8_slice_padded() {
660660
}
661661

662662
run_encode_then_decode_for_array_of_u8_len_16!(
663-
DemoEncoder::fixed_16_char_from_iter,
663+
DemoEncoder::fixed_16_char_zero_padded,
664664
DemoDecoder::fixed_16_char,
665665
DemoEncoder::fixed_16_char_end,
666666
DemoDecoder::fixed_16_char_end,
667667
);
668668
run_encode_then_decode_for_array_of_u8_len_16!(
669-
DemoEncoder::fixed_16_ascii_char_from_iter,
669+
DemoEncoder::fixed_16_ascii_char_zero_padded,
670670
DemoDecoder::fixed_16_ascii_char,
671671
DemoEncoder::fixed_16_ascii_char_end,
672672
DemoDecoder::fixed_16_ascii_char_end,
673673
);
674674
run_encode_then_decode_for_array_of_u8_len_16!(
675-
DemoEncoder::fixed_16_gb_18030_char_from_iter,
675+
DemoEncoder::fixed_16_gb_18030_char_zero_padded,
676676
DemoDecoder::fixed_16_gb_18030_char,
677677
DemoEncoder::fixed_16_gb_18030_char_end,
678678
DemoDecoder::fixed_16_gb_18030_char_end,
679679
);
680680
run_encode_then_decode_for_array_of_u8_len_16!(
681-
DemoEncoder::fixed_16_utf_8_char_from_iter,
681+
DemoEncoder::fixed_16_utf_8_char_zero_padded,
682682
DemoDecoder::fixed_16_utf_8_char,
683683
DemoEncoder::fixed_16_utf_8_char_end,
684684
DemoDecoder::fixed_16_utf_8_char_end,
685685
);
686686
run_encode_then_decode_for_array_of_u8_len_16!(
687-
DemoEncoder::fixed_16_u8_from_iter,
687+
DemoEncoder::fixed_16_u8_zero_padded,
688688
DemoDecoder::fixed_16_u8,
689689
DemoEncoder::fixed_16_u8_end,
690690
DemoDecoder::fixed_16_u8_end,
691691
);
692692
run_encode_then_decode_for_array_of_u8_len_16!(
693-
DemoEncoder::fixed_16_ascii_u8_from_iter,
693+
DemoEncoder::fixed_16_ascii_u8_zero_padded,
694694
DemoDecoder::fixed_16_ascii_u8,
695695
DemoEncoder::fixed_16_ascii_u8_end,
696696
DemoDecoder::fixed_16_ascii_u8_end,
697697
);
698698
run_encode_then_decode_for_array_of_u8_len_16!(
699-
DemoEncoder::fixed_16_gb_18030_u8_from_iter,
699+
DemoEncoder::fixed_16_gb_18030_u8_zero_padded,
700700
DemoDecoder::fixed_16_gb_18030_u8,
701701
DemoEncoder::fixed_16_gb_18030_u8_end,
702702
DemoDecoder::fixed_16_gb_18030_u8_end,
703703
);
704704
run_encode_then_decode_for_array_of_u8_len_16!(
705-
DemoEncoder::fixed_16_utf_8_u8_from_iter,
705+
DemoEncoder::fixed_16_utf_8_u8_zero_padded,
706706
DemoDecoder::fixed_16_utf_8_u8,
707707
DemoEncoder::fixed_16_utf_8u_8_end,
708708
DemoDecoder::fixed_16_utf_8u_8_end,
@@ -846,7 +846,7 @@ fn test_encode_then_decode_non_u8_signed_primitive_slice_padded() {
846846
let mut buffer = [uninit; 1024];
847847
let mut encoder = create_encoder(&mut buffer);
848848

849-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
849+
encode_func(&mut encoder, each_slice);
850850

851851
let end = 1i32;
852852
end_encode_func(&mut encoder, end);
@@ -884,28 +884,28 @@ fn test_encode_then_decode_non_u8_signed_primitive_slice_padded() {
884884
}
885885

886886
run_encode_then_decode_for_array_of_signed_len_16!(
887-
DemoEncoder::fixed_16_i8_from_iter,
887+
DemoEncoder::fixed_16_i8_zero_padded,
888888
DemoDecoder::fixed_16_i8,
889889
DemoEncoder::fixed_16_i8_end,
890890
DemoDecoder::fixed_16_i8_end,
891891
i8,
892892
);
893893
run_encode_then_decode_for_array_of_signed_len_16!(
894-
DemoEncoder::fixed_16_i16_from_iter,
894+
DemoEncoder::fixed_16_i16_zero_padded,
895895
DemoDecoder::fixed_16_i16,
896896
DemoEncoder::fixed_16_i16_end,
897897
DemoDecoder::fixed_16_i16_end,
898898
i16,
899899
);
900900
run_encode_then_decode_for_array_of_signed_len_16!(
901-
DemoEncoder::fixed_16_i32_from_iter,
901+
DemoEncoder::fixed_16_i32_zero_padded,
902902
DemoDecoder::fixed_16_i32,
903903
DemoEncoder::fixed_16_i32_end,
904904
DemoDecoder::fixed_16_i32_end,
905905
i32,
906906
);
907907
run_encode_then_decode_for_array_of_signed_len_16!(
908-
DemoEncoder::fixed_16_i64_from_iter,
908+
DemoEncoder::fixed_16_i64_zero_padded,
909909
DemoDecoder::fixed_16_i64,
910910
DemoEncoder::fixed_16_i64_end,
911911
DemoDecoder::fixed_16_i64_end,
@@ -1049,7 +1049,7 @@ fn test_encode_then_decode_non_u8_unsigned_primitive_slice_padded() {
10491049
let mut buffer = [uninit; 1024];
10501050
let mut encoder = create_encoder(&mut buffer);
10511051

1052-
encode_func(&mut encoder, each_slice.iter().map(|x| *x));
1052+
encode_func(&mut encoder, each_slice);
10531053

10541054
let end = 1i32;
10551055
end_encode_func(&mut encoder, end);
@@ -1087,21 +1087,21 @@ fn test_encode_then_decode_non_u8_unsigned_primitive_slice_padded() {
10871087
}
10881088

10891089
run_encode_then_decode_for_array_of_unsigned_len_16!(
1090-
DemoEncoder::fixed_16_u16_from_iter,
1090+
DemoEncoder::fixed_16_u16_zero_padded,
10911091
DemoDecoder::fixed_16_u16,
10921092
DemoEncoder::fixed_16_u16_end,
10931093
DemoDecoder::fixed_16_u16_end,
10941094
u16
10951095
);
10961096
run_encode_then_decode_for_array_of_unsigned_len_16!(
1097-
DemoEncoder::fixed_16_u32_from_iter,
1097+
DemoEncoder::fixed_16_u32_zero_padded,
10981098
DemoDecoder::fixed_16_u32,
10991099
DemoEncoder::fixed_16_u32_end,
11001100
DemoDecoder::fixed_16_u32_end,
11011101
u32
11021102
);
11031103
run_encode_then_decode_for_array_of_unsigned_len_16!(
1104-
DemoEncoder::fixed_16_u64_from_iter,
1104+
DemoEncoder::fixed_16_u64_zero_padded,
11051105
DemoDecoder::fixed_16_u64,
11061106
DemoEncoder::fixed_16_u64_end,
11071107
DemoDecoder::fixed_16_u64_end,

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

Lines changed: 78 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,63 @@ private static void generateRustDoc(
383383
indent(sb, level, "/// - version: %d\n", typeToken.version());
384384
}
385385

386+
private static void generatePrimitiveArrayFromIterEncoder(
387+
final StringBuilder sb,
388+
final int level,
389+
final Token typeToken,
390+
final String name) throws IOException
391+
{
392+
final Encoding encoding = typeToken.encoding();
393+
final PrimitiveType primitiveType = encoding.primitiveType();
394+
final String rustPrimitiveType = rustTypeName(primitiveType);
395+
396+
indent(sb, level, "/// primitive array field '%s' from an Iterator\n", name);
397+
generateRustDoc(sb, level, typeToken, encoding);
398+
indent(sb, level, "#[inline]\n");
399+
indent(sb, level, "pub fn %s_from_iter(&mut self, iter: impl Iterator<Item = %s>) {\n",
400+
formatFunctionName(name), rustPrimitiveType);
401+
402+
indent(sb, level + 1, "let offset = self.%s;\n", getBufOffset(typeToken));
403+
indent(sb, level + 1, "let buf = self.get_buf_mut();\n");
404+
indent(sb, level + 1, "for (i, v) in iter.enumerate() {\n");
405+
406+
if (primitiveType.size() == 1)
407+
{
408+
indent(sb, level + 2, "buf.put_%s_at(offset + i, v);\n", rustPrimitiveType);
409+
}
410+
else
411+
{
412+
indent(sb, level + 2, "buf.put_%s_at(offset + i * %d, v);\n",
413+
rustPrimitiveType, primitiveType.size());
414+
}
415+
indent(sb, level + 1, "}\n");
416+
indent(sb, level, "}\n\n");
417+
}
418+
419+
private static void generatePrimitiveArrayZeroPaddedEncoder(
420+
final StringBuilder sb,
421+
final int level,
422+
final Token typeToken,
423+
final String name) throws IOException
424+
{
425+
final Encoding encoding = typeToken.encoding();
426+
final PrimitiveType primitiveType = encoding.primitiveType();
427+
final String rustPrimitiveType = rustTypeName(primitiveType);
428+
final int arrayLength = typeToken.arrayLength();
429+
430+
indent(sb, level, "/// primitive array field '%s' with zero padding\n", name);
431+
generateRustDoc(sb, level, typeToken, encoding);
432+
indent(sb, level, "#[inline]\n");
433+
indent(sb, level, "pub fn %s_zero_padded(&mut self, value: &[%s]) {\n",
434+
formatFunctionName(name), rustPrimitiveType);
435+
436+
indent(sb, level + 1, "let iter = value.iter().copied().chain(std::iter::repeat(0_%s)).take(%d);\n",
437+
rustPrimitiveType, arrayLength);
438+
439+
indent(sb, level + 1, "self.%s_from_iter(iter);", formatFunctionName(name));
440+
indent(sb, level, "}\n\n");
441+
}
442+
386443
private static void generatePrimitiveArrayEncoder(
387444
final StringBuilder sb,
388445
final int level,
@@ -394,6 +451,24 @@ private static void generatePrimitiveArrayEncoder(
394451
final String rustPrimitiveType = rustTypeName(primitiveType);
395452
final int arrayLength = typeToken.arrayLength();
396453

454+
indent(sb, level, "#[inline]\n");
455+
indent(sb, level, "pub fn %s_at(&mut self, index: usize, value: %s) {\n",
456+
formatFunctionName(name), rustPrimitiveType);
457+
indent(sb, level + 1, "let offset = self.%s;\n", getBufOffset(typeToken));
458+
indent(sb, level + 1, "let buf = self.get_buf_mut();\n");
459+
460+
if (primitiveType.size() == 1)
461+
{
462+
indent(sb, level + 1, "buf.put_%s_at(offset + index, value);\n",
463+
rustPrimitiveType, primitiveType.size());
464+
}
465+
else
466+
{
467+
indent(sb, level + 1, "buf.put_%s_at(offset + index * %d, value);\n",
468+
rustPrimitiveType, primitiveType.size());
469+
}
470+
indent(sb, level, "}\n\n");
471+
397472
indent(sb, level, "/// primitive array field '%s'\n", name);
398473
generateRustDoc(sb, level, typeToken, encoding);
399474
indent(sb, level, "#[inline]\n");
@@ -407,11 +482,7 @@ private static void generatePrimitiveArrayEncoder(
407482

408483
if (rustPrimitiveType.equals("u8"))
409484
{
410-
indent(sb, level + 1, "let mid = %d.min(value.len());\n", arrayLength);
411-
indent(sb, level + 1, "buf.put_slice_at(offset, value.split_at(mid).0);\n");
412-
indent(sb, level + 1, "for i in mid..%d {\n", arrayLength);
413-
indent(sb, level + 2, "buf.put_u8_at(offset + (i * 1), %s);\n", rustNullLiteral(encoding));
414-
indent(sb, level + 1, "}\n");
485+
indent(sb, level + 1, "buf.put_slice_at(offset, value);\n");
415486
indent(sb, level, "}\n\n");
416487
}
417488
else
@@ -434,22 +505,8 @@ private static void generatePrimitiveArrayEncoder(
434505
indent(sb, level, "}\n\n");
435506
}
436507

437-
indent(sb, level, "/// primitive array field '%s' from an Iterator\n", name);
438-
generateRustDoc(sb, level, typeToken, encoding);
439-
indent(sb, level, "#[inline]\n");
440-
indent(sb, level, "pub fn %s_from_iter(&mut self, iter: impl Iterator<Item = %s>) {\n",
441-
formatFunctionName(name), rustPrimitiveType);
442-
443-
indent(sb, level + 1, "let offset = self.%s;\n", getBufOffset(typeToken));
444-
indent(sb, level + 1, "let buf = self.get_buf_mut();\n");
445-
indent(sb, level + 1, "let iter = iter.chain(std::iter::repeat(%s)).take(%d);\n",
446-
rustNullLiteral(encoding), arrayLength);
447-
448-
indent(sb, level + 1, "for (i, v) in iter.enumerate() {\n");
449-
indent(sb, level + 2, "buf.put_%s_at(offset + (i * %d), v);\n",
450-
rustPrimitiveType, primitiveType.size());
451-
indent(sb, level + 1, "}\n");
452-
indent(sb, level, "}\n\n");
508+
generatePrimitiveArrayFromIterEncoder(sb, level, typeToken, name);
509+
generatePrimitiveArrayZeroPaddedEncoder(sb, level, typeToken, name);
453510
}
454511

455512
private static void generatePrimitiveEncoder(
@@ -485,7 +542,6 @@ private static void generatePrimitiveEncoder(
485542
indent(sb, level + 1, "let offset = self.%s;\n", getBufOffset(typeToken));
486543
indent(sb, level + 1, "self.get_buf_mut().put_%s_at(offset, value);\n", rustPrimitiveType);
487544
indent(sb, level, "}\n\n");
488-
489545
}
490546

491547
private static void generateEnumEncoder(

0 commit comments

Comments
 (0)