use crate::LUInt;
use std::usize;
pub(crate) fn list_init(
flink: &mut [LUInt],
blink: &mut [LUInt],
nelem: usize,
nlist: usize,
min_list: Option<&mut usize>,
) {
for i in 0..nelem + nlist {
flink[i] = i as LUInt;
blink[i] = i as LUInt;
}
if let Some(min_list) = min_list {
*min_list = usize::max(1, nlist);
}
}
pub(crate) fn list_add(
elem: usize,
list: usize,
flink: &mut [LUInt],
blink: &mut [LUInt],
nelem: usize,
min_list: Option<&mut usize>,
) {
assert_eq!(flink[elem] as usize, elem);
assert_eq!(blink[elem] as usize, elem);
let temp = blink[nelem + list];
blink[nelem + list] = elem as LUInt;
blink[elem] = temp;
flink[temp as usize] = elem as LUInt;
flink[elem] = (nelem + list) as LUInt;
if let Some(min_list) = min_list {
if list > 0 && (list as usize) < *min_list {
*min_list = list as usize;
}
}
}
pub(crate) fn list_remove(flink: &mut [LUInt], blink: &mut [LUInt], elem: usize) {
flink[blink[elem] as usize] = flink[elem];
blink[flink[elem] as usize] = blink[elem];
flink[elem] = elem as LUInt;
blink[elem] = elem as LUInt;
}
pub(crate) fn list_move(
elem: usize,
list: usize,
flink: &mut [LUInt],
blink: &mut [LUInt],
nelem: usize,
min_list: Option<&mut usize>,
) {
list_remove(flink, blink, elem);
list_add(elem, list, flink, blink, nelem, min_list);
}
pub(crate) fn list_swap(flink: &mut [LUInt], blink: &mut [LUInt], e1: usize, e2: usize) {
let e1next = flink[e1] as usize;
let e2next = flink[e2] as usize;
let e1prev = blink[e1] as usize;
let e2prev = blink[e2] as usize;
assert_ne!(e1next, e1); assert_ne!(e2next, e2);
if e1next == e2 {
flink[e2] = e1 as LUInt;
blink[e1] = e2 as LUInt;
flink[e1prev] = e2 as LUInt;
blink[e2] = e1prev as LUInt;
flink[e1] = e2next as LUInt;
blink[e2next] = e1 as LUInt;
} else if e2next == e1 {
flink[e1] = e2 as LUInt;
blink[e2] = e1 as LUInt;
flink[e2] = e1next as LUInt;
blink[e1next] = e2 as LUInt;
flink[e2prev] = e1 as LUInt;
blink[e1] = e2prev as LUInt;
} else {
flink[e2] = e1next as LUInt;
blink[e1next] = e2 as LUInt;
flink[e2prev] = e1 as LUInt;
blink[e1] = e2prev as LUInt;
flink[e1prev] = e2 as LUInt;
blink[e2] = e1prev as LUInt;
flink[e1] = e2next as LUInt;
blink[e2next] = e1 as LUInt;
}
}