[meta] Implement UniqueTable in the Rust crate;

... and also rename the previously-named UniqueTable to UniqueSeqTable,
which is the name used in the Python code.
This commit is contained in:
Benjamin Bouvier
2019-03-11 17:20:50 +01:00
parent 72b0d26ee9
commit 393b88af6e
2 changed files with 43 additions and 4 deletions

View File

@@ -7,7 +7,7 @@ use crate::constant_hash::{generate_table, simple_hash};
use crate::error; use crate::error;
use crate::shared; use crate::shared;
use crate::srcgen::{Formatter, Match}; use crate::srcgen::{Formatter, Match};
use crate::unique_table::UniqueTable; use crate::unique_table::UniqueSeqTable;
use std::collections::HashMap; use std::collections::HashMap;
enum ParentGroup { enum ParentGroup {
@@ -238,7 +238,7 @@ impl<'a> SettingOrPreset<'a> {
/// Emits DESCRIPTORS, ENUMERATORS, HASH_TABLE and PRESETS. /// Emits DESCRIPTORS, ENUMERATORS, HASH_TABLE and PRESETS.
fn gen_descriptors(group: &SettingGroup, fmt: &mut Formatter) { fn gen_descriptors(group: &SettingGroup, fmt: &mut Formatter) {
let mut enum_table: UniqueTable<&'static str> = UniqueTable::new(); let mut enum_table = UniqueSeqTable::new();
let mut descriptor_index_map: HashMap<SettingOrPreset, usize> = HashMap::new(); let mut descriptor_index_map: HashMap<SettingOrPreset, usize> = HashMap::new();

View File

@@ -1,15 +1,54 @@
use std::collections::HashMap;
use std::hash::Hash;
use std::slice; use std::slice;
/// Collect items into the `table` list, removing duplicates.
pub struct UniqueTable<'entries, T: Eq + Hash> {
table: Vec<&'entries T>,
map: HashMap<&'entries T, usize>,
}
impl<'entries, T: Eq + Hash> UniqueTable<'entries, T> {
pub fn new() -> Self {
Self {
table: Vec::new(),
map: HashMap::new(),
}
}
pub fn add(&mut self, entry: &'entries T) -> usize {
match self.map.get(&entry) {
None => {
let i = self.table.len();
self.table.push(entry);
self.map.insert(entry, i);
i
}
Some(&i) => i,
}
}
pub fn len(&self) -> usize {
self.table.len()
}
pub fn iter(&self) -> slice::Iter<&'entries T> {
self.table.iter()
}
}
/// A table of sequences which tries to avoid common subsequences. /// A table of sequences which tries to avoid common subsequences.
pub struct UniqueTable<T: PartialEq + Clone> { pub struct UniqueSeqTable<T: PartialEq + Clone> {
table: Vec<T>, table: Vec<T>,
} }
impl<T: PartialEq + Clone> UniqueTable<T> { impl<T: PartialEq + Clone> UniqueSeqTable<T> {
pub fn new() -> Self { pub fn new() -> Self {
Self { table: Vec::new() } Self { table: Vec::new() }
} }
pub fn add(&mut self, values: &Vec<T>) -> usize { pub fn add(&mut self, values: &Vec<T>) -> usize {
if values.len() == 0 {
return 0;
}
if let Some(offset) = find_subsequence(values, &self.table) { if let Some(offset) = find_subsequence(values, &self.table) {
offset offset
} else { } else {