#[derive(Debug, Clone)] enum Action {
Insert {
name: HeaderName, // Name to insert
val: HeaderValue, // Value to insert
old: Option<HeaderValue>, // Old value
},
Append {
name: HeaderName,
val: HeaderValue,
ret: bool,
},
Remove {
name: HeaderName, // Name to remove
val: Option<HeaderValue>, // Value to get
},
}
// An alternate implementation of HeaderMap backed by HashMap #[derive(Debug, Clone, Default)] struct AltMap {
map: HashMap<HeaderName, Vec<HeaderValue>>,
}
/// This will also apply the action against `self` fn gen_action(&mutself, weight: &Weight, rng: &mut StdRng) -> Action { let sum = weight.insert + weight.remove + weight.append;
letmut num = rng.gen_range(0..sum);
if num < weight.insert { returnself.gen_insert(rng);
}
num -= weight.insert;
if num < weight.remove { returnself.gen_remove(rng);
}
num -= weight.remove;
if num < weight.append { returnself.gen_append(rng);
}
unreachable!();
}
fn gen_insert(&mutself, rng: &mut StdRng) -> Action { let name = self.gen_name(4, rng); let val = gen_header_value(rng); let old = self.insert(name.clone(), val.clone());
Action::Insert { name, val, old }
}
fn gen_remove(&mutself, rng: &mut StdRng) -> Action { let name = self.gen_name(-4, rng); let val = self.remove(&name);
Action::Remove { name, val }
}
fn gen_append(&mutself, rng: &mut StdRng) -> Action { let name = self.gen_name(-5, rng); let val = gen_header_value(rng);
let vals = self.map.entry(name.clone()).or_insert(vec![]);
let ret = !vals.is_empty();
vals.push(val.clone());
for (key, val) in &self.map { // Test get
assert_eq!(other.get(key), val.get(0));
// Test get_all let vals = other.get_all(key); let actual: Vec<_> = vals.iter().collect();
assert_eq!(&actual[..], &val[..]);
}
}
}
impl Action { fn apply(self, map: &mut HeaderMap<HeaderValue>) { matchself {
Action::Insert { name, val, old } => { let actual = map.insert(name, val);
assert_eq!(actual, old);
}
Action::Remove { name, val } => { // Just to help track the state, load all associated values. let _ = map.get_all(&name).iter().collect::<Vec<_>>();
let actual = map.remove(&name);
assert_eq!(actual, val);
}
Action::Append { name, val, ret } => {
assert_eq!(ret, map.append(name, val));
}
}
}
}
if g.gen_ratio(1, 2) {
STANDARD_HEADERS.choose(g).unwrap().clone()
} else { let value = gen_string(g, 1, 25);
HeaderName::from_bytes(value.as_bytes()).unwrap()
}
}
fn gen_header_value(g: &mut StdRng) -> HeaderValue { let value = gen_string(g, 0, 70);
HeaderValue::from_bytes(value.as_bytes()).unwrap()
}
fn gen_string(g: &mut StdRng, min: usize, max: usize) -> String { let bytes: Vec<_> = (min..max)
.map(|_| { // Chars to pick from
b"ABCDEFGHIJKLMNOPQRSTUVabcdefghilpqrstuvwxyz----"
.choose(g)
.unwrap()
.clone()
})
.collect();
String::from_utf8(bytes).unwrap()
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.10Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-28)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.