[−][src]Crate line_wrap
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.
Structs
ByteLineEnding |
A single byte line ending. |
SliceLineEnding |
A byte slice line ending. |
TwoByteLineEnding |
A double byte line ending. |
Traits
LineEnding |
Writes line endings. |
Functions
crlf |
Windows-style line ending. |
lf |
Unix-style line ending. |
line_wrap |
Insert line endings into the input. |