2个版本
0.1.1 | 2021年10月6日 |
---|---|
0.1.0 | 2021年10月5日 |
#953 in 数据结构
32KB
344 行
监视数据流以查找序列(或多个序列)
流序列监视器
包括一对结构,[SequenceWatcher] 和 [SequenceWatchers]。它们监视数据流以查找特定的值序列。
这个crate最初的目的是为了监视从stdin接收的字节数据,以查找指示输入线程应关闭的特定序列。最初只监视一个序列,但我添加了一种简单的方式来同时查找多个序列。
示例
预期行为和限制
- [SequenceWatcher] 和 [SequenceWatchers] 在检查返回true后都会继续监视流。例如,给定输入(A, A, A)时,查找序列(A, A)将返回false, true, true。
use seq_watcher::SequenceWatchers;
let test_stream = vec![
('A', false),
('A', false),
('A', true), // Matches AAA
('A', true), // Matches AAA
('B', false),
('A', true), // Matches ABA
('B', false),
('A', true), // Matches ABA
('A', false),
('A', true), // Matches AAA
('C', true), // Matches C
];
let watchers = SequenceWatchers::new(&[&['A', 'A', 'A'], &['A', 'B', 'A'], &['C']]);
for (ch, expect) in test_stream {
assert_eq!(watchers.check(&ch), expect);
}
给定空序列的[SequenceWatcher] 和 [SequenceWatchers] 总是返回false。
# use seq_watcher::SequenceWatchers;
let mut watcher = SequenceWatchers::new(&[]); // Create empty watchers.
let mut watchers = SequenceWatchers::new(&[]); // Create empty watchers.
let mut all_bytes = Vec::with_capacity(256);
for b in 0..=u8::MAX {
assert_eq!(watcher.check(&b), false); // With no sequence, all checks are false.
assert_eq!(watchers.check(&b), false); // With no sequences, all checks are false.
all_bytes.push(b); // Generate sequence with all bytes.
}
watchers.add(&[]); // Add of empty sequence does nothing.
watchers.add(&all_bytes); // Add sequuence with all bytes.
for b in 0..u8::MAX {
assert_eq!(watchers.check(&b), false); // Until sequence recieves the last byte, false.
}
assert_eq!(watchers.check(&u8::MAX), true); // With last byte in sequence, returns true.
- 对于[SequenceWatchers],兼容的数据类型比[SequenceWatcher]更有限制。[SequenceWatchers]需要数据类型为[Eq],而[SequenceWatcher]只需要[PartialEq]。
浮点类型是[PartialEq],但不是[Eq]。
# use seq_watcher::SequenceWatchers;
let watchers = SequenceWatchers::new(&[0.0]); // Float values are not Eq
# use seq_watcher::SequenceWatcher;
let watcher = SequenceWatcher::new(&[0.0]); // Float values are PartialEq.
性能
[SequenceWatcher]结构性能相当好,但[SequenceWatchers]结构需要改进。[SequenceWatchers]当前实现为[SequenceWatcher]结构的[HashMap],但最好以某种多状态感知的trie实现。由于主要需要[SequenceWatcher]用于另一个项目,因此[SequenceWatchers]是后来才考虑的。