#data-stream #sequence #monitoring #multiple #structures #pair #monitors

seq_watcher

用于监视一个或多个序列数据流的成对结构

2个版本

0.1.1 2021年10月6日
0.1.0 2021年10月5日

#953 in 数据结构

MIT 许可证

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]是后来才考虑的。

无运行时依赖