noodles_vcf/header/string_maps/
string_map.rs1use std::{collections::HashMap, mem};
2
3#[derive(Clone, Debug, Default, Eq, PartialEq)]
9pub struct StringMap {
10 pub(super) indices: HashMap<String, usize>,
11 pub(super) entries: Vec<Option<String>>,
12}
13
14impl StringMap {
15 pub fn get_index(&self, i: usize) -> Option<&str> {
25 self.entries.get(i).and_then(|entry| entry.as_deref())
26 }
27
28 pub fn get_index_of(&self, value: &str) -> Option<usize> {
38 self.indices.get(value).copied()
39 }
40
41 pub(super) fn get_full(&self, value: &str) -> Option<(usize, &str)> {
42 self.get_index_of(value)
43 .and_then(|i| self.get_index(i).map(|entry| (i, entry)))
44 }
45
46 #[doc(hidden)]
47 pub fn insert(&mut self, value: String) -> Option<String> {
48 self.insert_full(value).1
49 }
50
51 fn insert_full(&mut self, value: String) -> (usize, Option<String>) {
52 match self.get_index_of(&value) {
53 Some(i) => {
54 let entry = mem::replace(&mut self.entries[i], Some(value));
55 (i, entry)
56 }
57 None => {
58 let i = self.push(value);
59 (i, None)
60 }
61 }
62 }
63
64 pub(super) fn insert_at(&mut self, i: usize, value: String) -> Option<String> {
65 if i >= self.entries.len() {
66 self.entries.resize(i + 1, None);
67 }
68
69 self.indices.insert(value.clone(), i);
70 mem::replace(&mut self.entries[i], Some(value))
71 }
72
73 fn push(&mut self, value: String) -> usize {
74 let i = self.entries.len();
75
76 self.indices.insert(value.clone(), i);
77 self.entries.push(Some(value));
78
79 i
80 }
81}