1 use std::{collections::BTreeMap, str::FromStr};
2 use wasmtime_environ::{
3 collections,
4 error::{Context as _, Result, bail, format_err},
5 };
6
7 type Key = [u128; 2];
8 type Value = [u8; 16];
9
10 trait Map {
insert(&mut self, key: Key, value: Value) -> Result<()>11 fn insert(&mut self, key: Key, value: Value) -> Result<()>;
12 }
13
14 impl Map for BTreeMap<Key, Value> {
insert(&mut self, key: Key, value: Value) -> Result<()>15 fn insert(&mut self, key: Key, value: Value) -> Result<()> {
16 BTreeMap::insert(self, key, value);
17 Ok(())
18 }
19 }
20
21 impl Map for collections::TryBTreeMap<Key, Value> {
insert(&mut self, key: Key, value: Value) -> Result<()>22 fn insert(&mut self, key: Key, value: Value) -> Result<()> {
23 collections::TryBTreeMap::insert(self, key, value)?;
24 Ok(())
25 }
26 }
27
main() -> Result<()>28 fn main() -> Result<()> {
29 let kind = std::env::args()
30 .nth(1)
31 .ok_or_else(|| format_err!("must provide first argument: 'std' or 'bforest'"))?;
32
33 let mut map: Box<dyn Map> = match kind.as_str() {
34 "std" => Box::new(BTreeMap::new()),
35 "bforest" => Box::new(collections::TryBTreeMap::new()),
36 _ => bail!("first argument must be either 'std' or 'bforest', got: '{kind}'"),
37 };
38
39 let n = std::env::args().nth(2);
40 let n = n.as_deref().unwrap_or("1000");
41 let n = u128::from_str(n).context("failed to parse second argument as `u32` integer")?;
42
43 println!("Inserting {n} entries into `{kind}`-based `BTreeMap`...");
44
45 for i in 0..n {
46 map.insert([i, i], [0; 16])?;
47 }
48
49 Ok(())
50 }
51