diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml index d10b3c99..753b1972 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/Cargo.toml @@ -33,3 +33,7 @@ path = "vec/src/main.rs" [[bin]] name = "compare" path = "compare/src/main.rs" + +[[bin]] +name = "btreeset" +path = "btreeset/src/main.rs" diff --git a/benchmarks/btreeset/canbench.yml b/benchmarks/btreeset/canbench.yml new file mode 100644 index 00000000..c6b0e533 --- /dev/null +++ b/benchmarks/btreeset/canbench.yml @@ -0,0 +1,3 @@ +build_cmd: cargo build -p benchmarks --release --target wasm32-unknown-unknown --locked + +wasm_path: ../../target/wasm32-unknown-unknown/release/btreeset.wasm diff --git a/benchmarks/btreeset/canbench_results.yml b/benchmarks/btreeset/canbench_results.yml new file mode 100644 index 00000000..74202325 --- /dev/null +++ b/benchmarks/btreeset/canbench_results.yml @@ -0,0 +1,602 @@ +benches: + btreeset_insert_blob_1024: + total: + instructions: 7284353843 + heap_increase: 1 + stable_memory_increase: 256 + scopes: {} + btreeset_insert_blob_128: + total: + instructions: 1654118408 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_blob_16: + total: + instructions: 739699471 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_blob_256: + total: + instructions: 2458952491 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_blob_32: + total: + instructions: 836100902 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_blob_512: + total: + instructions: 4066217394 + heap_increase: 0 + stable_memory_increase: 128 + scopes: {} + btreeset_insert_blob_64: + total: + instructions: 998807162 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_blob_8: + total: + instructions: 717903557 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_u32: + total: + instructions: 571689723 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_insert_u64: + total: + instructions: 592253100 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_1024: + total: + instructions: 108717363 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_128: + total: + instructions: 18182210 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_16: + total: + instructions: 3647358 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_256: + total: + instructions: 31425737 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_32: + total: + instructions: 4922122 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_512: + total: + instructions: 57189120 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_64: + total: + instructions: 10297925 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_blob_8: + total: + instructions: 3391277 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_u32: + total: + instructions: 2493559 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_intersection_u64: + total: + instructions: 2511642 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_1024: + total: + instructions: 52538596 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_128: + total: + instructions: 9488848 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_16: + total: + instructions: 2342810 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_256: + total: + instructions: 15786553 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_32: + total: + instructions: 3009950 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_512: + total: + instructions: 28037526 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_64: + total: + instructions: 5459284 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_blob_8: + total: + instructions: 2251299 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_u32: + total: + instructions: 1692076 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_disjoint_u64: + total: + instructions: 1705528 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_1024: + total: + instructions: 384259 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_128: + total: + instructions: 89398 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_16: + total: + instructions: 54885 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_256: + total: + instructions: 131654 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_32: + total: + instructions: 46702 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_512: + total: + instructions: 215811 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_64: + total: + instructions: 57922 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_blob_8: + total: + instructions: 53252 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_u32: + total: + instructions: 44014 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_subset_u64: + total: + instructions: 44663 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_1024: + total: + instructions: 91980309 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_128: + total: + instructions: 15754329 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_16: + total: + instructions: 3566982 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_256: + total: + instructions: 26966809 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_32: + total: + instructions: 4791767 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_512: + total: + instructions: 48630619 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_64: + total: + instructions: 8894928 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_blob_8: + total: + instructions: 3336365 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_u32: + total: + instructions: 2492101 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_is_superset_u64: + total: + instructions: 2510547 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_1024: + total: + instructions: 434481189 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_128: + total: + instructions: 77325848 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_16: + total: + instructions: 17483295 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_256: + total: + instructions: 129194395 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_32: + total: + instructions: 23951961 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_512: + total: + instructions: 230961189 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_64: + total: + instructions: 42333988 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_blob_8: + total: + instructions: 16825152 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_u32: + total: + instructions: 13506582 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_iter_u64: + total: + instructions: 13590626 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_1024: + total: + instructions: 261524517 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_128: + total: + instructions: 47161109 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_16: + total: + instructions: 11192850 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_256: + total: + instructions: 77956795 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_32: + total: + instructions: 15048515 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_512: + total: + instructions: 139243173 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_64: + total: + instructions: 26092306 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_blob_8: + total: + instructions: 10796216 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_u32: + total: + instructions: 8168558 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_range_u64: + total: + instructions: 8209398 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_1024: + total: + instructions: 7738925933 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_128: + total: + instructions: 1684959346 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_16: + total: + instructions: 731714614 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_256: + total: + instructions: 2548191494 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_32: + total: + instructions: 825477060 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_512: + total: + instructions: 4277639888 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_64: + total: + instructions: 1007012623 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_blob_8: + total: + instructions: 710369771 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_u32: + total: + instructions: 562044903 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_remove_u64: + total: + instructions: 586317027 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_1024: + total: + instructions: 108731489 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_128: + total: + instructions: 18185584 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_16: + total: + instructions: 3648982 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_256: + total: + instructions: 31430647 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_32: + total: + instructions: 4923790 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_512: + total: + instructions: 57197102 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_64: + total: + instructions: 10300531 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_blob_8: + total: + instructions: 3392880 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_u32: + total: + instructions: 2509667 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_symmetric_difference_u64: + total: + instructions: 2517727 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_1024: + total: + instructions: 108731997 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_128: + total: + instructions: 18186092 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_16: + total: + instructions: 3649490 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_256: + total: + instructions: 31431155 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_32: + total: + instructions: 4924298 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_512: + total: + instructions: 57197610 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_64: + total: + instructions: 10301039 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_blob_8: + total: + instructions: 3393388 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_u32: + total: + instructions: 2507174 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} + btreeset_union_u64: + total: + instructions: 2513237 + heap_increase: 0 + stable_memory_increase: 0 + scopes: {} +version: 0.1.11 diff --git a/benchmarks/btreeset/src/main.rs b/benchmarks/btreeset/src/main.rs new file mode 100644 index 00000000..ae2fa8e6 --- /dev/null +++ b/benchmarks/btreeset/src/main.rs @@ -0,0 +1,318 @@ +use canbench_rs::{bench, bench_fn, BenchResult}; +use ic_stable_structures::memory_manager::{MemoryId, MemoryManager}; +use ic_stable_structures::storable::Blob; +use ic_stable_structures::{btreeset::BTreeSet, DefaultMemoryImpl, Storable}; + +type Blob8 = Blob<8>; +type Blob16 = Blob<16>; +type Blob32 = Blob<32>; +type Blob64 = Blob<64>; +type Blob128 = Blob<128>; +type Blob256 = Blob<256>; +type Blob512 = Blob<512>; +type Blob1024 = Blob<1024>; + +/// Helper macro to generate benchmarks. +macro_rules! bench_tests { + ($( $fn_name:ident, $helper:ident, $k:expr );+ $(;)?) => { + $( + #[bench(raw)] + pub fn $fn_name() -> BenchResult { + $helper::<$k>() + } + )+ + }; +} +// Profiles inserting a large number of keys into a BTreeSet. +fn insert_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let num_keys = 10_000; + + bench_fn(|| { + for i in 0..num_keys { + let key = generate_key::(i); + btreeset.insert(key); + } + }) +} + +// Profiles removing a large number of keys from a BTreeSet. +fn remove_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let num_keys = 10_000; + + for i in 0..num_keys { + btreeset.insert(generate_key::(i)); + } + + bench_fn(|| { + for i in 0..num_keys { + let key = generate_key::(i); + btreeset.remove(&key); + } + }) +} + +// Profiles iterating over a BTreeSet. +fn iter_helper() -> BenchResult { + let mut btreeset = BTreeSet::new(DefaultMemoryImpl::default()); + + for i in 0..10_000 { + btreeset.insert(generate_key::(i)); + } + + bench_fn(|| for _ in btreeset.iter() {}) +} + +// Profiles range queries on a BTreeSet. +fn range_helper() -> BenchResult { + let mut btreeset = BTreeSet::new(DefaultMemoryImpl::default()); + + for i in 0..10_000 { + btreeset.insert(generate_key::(i)); + } + + let start = generate_key::(2000); + let end = generate_key::(8000); + + bench_fn(|| for _ in btreeset.range(start..end) {}) +} + +// Profiles the union operation on two BTreeSets. +fn union_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i)); + } + } + + bench_fn(|| for _ in btreeset1.union(&btreeset2) {}) +} + +// Profiles the intersection operation on two BTreeSets. +fn intersection_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i)); + } + } + + bench_fn(|| for _ in btreeset1.intersection(&btreeset2) {}) +} + +// Profiles the symmetric difference operation on two BTreeSets. +fn symmetric_difference_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i)); + } + } + + bench_fn(|| for _ in btreeset1.symmetric_difference(&btreeset2) {}) +} + +// Profiles the is_subset operation on two BTreeSets. +fn is_subset_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i)); + } + } + + bench_fn(|| { + let _ = btreeset1.is_subset(&btreeset2); + }) +} + +// Profiles the is_superset operation on two BTreeSets. +fn is_superset_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i)); + } + } + + bench_fn(|| { + let _ = btreeset1.is_superset(&btreeset2); + }) +} + +// Profiles the is_disjoint operation on two BTreeSets. +fn is_disjoint_helper() -> BenchResult { + let mem_mgr = MemoryManager::init(DefaultMemoryImpl::default()); + let mut btreeset1 = BTreeSet::new(mem_mgr.get(MemoryId::new(0))); + let mut btreeset2 = BTreeSet::new(mem_mgr.get(MemoryId::new(1))); + let num_keys = 1_000; + + for i in 0..num_keys { + btreeset1.insert(generate_key::(i)); + if i % 2 == 0 { + btreeset2.insert(generate_key::(i + num_keys)); // Ensure disjoint sets + } + } + + bench_fn(|| { + let _ = btreeset1.is_disjoint(&btreeset2); + }) +} + +// Generates keys directly based on the type `K`. +fn generate_key(i: u32) -> K { + let bytes = i.to_be_bytes(); + let padded_bytes = { + let mut buffer = vec![0; K::BOUND.max_size() as usize]; + buffer[..bytes.len()].copy_from_slice(&bytes); + buffer + }; + K::from_bytes(std::borrow::Cow::Owned(padded_bytes)) +} + +// Add benchmarks for insert, remove, and range with additional key types. +bench_tests! { + btreeset_insert_u32, insert_helper, u32; + btreeset_insert_u64, insert_helper, u64; + btreeset_insert_blob_8, insert_helper, Blob8; + btreeset_insert_blob_16, insert_helper, Blob16; + btreeset_insert_blob_32, insert_helper, Blob32; + btreeset_insert_blob_64, insert_helper, Blob64; + btreeset_insert_blob_128, insert_helper, Blob128; + btreeset_insert_blob_256, insert_helper, Blob256; + btreeset_insert_blob_512, insert_helper, Blob512; + btreeset_insert_blob_1024, insert_helper, Blob1024; + + btreeset_remove_u32, remove_helper, u32; + btreeset_remove_u64, remove_helper, u64; + btreeset_remove_blob_8, remove_helper, Blob8; + btreeset_remove_blob_16, remove_helper, Blob16; + btreeset_remove_blob_32, remove_helper, Blob32; + btreeset_remove_blob_64, remove_helper, Blob64; + btreeset_remove_blob_128, remove_helper, Blob128; + btreeset_remove_blob_256, remove_helper, Blob256; + btreeset_remove_blob_512, remove_helper, Blob512; + btreeset_remove_blob_1024, remove_helper, Blob1024; + + btreeset_range_u32, range_helper, u32; + btreeset_range_u64, range_helper, u64; + btreeset_range_blob_8, range_helper, Blob8; + btreeset_range_blob_16, range_helper, Blob16; + btreeset_range_blob_32, range_helper, Blob32; + btreeset_range_blob_64, range_helper, Blob64; + btreeset_range_blob_128, range_helper, Blob128; + btreeset_range_blob_256, range_helper, Blob256; + btreeset_range_blob_512, range_helper, Blob512; + btreeset_range_blob_1024, range_helper, Blob1024; + + btreeset_iter_u32, iter_helper, u32; + btreeset_iter_u64, iter_helper, u64; + btreeset_iter_blob_8, iter_helper, Blob8; + btreeset_iter_blob_16, iter_helper, Blob16; + btreeset_iter_blob_32, iter_helper, Blob32; + btreeset_iter_blob_64, iter_helper, Blob64; + btreeset_iter_blob_128, iter_helper, Blob128; + btreeset_iter_blob_256, iter_helper, Blob256; + btreeset_iter_blob_512, iter_helper, Blob512; + btreeset_iter_blob_1024, iter_helper, Blob1024; +} + +// Add benchmarks for set operations with additional key types. +bench_tests! { + btreeset_union_u32, union_helper, u32; + btreeset_union_u64, union_helper, u64; + btreeset_union_blob_8, union_helper, Blob8; + btreeset_union_blob_16, union_helper, Blob16; + btreeset_union_blob_32, union_helper, Blob32; + btreeset_union_blob_64, union_helper, Blob64; + btreeset_union_blob_128, union_helper, Blob128; + btreeset_union_blob_256, union_helper, Blob256; + btreeset_union_blob_512, union_helper, Blob512; + btreeset_union_blob_1024, union_helper, Blob1024; + + btreeset_intersection_u32, intersection_helper, u32; + btreeset_intersection_u64, intersection_helper, u64; + btreeset_intersection_blob_8, intersection_helper, Blob8; + btreeset_intersection_blob_16, intersection_helper, Blob16; + btreeset_intersection_blob_32, intersection_helper, Blob32; + btreeset_intersection_blob_64, intersection_helper, Blob64; + btreeset_intersection_blob_128, intersection_helper, Blob128; + btreeset_intersection_blob_256, intersection_helper, Blob256; + btreeset_intersection_blob_512, intersection_helper, Blob512; + btreeset_intersection_blob_1024, intersection_helper, Blob1024; + + btreeset_symmetric_difference_u32, symmetric_difference_helper, u32; + btreeset_symmetric_difference_u64, symmetric_difference_helper, u64; + btreeset_symmetric_difference_blob_8, symmetric_difference_helper, Blob8; + btreeset_symmetric_difference_blob_16, symmetric_difference_helper, Blob16; + btreeset_symmetric_difference_blob_32, symmetric_difference_helper, Blob32; + btreeset_symmetric_difference_blob_64, symmetric_difference_helper, Blob64; + btreeset_symmetric_difference_blob_128, symmetric_difference_helper, Blob128; + btreeset_symmetric_difference_blob_256, symmetric_difference_helper, Blob256; + btreeset_symmetric_difference_blob_512, symmetric_difference_helper, Blob512; + btreeset_symmetric_difference_blob_1024, symmetric_difference_helper, Blob1024; + + btreeset_is_subset_u32, is_subset_helper, u32; + btreeset_is_subset_u64, is_subset_helper, u64; + btreeset_is_subset_blob_8, is_subset_helper, Blob8; + btreeset_is_subset_blob_16, is_subset_helper, Blob16; + btreeset_is_subset_blob_32, is_subset_helper, Blob32; + btreeset_is_subset_blob_64, is_subset_helper, Blob64; + btreeset_is_subset_blob_128, is_subset_helper, Blob128; + btreeset_is_subset_blob_256, is_subset_helper, Blob256; + btreeset_is_subset_blob_512, is_subset_helper, Blob512; + btreeset_is_subset_blob_1024, is_subset_helper, Blob1024; + + btreeset_is_superset_u32, is_superset_helper, u32; + btreeset_is_superset_u64, is_superset_helper, u64; + btreeset_is_superset_blob_8, is_superset_helper, Blob8; + btreeset_is_superset_blob_16, is_superset_helper, Blob16; + btreeset_is_superset_blob_32, is_superset_helper, Blob32; + btreeset_is_superset_blob_64, is_superset_helper, Blob64; + btreeset_is_superset_blob_128, is_superset_helper, Blob128; + btreeset_is_superset_blob_256, is_superset_helper, Blob256; + btreeset_is_superset_blob_512, is_superset_helper, Blob512; + btreeset_is_superset_blob_1024, is_superset_helper, Blob1024; + + btreeset_is_disjoint_u32, is_disjoint_helper, u32; + btreeset_is_disjoint_u64, is_disjoint_helper, u64; + btreeset_is_disjoint_blob_8, is_disjoint_helper, Blob8; + btreeset_is_disjoint_blob_16, is_disjoint_helper, Blob16; + btreeset_is_disjoint_blob_32, is_disjoint_helper, Blob32; + btreeset_is_disjoint_blob_64, is_disjoint_helper, Blob64; + btreeset_is_disjoint_blob_128, is_disjoint_helper, Blob128; + btreeset_is_disjoint_blob_256, is_disjoint_helper, Blob256; + btreeset_is_disjoint_blob_512, is_disjoint_helper, Blob512; + btreeset_is_disjoint_blob_1024, is_disjoint_helper, Blob1024; +} + +fn main() {}