#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Item {
pub id: usize,
pub len: usize,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Sequence {
pub id: usize,
pub length: usize,
pub tokens: Option<Vec<u32>>,
}
impl Sequence {
pub fn new(id: usize, length: usize) -> Self {
Self {
id,
length,
tokens: None,
}
}
pub fn with_tokens(id: usize, tokens: Vec<u32>) -> Self {
let length = tokens.len();
Self {
id,
length,
tokens: Some(tokens),
}
}
pub fn len(&self) -> usize {
self.length
}
pub fn is_empty(&self) -> bool {
self.length == 0
}
pub fn to_item(&self) -> Item {
Item {
id: self.id,
len: self.length,
}
}
}
impl Ord for Sequence {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.length.cmp(&other.length)
}
}
impl PartialOrd for Sequence {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl From<&Sequence> for Item {
fn from(seq: &Sequence) -> Self {
Item {
id: seq.id,
len: seq.length,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_item_is_copy() {
let a = Item { id: 0, len: 512 };
let b = a; assert_eq!(a.id, b.id); }
#[test]
fn test_sequence_new() {
let seq = Sequence::new(0, 512);
assert_eq!(seq.id, 0);
assert_eq!(seq.len(), 512);
assert!(seq.tokens.is_none());
}
#[test]
fn test_sequence_with_tokens() {
let seq = Sequence::with_tokens(1, vec![10, 20, 30]);
assert_eq!(seq.len(), 3);
assert_eq!(seq.tokens.as_ref().unwrap().len(), 3);
}
#[test]
fn test_sequence_is_empty() {
assert!(Sequence::new(0, 0).is_empty());
assert!(!Sequence::new(0, 1).is_empty());
}
#[test]
fn test_to_item() {
let seq = Sequence::new(5, 42);
let item = seq.to_item();
assert_eq!(item.id, 5);
assert_eq!(item.len, 42);
}
#[test]
fn test_item_from_sequence_ref() {
let seq = Sequence::new(5, 42);
let item = Item::from(&seq);
assert_eq!(item.id, 5);
assert_eq!(item.len, 42);
}
#[test]
fn test_sequence_ordering() {
let a = Sequence::new(0, 100);
let b = Sequence::new(1, 200);
assert!(a < b);
}
#[test]
fn test_sequence_sort_descending() {
let mut seqs = vec![
Sequence::new(0, 30),
Sequence::new(1, 10),
Sequence::new(2, 20),
];
seqs.sort_by(|a, b| b.cmp(a)); assert_eq!(seqs[0].length, 30);
assert_eq!(seqs[1].length, 20);
assert_eq!(seqs[2].length, 10);
}
}