From 261395beaf8a2dba8970a893691ab081687f65f1 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 19 Jan 2022 14:25:52 +0100 Subject: [PATCH] `rec!` macro; access to `io::Write` inside `Writer`s --- .../rust/preserves/src/value/packed/writer.rs | 10 +++++++++ .../rust/preserves/src/value/repr.rs | 21 +++++++++++++++++++ .../rust/preserves/src/value/text/writer.rs | 8 +++++++ .../rust/preserves/src/value/writer.rs | 2 ++ 4 files changed, 41 insertions(+) diff --git a/implementations/rust/preserves/src/value/packed/writer.rs b/implementations/rust/preserves/src/value/packed/writer.rs index 4dfecbb..126516d 100644 --- a/implementations/rust/preserves/src/value/packed/writer.rs +++ b/implementations/rust/preserves/src/value/packed/writer.rs @@ -268,6 +268,11 @@ impl Writer for BinaryOrderWriter { self.push(ptr); Ok(()) } + + #[inline(always)] + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } } macro_rules! fits_in_bytes { @@ -522,4 +527,9 @@ impl Writer for PackedWriter self.resume(ann); Ok(()) } + + #[inline(always)] + fn flush(&mut self) -> io::Result<()> { + self.0.flush() + } } diff --git a/implementations/rust/preserves/src/value/repr.rs b/implementations/rust/preserves/src/value/repr.rs index b72aa71..9bdbe67 100644 --- a/implementations/rust/preserves/src/value/repr.rs +++ b/implementations/rust/preserves/src/value/repr.rs @@ -1533,3 +1533,24 @@ impl NestedValue for DummyValue { self.0.1 } } + +//--------------------------------------------------------------------------- + +// https://stackoverflow.com/questions/34304593/counting-length-of-repetition-in-macro/34324856 +#[macro_export] +//#[allow(unused_macros)] +macro_rules! count__ { + () => (0usize); + ( $x:tt $($xs:tt)* ) => (1usize + $crate::count__!($($xs)*)); +} + +#[macro_export] +macro_rules! rec { + ( $label:expr $(, $item:expr)* ) => { + { + let mut r__ = $crate::value::Value::record($label, $crate::count__!($($item)*)); + $(r__.fields_vec_mut().push($item);)* + r__.finish().wrap() + } + } +} diff --git a/implementations/rust/preserves/src/value/text/writer.rs b/implementations/rust/preserves/src/value/text/writer.rs index a1d2217..71acfc8 100644 --- a/implementations/rust/preserves/src/value/text/writer.rs +++ b/implementations/rust/preserves/src/value/text/writer.rs @@ -121,6 +121,10 @@ impl TextWriter { write!(self.w, " ") } } + + pub fn borrow_write(&mut self) -> &mut W { + &mut self.w + } } impl CompoundWriter for TextWriter { @@ -313,4 +317,8 @@ impl Writer for TextWriter { self.resume(ptr); Ok(()) } + + fn flush(&mut self) -> io::Result<()> { + self.w.flush() + } } diff --git a/implementations/rust/preserves/src/value/writer.rs b/implementations/rust/preserves/src/value/writer.rs index bbd222e..8cc5fd8 100644 --- a/implementations/rust/preserves/src/value/writer.rs +++ b/implementations/rust/preserves/src/value/writer.rs @@ -56,6 +56,8 @@ pub trait Writer: Sized { fn start_embedded(&mut self) -> io::Result; fn end_embedded(&mut self, ptr: Self::EmbeddedWriter) -> io::Result<()>; + fn flush(&mut self) -> io::Result<()>; + //--------------------------------------------------------------------------- fn write>(