mirror of
https://github.com/HeyPuter/firefox.git
synced 2026-11-13 20:14:57 -10:00
We're going to update the MSRV to 1.90 soon, and we might as well remove the hacks we have in place from bug 1982939 and bug 1995920 for vendoring backwards compatibility early. Differential Revision: https://phabricator.services.mozilla.com/D279628
writeable 
This crate defines [Writeable], a trait representing an object that can be written to a
sink implementing std::fmt::Write. It is an alternative to std::fmt::Display with the
addition of a function indicating the number of bytes to be written.
Writeable improves upon std::fmt::Display in two ways:
- More efficient, since the sink can pre-allocate bytes.
- Smaller code, since the format machinery can be short-circuited.
This crate also exports [TryWriteable], a writeable that supports a custom error.
Benchmarks
The benchmarks to generate the following data can be found in the benches directory.
| Case | Writeable |
Display |
|---|---|---|
| Create string from single-string message (139 chars) | 15.642 ns | 19.251 ns |
| Create string from complex message | 35.830 ns | 89.478 ns |
| Write complex message to buffer | 57.336 ns | 64.408 ns |
Examples
use std::fmt;
use writeable::assert_writeable_eq;
use writeable::LengthHint;
use writeable::Writeable;
struct WelcomeMessage<'s> {
pub name: &'s str,
}
impl<'s> Writeable for WelcomeMessage<'s> {
fn write_to<W: fmt::Write + ?Sized>(&self, sink: &mut W) -> fmt::Result {
sink.write_str("Hello, ")?;
sink.write_str(self.name)?;
sink.write_char('!')?;
Ok(())
}
fn writeable_length_hint(&self) -> LengthHint {
// "Hello, " + '!' + length of name
LengthHint::exact(8 + self.name.len())
}
}
let message = WelcomeMessage { name: "Alice" };
assert_writeable_eq!(&message, "Hello, Alice!");
// Types implementing `Writeable` are recommended to also implement `fmt::Display`.
// This can be simply done by redirecting to the `Writeable` implementation:
writeable::impl_display_with_writeable!(WelcomeMessage<'_>);
assert_eq!(message.to_string(), "Hello, Alice!");
More Information
For more information on development, authorship, contributing etc. please visit ICU4X home page.