use crate::lu::list::list_move;
use crate::LUInt;
pub(crate) fn file_empty(
nlines: usize,
begin: &mut [LUInt],
end: &mut [LUInt],
next: &mut [LUInt],
prev: &mut [LUInt],
fmem: LUInt,
) {
begin[nlines as usize] = 0;
end[nlines as usize] = fmem;
for i in 0..nlines {
begin[i as usize] = 0;
end[i as usize] = 0;
}
for i in 0..nlines {
next[i as usize] = (i + 1) as LUInt;
prev[i as usize + 1] = i as LUInt;
}
next[nlines as usize] = 0;
prev[0] = nlines as LUInt;
}
pub(crate) fn file_reappend(
line: usize,
nlines: usize,
begin: &mut [LUInt],
end: &mut [LUInt],
next: &mut [LUInt],
prev: &mut [LUInt],
index: &mut [LUInt],
value: &mut [f64],
extra_space: usize,
) {
let fmem = end[nlines];
let mut used = begin[nlines];
let room = fmem - used;
let ibeg = begin[line]; let iend = end[line];
begin[line] = used; assert!(iend - ibeg <= room);
for pos in ibeg..iend {
index[used as usize] = index[pos as usize];
value[used as usize] = value[pos as usize];
used += 1
}
end[line] = used;
let room = fmem - used;
assert!(room >= extra_space as LUInt);
used += extra_space as LUInt;
begin[nlines] = used; list_move(line, 0, next, prev, nlines, None);
}
pub(crate) fn file_compress(
nlines: usize,
begin: &mut [LUInt],
end: &mut [LUInt],
next: &[LUInt],
index: &mut [LUInt],
value: &mut [f64],
stretch: f64,
pad: usize,
) -> usize {
let mut nz = 0;
let mut used = 0;
let mut extra_space = 0;
let mut i = next[nlines as usize];
while i < nlines as LUInt {
let ibeg = begin[i as usize];
let iend = end[i as usize];
assert!(ibeg >= used);
used += extra_space;
if used > ibeg {
used = ibeg; }
begin[i as usize] = used;
for pos in ibeg..iend {
index[used as usize] = index[pos as usize];
value[used as usize] = value[pos as usize];
used += 1;
}
end[i as usize] = used;
extra_space = (stretch * (iend - ibeg) as f64) as LUInt + pad as LUInt;
nz += (iend - ibeg) as usize;
i = next[i as usize];
}
assert!(used <= begin[nlines as usize]);
used += extra_space;
if used > begin[nlines as usize] {
used = begin[nlines as usize]; }
begin[nlines as usize] = used;
nz
}
pub(crate) fn file_diff(
nrow: usize,
begin_row: &[LUInt],
end_row: &[LUInt],
begin_col: &[LUInt],
end_col: &[LUInt],
index: &[LUInt],
value: Option<&[f64]>,
) -> LUInt {
let mut ndiff = 0;
for i in 0..nrow {
for pos in begin_row[i]..end_row[i] {
let j = index[pos as usize] as usize;
let mut where_ = begin_col[j];
while where_ < end_col[j] && index[where_ as usize] != i as LUInt {
where_ += 1;
}
if where_ == end_col[j] {
ndiff += 1;
} else if let Some(value) = value {
if value[pos as usize] != value[where_ as usize] {
ndiff += 1;
}
}
}
}
ndiff
}