|
| 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 { |
| 11 | + fn insert(&mut self, key: Key, value: Value) -> Result<()>; |
| 12 | +} |
| 13 | + |
| 14 | +impl Map for BTreeMap<Key, Value> { |
| 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::BTreeMap<Key, Value> { |
| 22 | + fn insert(&mut self, key: Key, value: Value) -> Result<()> { |
| 23 | + collections::BTreeMap::insert(self, key, value)?; |
| 24 | + Ok(()) |
| 25 | + } |
| 26 | +} |
| 27 | + |
| 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::BTreeMap::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 | +} |
0 commit comments