use f2rust_std::{CharArray, CharArrayMut};
#[derive(Clone)]
pub struct CharVec {
data: Vec<u8>,
element_length: usize,
}
impl CharVec {
pub fn new(element_length: usize) -> Self {
Self {
data: Vec::new(),
element_length,
}
}
pub fn element_length(&self) -> usize {
self.element_length
}
pub fn len(&self) -> usize {
self.data.len() / self.element_length
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn push(&mut self, value: &str) {
self.data.extend(value.bytes().take(self.element_length));
if value.len() < self.element_length {
self.data
.extend(std::iter::repeat_n(b' ', self.element_length - value.len()));
}
}
pub fn resize(&mut self, new_len: usize) {
self.data.resize(new_len * self.element_length, b' ');
}
pub fn as_arg(&self) -> CharArray {
CharArray::new(&self.data, self.element_length)
}
pub fn as_arg_mut(&mut self) -> CharArrayMut {
CharArrayMut::new(&mut self.data, self.element_length)
}
pub fn get(&self, index: usize) -> &str {
let b = &self.data[index * self.element_length..(index + 1) * self.element_length];
let b = if let Some(end) = b.iter().rposition(|c| *c != b' ') {
&b[..=end]
} else {
b""
};
std::str::from_utf8(b).expect("CharVec contains invalid UTF-8 bytes")
}
pub fn set(&mut self, index: usize, value: &str) {
let b = &mut self.data[index * self.element_length..(index + 1) * self.element_length];
f2rust_std::fstr::assign(b, value.as_bytes());
}
pub fn iter(&self) -> impl Iterator<Item = &str> {
(0..self.len()).map(|i| self.get(i))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic() {
let mut vec = CharVec::new(10);
assert_eq!(vec.len(), 0);
vec.push("Hello ");
assert_eq!(vec.len(), 1);
assert_eq!(vec.get(0), "Hello");
vec.resize(5);
assert_eq!(vec.len(), 5);
assert_eq!(vec.get(0), "Hello");
assert_eq!(vec.get(4), "");
vec.set(2, "world6789abcdefg");
assert_eq!(
vec.iter().collect::<Vec<_>>(),
["Hello", "", "world6789a", "", ""]
);
}
}