use std::io::Write;
pub fn fold_bytes(
data: &[u8],
width: usize,
count_bytes: bool,
break_at_spaces: bool,
out: &mut impl Write,
) -> std::io::Result<()> {
if data.is_empty() {
return Ok(());
}
if width == 0 {
return fold_width_zero(data, out);
}
if count_bytes {
if break_at_spaces {
return fold_byte_fast_spaces(data, width, out);
} else {
return fold_byte_fast(data, width, out);
}
}
if memchr::memchr(b'\t', data).is_none() {
if break_at_spaces {
return fold_byte_fast_spaces(data, width, out);
} else {
return fold_byte_fast(data, width, out);
}
}
fold_column_mode_streaming(data, width, break_at_spaces, out)
}
fn fold_width_zero(data: &[u8], out: &mut impl Write) -> std::io::Result<()> {
let output = vec![b'\n'; data.len()];
out.write_all(&output)
}
const FOLD_BYTE_PARALLEL_THRESHOLD: usize = 32 * 1024 * 1024;
fn fold_byte_fast(data: &[u8], width: usize, out: &mut impl Write) -> std::io::Result<()> {
if data.len() >= FOLD_BYTE_PARALLEL_THRESHOLD {
return fold_byte_fast_parallel(data, width, out);
}
const BUF_CAP: usize = 1024 * 1024 + 4096;
let mut buf: Vec<u8> = Vec::with_capacity(BUF_CAP);
let src = data.as_ptr();
let mut wp: usize = 0;
let mut base = buf.as_mut_ptr();
let mut seg_start = 0usize;
for nl_pos in memchr::memchr_iter(b'\n', data) {
let seg_len = nl_pos - seg_start;
if seg_len <= width {
let total = seg_len + 1;
if wp + total > BUF_CAP {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
buf.clear();
wp = 0;
base = buf.as_mut_ptr();
}
unsafe {
std::ptr::copy_nonoverlapping(src.add(seg_start), base.add(wp), total);
}
wp += total;
} else {
let mut off = seg_start;
let end = nl_pos;
while off + width < end {
let chunk = width + 1;
if wp + chunk > BUF_CAP {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
buf.clear();
wp = 0;
base = buf.as_mut_ptr();
}
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), width);
*base.add(wp + width) = b'\n';
}
wp += chunk;
off += width;
}
let rem = end - off + 1;
if wp + rem > BUF_CAP {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
buf.clear();
wp = 0;
base = buf.as_mut_ptr();
}
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), rem);
}
wp += rem;
}
seg_start = nl_pos + 1;
}
if seg_start < data.len() {
let mut off = seg_start;
let end = data.len();
while off + width < end {
let chunk = width + 1;
if wp + chunk > BUF_CAP {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
buf.clear();
wp = 0;
base = buf.as_mut_ptr();
}
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), width);
*base.add(wp + width) = b'\n';
}
wp += chunk;
off += width;
}
if off < end {
let rem = end - off;
if wp + rem > BUF_CAP {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
buf.clear();
wp = 0;
base = buf.as_mut_ptr();
}
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), rem);
}
wp += rem;
}
}
if wp > 0 {
unsafe { buf.set_len(wp) };
out.write_all(&buf)?;
}
Ok(())
}
fn fold_byte_fast_parallel(data: &[u8], width: usize, out: &mut impl Write) -> std::io::Result<()> {
use rayon::prelude::*;
let num_chunks = rayon::current_num_threads().max(2);
let target_chunk_size = data.len() / num_chunks;
let mut chunks: Vec<&[u8]> = Vec::with_capacity(num_chunks + 1);
let mut pos: usize = 0;
for _ in 0..num_chunks - 1 {
if pos >= data.len() {
break;
}
let target_end = (pos + target_chunk_size).min(data.len());
let chunk_end = if target_end >= data.len() {
data.len()
} else {
match memchr::memchr(b'\n', &data[target_end..]) {
Some(off) => target_end + off + 1,
None => data.len(),
}
};
chunks.push(&data[pos..chunk_end]);
pos = chunk_end;
}
if pos < data.len() {
chunks.push(&data[pos..]);
}
let results: Vec<Vec<u8>> = chunks
.par_iter()
.map(|chunk| {
let mut buf = Vec::with_capacity(chunk.len() + chunk.len() / width + 256);
fold_byte_chunk(chunk, width, &mut buf);
buf
})
.collect();
for result in &results {
if !result.is_empty() {
out.write_all(result)?;
}
}
Ok(())
}
fn fold_byte_chunk(data: &[u8], width: usize, buf: &mut Vec<u8>) {
if data.is_empty() {
return;
}
let needed = data.len() + data.len() / width + 256;
buf.reserve(needed);
let base = buf.as_mut_ptr();
let src = data.as_ptr();
let initial_len = buf.len();
let mut wp: usize = initial_len;
let mut seg_start = 0usize;
for nl_pos in memchr::memchr_iter(b'\n', data) {
let seg_len = nl_pos - seg_start;
if seg_len <= width {
let total = seg_len + 1;
unsafe {
std::ptr::copy_nonoverlapping(src.add(seg_start), base.add(wp), total);
}
wp += total;
} else {
let mut off = seg_start;
let end = nl_pos;
while off + width < end {
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), width);
*base.add(wp + width) = b'\n';
}
wp += width + 1;
off += width;
}
let rem = end - off + 1;
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), rem);
}
wp += rem;
}
seg_start = nl_pos + 1;
}
if seg_start < data.len() {
let mut off = seg_start;
let end = data.len();
while off + width < end {
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), width);
*base.add(wp + width) = b'\n';
}
wp += width + 1;
off += width;
}
if off < end {
let rem = end - off;
unsafe {
std::ptr::copy_nonoverlapping(src.add(off), base.add(wp), rem);
}
wp += rem;
}
}
unsafe {
buf.set_len(wp);
}
}
fn fold_byte_fast_spaces(data: &[u8], width: usize, out: &mut impl Write) -> std::io::Result<()> {
if data.len() >= FOLD_BYTE_PARALLEL_THRESHOLD {
return fold_byte_spaces_parallel(data, width, out);
}
let mut outbuf: Vec<u8> = Vec::with_capacity(1024 * 1024 + 4096);
let mut pos: usize = 0;
for nl_pos in memchr::memchr_iter(b'\n', data) {
let segment = &data[pos..nl_pos];
fold_segment_bytes_spaces_buffered(segment, width, &mut outbuf);
outbuf.push(b'\n');
pos = nl_pos + 1;
if outbuf.len() >= 1024 * 1024 {
out.write_all(&outbuf)?;
outbuf.clear();
}
}
if pos < data.len() {
fold_segment_bytes_spaces_buffered(&data[pos..], width, &mut outbuf);
}
if !outbuf.is_empty() {
out.write_all(&outbuf)?;
}
Ok(())
}
fn fold_byte_spaces_parallel(
data: &[u8],
width: usize,
out: &mut impl Write,
) -> std::io::Result<()> {
use rayon::prelude::*;
let num_chunks = rayon::current_num_threads().max(2);
let target_chunk_size = data.len() / num_chunks;
let mut chunks: Vec<&[u8]> = Vec::with_capacity(num_chunks + 1);
let mut pos: usize = 0;
for _ in 0..num_chunks - 1 {
if pos >= data.len() {
break;
}
let target_end = (pos + target_chunk_size).min(data.len());
let chunk_end = if target_end >= data.len() {
data.len()
} else {
match memchr::memchr(b'\n', &data[target_end..]) {
Some(off) => target_end + off + 1,
None => data.len(),
}
};
chunks.push(&data[pos..chunk_end]);
pos = chunk_end;
}
if pos < data.len() {
chunks.push(&data[pos..]);
}
let results: Vec<Vec<u8>> = chunks
.par_iter()
.map(|chunk| {
let mut buf = Vec::with_capacity(chunk.len() + chunk.len() / width + 256);
fold_byte_spaces_chunk(chunk, width, &mut buf);
buf
})
.collect();
for result in &results {
if !result.is_empty() {
out.write_all(result)?;
}
}
Ok(())
}
fn fold_byte_spaces_chunk(data: &[u8], width: usize, outbuf: &mut Vec<u8>) {
let mut pos: usize = 0;
for nl_pos in memchr::memchr_iter(b'\n', data) {
let segment = &data[pos..nl_pos];
fold_segment_bytes_spaces_buffered(segment, width, outbuf);
outbuf.push(b'\n');
pos = nl_pos + 1;
}
if pos < data.len() {
fold_segment_bytes_spaces_buffered(&data[pos..], width, outbuf);
}
}
const FOLD_PARALLEL_THRESHOLD: usize = 4 * 1024 * 1024;
fn fold_column_mode_streaming(
data: &[u8],
width: usize,
break_at_spaces: bool,
out: &mut impl Write,
) -> std::io::Result<()> {
if break_at_spaces {
return fold_column_mode_spaces_streaming(data, width, out);
}
if data.len() >= FOLD_PARALLEL_THRESHOLD {
return fold_column_parallel(data, width, out);
}
let mut outbuf: Vec<u8> = Vec::with_capacity(data.len() + data.len() / 4);
fold_column_chunk(data, width, &mut outbuf);
if !outbuf.is_empty() {
out.write_all(&outbuf)?;
}
Ok(())
}
fn fold_column_parallel(data: &[u8], width: usize, out: &mut impl Write) -> std::io::Result<()> {
use rayon::prelude::*;
let num_chunks = rayon::current_num_threads().max(2);
let target_chunk_size = data.len() / num_chunks;
let mut chunks: Vec<&[u8]> = Vec::with_capacity(num_chunks + 1);
let mut pos: usize = 0;
for _ in 0..num_chunks - 1 {
if pos >= data.len() {
break;
}
let target_end = (pos + target_chunk_size).min(data.len());
let chunk_end = if target_end >= data.len() {
data.len()
} else {
match memchr::memchr(b'\n', &data[target_end..]) {
Some(off) => target_end + off + 1,
None => data.len(),
}
};
chunks.push(&data[pos..chunk_end]);
pos = chunk_end;
}
if pos < data.len() {
chunks.push(&data[pos..]);
}
let results: Vec<Vec<u8>> = chunks
.par_iter()
.map(|chunk| {
let mut buf = Vec::with_capacity(chunk.len() + chunk.len() / 4);
fold_column_chunk(chunk, width, &mut buf);
buf
})
.collect();
for result in &results {
if !result.is_empty() {
out.write_all(result)?;
}
}
Ok(())
}
fn fold_column_chunk(data: &[u8], width: usize, outbuf: &mut Vec<u8>) {
if data.is_empty() {
return;
}
let worst = data.len() * 2 + 4096;
outbuf.reserve(worst);
let src = data.as_ptr();
let out_base = outbuf.as_mut_ptr();
let initial_len = outbuf.len();
let mut wp: usize = initial_len;
let mut col: usize = 0;
let mut seg_start: usize = 0;
let mut i: usize = 0;
while i < data.len() {
match memchr::memchr2(b'\t', b'\n', &data[i..]) {
Some(off) => {
let special_pos = i + off;
let run_len = special_pos - i;
if col + run_len > width {
loop {
let remaining = special_pos - i;
let fit = width - col;
if fit >= remaining {
col += remaining;
i = special_pos;
break;
}
let copy_len = i + fit - seg_start;
unsafe {
std::ptr::copy_nonoverlapping(
src.add(seg_start),
out_base.add(wp),
copy_len,
);
wp += copy_len;
*out_base.add(wp) = b'\n';
wp += 1;
}
i += fit;
seg_start = i;
col = 0;
}
} else {
col += run_len;
i = special_pos;
}
if data[i] == b'\n' {
let copy_len = i + 1 - seg_start;
unsafe {
std::ptr::copy_nonoverlapping(
src.add(seg_start),
out_base.add(wp),
copy_len,
);
}
wp += copy_len;
col = 0;
i += 1;
seg_start = i;
} else {
let new_col = ((col >> 3) + 1) << 3;
if new_col > width && col > 0 {
let copy_len = i - seg_start;
unsafe {
std::ptr::copy_nonoverlapping(
src.add(seg_start),
out_base.add(wp),
copy_len,
);
wp += copy_len;
*out_base.add(wp) = b'\n';
wp += 1;
}
seg_start = i;
col = 0;
continue;
}
col = new_col;
i += 1;
}
}
None => {
let remaining = data.len() - i;
if col + remaining > width {
loop {
let rem_now = data.len() - i;
let fit = width - col;
if fit >= rem_now {
break;
}
let copy_len = i + fit - seg_start;
unsafe {
std::ptr::copy_nonoverlapping(
src.add(seg_start),
out_base.add(wp),
copy_len,
);
wp += copy_len;
*out_base.add(wp) = b'\n';
wp += 1;
}
i += fit;
seg_start = i;
col = 0;
}
}
break;
}
}
}
if seg_start < data.len() {
let copy_len = data.len() - seg_start;
unsafe {
std::ptr::copy_nonoverlapping(src.add(seg_start), out_base.add(wp), copy_len);
}
wp += copy_len;
}
unsafe {
outbuf.set_len(wp);
}
}
#[inline]
fn fold_segment_bytes_spaces_buffered(segment: &[u8], width: usize, outbuf: &mut Vec<u8>) {
let mut start = 0;
while start + width < segment.len() {
let chunk = &segment[start..start + width];
match memchr::memrchr2(b' ', b'\t', chunk) {
Some(sp_offset) => {
let break_at = start + sp_offset + 1;
outbuf.extend_from_slice(&segment[start..break_at]);
outbuf.push(b'\n');
start = break_at;
}
None => {
outbuf.extend_from_slice(&segment[start..start + width]);
outbuf.push(b'\n');
start += width;
}
}
}
if start < segment.len() {
outbuf.extend_from_slice(&segment[start..]);
}
}
fn fold_column_mode_spaces_streaming(
data: &[u8],
width: usize,
out: &mut impl Write,
) -> std::io::Result<()> {
if memchr::memchr(b'\t', data).is_none() {
return fold_byte_fast_spaces(data, width, out);
}
let mut pos = 0;
let mut outbuf: Vec<u8> = Vec::with_capacity(1024 * 1024 + 4096);
for nl_pos in memchr::memchr_iter(b'\n', data) {
let line = &data[pos..nl_pos];
if line.len() <= width && memchr::memchr(b'\t', line).is_none() {
outbuf.extend_from_slice(line);
} else {
fold_column_spaces_fast(line, width, &mut outbuf);
}
outbuf.push(b'\n');
if outbuf.len() >= 1024 * 1024 {
out.write_all(&outbuf)?;
outbuf.clear();
}
pos = nl_pos + 1;
}
if pos < data.len() {
let line = &data[pos..];
if line.len() <= width && memchr::memchr(b'\t', line).is_none() {
outbuf.extend_from_slice(line);
} else {
fold_column_spaces_fast(line, width, &mut outbuf);
}
}
if !outbuf.is_empty() {
out.write_all(&outbuf)?;
}
Ok(())
}
#[inline]
fn fold_column_spaces_fast(line: &[u8], width: usize, outbuf: &mut Vec<u8>) {
let mut col: usize = 0;
let mut seg_start: usize = 0;
let mut last_space_after: usize = 0;
let mut has_space = false;
let mut i: usize = 0;
while i < line.len() {
let b = line[i];
if b == b'\t' {
let new_col = ((col >> 3) + 1) << 3;
if new_col > width && col > 0 {
if has_space {
outbuf.extend_from_slice(&line[seg_start..last_space_after]);
outbuf.push(b'\n');
seg_start = last_space_after;
col = recalc_column(&line[seg_start..i]);
has_space = false;
continue; }
outbuf.extend_from_slice(&line[seg_start..i]);
outbuf.push(b'\n');
seg_start = i;
col = 0;
continue; }
has_space = true;
last_space_after = i + 1;
col = new_col;
i += 1;
} else if b == b' ' {
col += 1;
if col > width {
if has_space {
outbuf.extend_from_slice(&line[seg_start..last_space_after]);
outbuf.push(b'\n');
seg_start = last_space_after;
col = recalc_column(&line[seg_start..i]);
has_space = false;
continue; }
outbuf.extend_from_slice(&line[seg_start..i]);
outbuf.push(b'\n');
seg_start = i;
col = 1; has_space = true;
last_space_after = i + 1;
i += 1;
continue;
}
has_space = true;
last_space_after = i + 1;
i += 1;
} else {
let run_end = match memchr::memchr2(b'\t', b' ', &line[i + 1..]) {
Some(off) => i + 1 + off,
None => line.len(),
};
let run_remaining = run_end - i;
if col + run_remaining <= width {
col += run_remaining;
i = run_end;
} else {
let mut j = i;
loop {
let rem = run_end - j;
if col + rem <= width {
col += rem;
i = run_end;
break;
}
if has_space {
outbuf.extend_from_slice(&line[seg_start..last_space_after]);
outbuf.push(b'\n');
seg_start = last_space_after;
col = j - seg_start; has_space = false;
continue; }
let fit = width - col;
outbuf.extend_from_slice(&line[seg_start..j + fit]);
outbuf.push(b'\n');
j += fit;
seg_start = j;
col = 0;
}
}
}
}
if seg_start < line.len() {
outbuf.extend_from_slice(&line[seg_start..]);
}
}
#[inline]
fn char_info(data: &[u8], pos: usize) -> (usize, usize) {
let b = data[pos];
if b < 0x80 {
if b < 0x20 || b == 0x7f {
(0, 1)
} else {
(1, 1)
}
} else {
(1, 1)
}
}
pub fn fold_is_passthrough(data: &[u8], width: usize, count_bytes: bool) -> bool {
if width == 0 || data.is_empty() {
return data.is_empty();
}
if !count_bytes && memchr::memchr(b'\t', data).is_some() {
return false;
}
let mut prev = 0;
for nl_pos in memchr::memchr_iter(b'\n', data) {
if nl_pos - prev > width {
return false;
}
prev = nl_pos + 1;
}
data.len() - prev <= width
}
fn recalc_column(data: &[u8]) -> usize {
let mut col = 0;
let mut i = 0;
while i < data.len() {
let b = data[i];
if b == b'\r' {
col = 0;
i += 1;
} else if b == b'\t' {
col = ((col / 8) + 1) * 8;
i += 1;
} else if b == b'\x08' {
if col > 0 {
col -= 1;
}
i += 1;
} else if b < 0x80 {
if b >= 0x20 && b != 0x7f {
col += 1;
}
i += 1;
} else {
let (cw, byte_len) = char_info(data, i);
col += cw;
i += byte_len;
}
}
col
}