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