3 unstable releases
0.2.0 | Feb 23, 2024 |
---|---|
0.1.1 | Oct 27, 2018 |
0.1.0 | Oct 27, 2018 |
#405 in Encoding
201,122 downloads per month
Used in 37 crates
(via creator-plist)
22KB
390 lines
See the docs for usage info.
This line-wrapping logic originally was part of rust-base64.
lib.rs
:
Efficiently insert line endings.
If you have a buffer full of data and want to insert any sort of regularly-spaced separator,
this will do it with a minimum of data copying. Commonly, this is to insert \n
(see lf()
) or \r\n
(crlf()
), but
any byte sequence can be used.
- Pick a line ending. For single byte separators, see
ByteLineEnding
, or for two bytes,TwoByteLineEnding
. For arbitrary byte slices, useSliceLineEnding
. - Call
line_wrap
. - Your data has been rearranged in place with the specified line ending inserted.
Examples
use line_wrap::*;
// suppose we have 80 bytes of data in a buffer and we want to wrap as per MIME.
// Buffer is large enough to hold line endings.
let mut data = vec![0; 82];
assert_eq!(2, line_wrap(&mut data, 80, 76, &crlf()));
// first line of zeroes
let mut expected_data = vec![0; 76];
// line ending
expected_data.extend_from_slice(b"\r\n");
// next line
expected_data.extend_from_slice(&[0, 0, 0, 0]);
assert_eq!(expected_data, data);
Performance
On an i7 6850k:
- 10 byte input, 1 byte line length takes ~60ns (~160MiB/s)
- 100 byte input, 10 byte lines takes ~60ns (~1.6GiB/s)
- Startup costs dominate at these small lengths
- 1,000 byte input, 100 byte lines takes ~65ns (~15GiB/s)
- 10,000 byte input, 100 byte lines takes ~550ns (~17GiB/s)
- In general,
SliceLineEncoding
is about 75% the speed of the fixed-length impls.
Naturally, try cargo +nightly bench
on your hardware to get more representative data.