From da7e169cfd3084d18601d81bcdb4f0d1e7f4d2d9 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 13 Oct 2023 20:42:14 -0700 Subject: [PATCH 1/8] Add test case for erroneous ZeroMap2d construction --- components/timezone/src/metazone.rs | 220 ++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) diff --git a/components/timezone/src/metazone.rs b/components/timezone/src/metazone.rs index d4d518a0bf2..f5049992058 100644 --- a/components/timezone/src/metazone.rs +++ b/components/timezone/src/metazone.rs @@ -129,3 +129,223 @@ impl MetazoneCalculator { } } } + +#[cfg(test)] +mod tests { + use super::*; + use alloc::collections::BTreeMap; + use tinystr::tinystr; + use zerovec::ZeroMap2d; + + #[test] + fn zeromap2d_metazone() { + let source_data = [ + ( + TimeZoneBcp47Id(tinystr!(8, "sydam")), + 0, + Some(MetazoneId(tinystr!(4, "euea"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "bddac")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "bddac")), + 646200, + Some(MetazoneId(tinystr!(4, "bang"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "tldil")), + 0, + Some(MetazoneId(tinystr!(4, "eati"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "tldil")), + 3331620, + Some(MetazoneId(tinystr!(4, "ince"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "tldil")), + 16152000, + Some(MetazoneId(tinystr!(4, "eati"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "aedxb")), + 0, + Some(MetazoneId(tinystr!(4, "gulf"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "tjdyu")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "tjdyu")), + 11406060, + Some(MetazoneId(tinystr!(4, "taji"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "cyfmg")), + 0, + Some(MetazoneId(tinystr!(4, "euea"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "gazastrp")), + 0, + Some(MetazoneId(tinystr!(4, "isra"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "gazastrp")), + 13674120, + Some(MetazoneId(tinystr!(4, "euea"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "hebron")), + 0, + Some(MetazoneId(tinystr!(4, "isra"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "hebron")), + 13674120, + Some(MetazoneId(tinystr!(4, "euea"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "hkhkg")), + 0, + Some(MetazoneId(tinystr!(4, "hoko"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "mnhvd")), + 0, + Some(MetazoneId(tinystr!(4, "hovd"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "ruikt")), + 0, + Some(MetazoneId(tinystr!(4, "irku"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "idjkt")), + 0, + Some(MetazoneId(tinystr!(4, "inwe"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "iddjj")), + 0, + Some(MetazoneId(tinystr!(4, "inea"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "jeruslm")), + 0, + Some(MetazoneId(tinystr!(4, "isra"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "afkbl")), + 0, + Some(MetazoneId(tinystr!(4, "afgh"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "rupkc")), + 0, + Some(MetazoneId(tinystr!(4, "kamc"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "pkkhi")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "pkkhi")), + 646260, + Some(MetazoneId(tinystr!(4, "paki"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "npktm")), + 0, + Some(MetazoneId(tinystr!(4, "nepa"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "rukhndg")), + 0, + Some(MetazoneId(tinystr!(4, "yaku"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "rukhndg")), + 17881380, + Some(MetazoneId(tinystr!(4, "vlad"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "rukhndg")), + 21930540, + Some(MetazoneId(tinystr!(4, "yaku"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "rukra")), + 0, + Some(MetazoneId(tinystr!(4, "kras"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "mykul")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "mykul")), + 6311070, + Some(MetazoneId(tinystr!(4, "mala"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "mykch")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "mykch")), + 6311040, + Some(MetazoneId(tinystr!(4, "mala"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "kwkwi")), + 0, + Some(MetazoneId(tinystr!(4, "arab"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "pst8pdt")), + 0, + Some(MetazoneId(tinystr!(4, "ampa"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "ushnl")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "ushnl")), + 7272660, + Some(MetazoneId(tinystr!(4, "haal"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "ushnl")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "ushnl")), + 7272660, + Some(MetazoneId(tinystr!(4, "haal"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "kicxi")), + 0, + Some(MetazoneId(tinystr!(4, "liis"))), + ), + ( + TimeZoneBcp47Id(tinystr!(8, "fmksa")), + 0, + Some(MetazoneId(tinystr!(4, "kosr"))), + ), + (TimeZoneBcp47Id(tinystr!(8, "mhkwa")), 0, None), + ( + TimeZoneBcp47Id(tinystr!(8, "mhkwa")), + 12432240, + Some(MetazoneId(tinystr!(4, "mais"))), + ), + ]; + + let btreemap: BTreeMap<(TimeZoneBcp47Id, i32), Option> = source_data + .iter() + .copied() + .map(|(a, b, c)| ((a, b), c)) + .collect(); + + let zeromap2d: ZeroMap2d> = + source_data.iter().copied().collect(); + + let mut btreemap_iter = btreemap.iter(); + + for cursor in zeromap2d.iter0() { + for (key1, value) in cursor.iter1() { + // This code runs for every (key0, key1) pair in order + let expected = btreemap_iter.next().unwrap(); + assert_eq!( + (expected.0 .0, expected.0 .1, expected.1), + (*cursor.key0(), key1.as_unsigned_int() as i32, &value.get()) + ); + } + } + assert!(btreemap_iter.next().is_none()); + } +} From b4a0d719f0e64e831cb7357bb7228a0d0629b208 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 13 Oct 2023 20:45:48 -0700 Subject: [PATCH 2/8] Reduce the test case more --- components/timezone/src/metazone.rs | 161 ---------------------------- 1 file changed, 161 deletions(-) diff --git a/components/timezone/src/metazone.rs b/components/timezone/src/metazone.rs index f5049992058..c9bc742e10e 100644 --- a/components/timezone/src/metazone.rs +++ b/components/timezone/src/metazone.rs @@ -140,161 +140,16 @@ mod tests { #[test] fn zeromap2d_metazone() { let source_data = [ - ( - TimeZoneBcp47Id(tinystr!(8, "sydam")), - 0, - Some(MetazoneId(tinystr!(4, "euea"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "bddac")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "bddac")), - 646200, - Some(MetazoneId(tinystr!(4, "bang"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "tldil")), - 0, - Some(MetazoneId(tinystr!(4, "eati"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "tldil")), - 3331620, - Some(MetazoneId(tinystr!(4, "ince"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "tldil")), - 16152000, - Some(MetazoneId(tinystr!(4, "eati"))), - ), ( TimeZoneBcp47Id(tinystr!(8, "aedxb")), 0, Some(MetazoneId(tinystr!(4, "gulf"))), ), - (TimeZoneBcp47Id(tinystr!(8, "tjdyu")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "tjdyu")), - 11406060, - Some(MetazoneId(tinystr!(4, "taji"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "cyfmg")), - 0, - Some(MetazoneId(tinystr!(4, "euea"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "gazastrp")), - 0, - Some(MetazoneId(tinystr!(4, "isra"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "gazastrp")), - 13674120, - Some(MetazoneId(tinystr!(4, "euea"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "hebron")), - 0, - Some(MetazoneId(tinystr!(4, "isra"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "hebron")), - 13674120, - Some(MetazoneId(tinystr!(4, "euea"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "hkhkg")), - 0, - Some(MetazoneId(tinystr!(4, "hoko"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "mnhvd")), - 0, - Some(MetazoneId(tinystr!(4, "hovd"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "ruikt")), - 0, - Some(MetazoneId(tinystr!(4, "irku"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "idjkt")), - 0, - Some(MetazoneId(tinystr!(4, "inwe"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "iddjj")), - 0, - Some(MetazoneId(tinystr!(4, "inea"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "jeruslm")), - 0, - Some(MetazoneId(tinystr!(4, "isra"))), - ), ( TimeZoneBcp47Id(tinystr!(8, "afkbl")), 0, Some(MetazoneId(tinystr!(4, "afgh"))), ), - ( - TimeZoneBcp47Id(tinystr!(8, "rupkc")), - 0, - Some(MetazoneId(tinystr!(4, "kamc"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "pkkhi")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "pkkhi")), - 646260, - Some(MetazoneId(tinystr!(4, "paki"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "npktm")), - 0, - Some(MetazoneId(tinystr!(4, "nepa"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "rukhndg")), - 0, - Some(MetazoneId(tinystr!(4, "yaku"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "rukhndg")), - 17881380, - Some(MetazoneId(tinystr!(4, "vlad"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "rukhndg")), - 21930540, - Some(MetazoneId(tinystr!(4, "yaku"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "rukra")), - 0, - Some(MetazoneId(tinystr!(4, "kras"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "mykul")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "mykul")), - 6311070, - Some(MetazoneId(tinystr!(4, "mala"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "mykch")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "mykch")), - 6311040, - Some(MetazoneId(tinystr!(4, "mala"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "kwkwi")), - 0, - Some(MetazoneId(tinystr!(4, "arab"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "pst8pdt")), - 0, - Some(MetazoneId(tinystr!(4, "ampa"))), - ), (TimeZoneBcp47Id(tinystr!(8, "ushnl")), 0, None), ( TimeZoneBcp47Id(tinystr!(8, "ushnl")), @@ -307,22 +162,6 @@ mod tests { 7272660, Some(MetazoneId(tinystr!(4, "haal"))), ), - ( - TimeZoneBcp47Id(tinystr!(8, "kicxi")), - 0, - Some(MetazoneId(tinystr!(4, "liis"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "fmksa")), - 0, - Some(MetazoneId(tinystr!(4, "kosr"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "mhkwa")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "mhkwa")), - 12432240, - Some(MetazoneId(tinystr!(4, "mais"))), - ), ]; let btreemap: BTreeMap<(TimeZoneBcp47Id, i32), Option> = source_data From 97bb83bef75b241eabc316f3e6c165ed34758822 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 13 Oct 2023 20:49:18 -0700 Subject: [PATCH 3/8] Simplify further --- components/timezone/src/metazone.rs | 37 +++++++++-------------------- 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/components/timezone/src/metazone.rs b/components/timezone/src/metazone.rs index c9bc742e10e..caf147536ea 100644 --- a/components/timezone/src/metazone.rs +++ b/components/timezone/src/metazone.rs @@ -132,49 +132,34 @@ impl MetazoneCalculator { #[cfg(test)] mod tests { - use super::*; use alloc::collections::BTreeMap; - use tinystr::tinystr; + use tinystr::{tinystr, TinyAsciiStr}; use zerovec::ZeroMap2d; #[test] fn zeromap2d_metazone() { let source_data = [ - ( - TimeZoneBcp47Id(tinystr!(8, "aedxb")), - 0, - Some(MetazoneId(tinystr!(4, "gulf"))), - ), - ( - TimeZoneBcp47Id(tinystr!(8, "afkbl")), - 0, - Some(MetazoneId(tinystr!(4, "afgh"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "ushnl")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "ushnl")), - 7272660, - Some(MetazoneId(tinystr!(4, "haal"))), - ), - (TimeZoneBcp47Id(tinystr!(8, "ushnl")), 0, None), - ( - TimeZoneBcp47Id(tinystr!(8, "ushnl")), - 7272660, - Some(MetazoneId(tinystr!(4, "haal"))), - ), + (tinystr!(8, "aedxb"), 0, Some(tinystr!(4, "gulf"))), + (tinystr!(8, "afkbl"), 0, Some(tinystr!(4, "afgh"))), + (tinystr!(8, "ushnl"), 0, None), + (tinystr!(8, "ushnl"), 7272660, Some(tinystr!(4, "haal"))), + (tinystr!(8, "ushnl"), 0, None), + (tinystr!(8, "ushnl"), 7272660, Some(tinystr!(4, "haal"))), ]; - let btreemap: BTreeMap<(TimeZoneBcp47Id, i32), Option> = source_data + let btreemap: BTreeMap<(TinyAsciiStr<8>, i32), Option>> = source_data .iter() .copied() .map(|(a, b, c)| ((a, b), c)) .collect(); - let zeromap2d: ZeroMap2d> = + let zeromap2d: ZeroMap2d, i32, Option>> = source_data.iter().copied().collect(); let mut btreemap_iter = btreemap.iter(); + eprintln!("{zeromap2d:?}"); + for cursor in zeromap2d.iter0() { for (key1, value) in cursor.iter1() { // This code runs for every (key0, key1) pair in order From e6856fdf7bbc4a910934eb057260742510a168f7 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 13 Oct 2023 20:54:24 -0700 Subject: [PATCH 4/8] Remove TinyStr dependency --- components/timezone/src/metazone.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/components/timezone/src/metazone.rs b/components/timezone/src/metazone.rs index caf147536ea..1fb08d2efa9 100644 --- a/components/timezone/src/metazone.rs +++ b/components/timezone/src/metazone.rs @@ -133,27 +133,26 @@ impl MetazoneCalculator { #[cfg(test)] mod tests { use alloc::collections::BTreeMap; - use tinystr::{tinystr, TinyAsciiStr}; use zerovec::ZeroMap2d; #[test] fn zeromap2d_metazone() { let source_data = [ - (tinystr!(8, "aedxb"), 0, Some(tinystr!(4, "gulf"))), - (tinystr!(8, "afkbl"), 0, Some(tinystr!(4, "afgh"))), - (tinystr!(8, "ushnl"), 0, None), - (tinystr!(8, "ushnl"), 7272660, Some(tinystr!(4, "haal"))), - (tinystr!(8, "ushnl"), 0, None), - (tinystr!(8, "ushnl"), 7272660, Some(tinystr!(4, "haal"))), + (*b"aedxb", 0, Some(*b"gulf")), + (*b"afkbl", 0, Some(*b"afgh")), + (*b"ushnl", 0, None), + (*b"ushnl", 7272660, Some(*b"haal")), + (*b"ushnl", 0, None), + (*b"ushnl", 7272660, Some(*b"haal")), ]; - let btreemap: BTreeMap<(TinyAsciiStr<8>, i32), Option>> = source_data + let btreemap: BTreeMap<([u8; 5], i32), Option<[u8; 4]>> = source_data .iter() .copied() .map(|(a, b, c)| ((a, b), c)) .collect(); - let zeromap2d: ZeroMap2d, i32, Option>> = + let zeromap2d: ZeroMap2d<[u8; 5], i32, Option<[u8; 4]>> = source_data.iter().copied().collect(); let mut btreemap_iter = btreemap.iter(); From 40ad0ece25048e6d8d40b59157044366b27d4f52 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 13 Oct 2023 20:55:31 -0700 Subject: [PATCH 5/8] Move test to zerovec component --- components/timezone/src/metazone.rs | 43 ----------------------------- utils/zerovec/src/map2d/map.rs | 36 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 43 deletions(-) diff --git a/components/timezone/src/metazone.rs b/components/timezone/src/metazone.rs index 1fb08d2efa9..d4d518a0bf2 100644 --- a/components/timezone/src/metazone.rs +++ b/components/timezone/src/metazone.rs @@ -129,46 +129,3 @@ impl MetazoneCalculator { } } } - -#[cfg(test)] -mod tests { - use alloc::collections::BTreeMap; - use zerovec::ZeroMap2d; - - #[test] - fn zeromap2d_metazone() { - let source_data = [ - (*b"aedxb", 0, Some(*b"gulf")), - (*b"afkbl", 0, Some(*b"afgh")), - (*b"ushnl", 0, None), - (*b"ushnl", 7272660, Some(*b"haal")), - (*b"ushnl", 0, None), - (*b"ushnl", 7272660, Some(*b"haal")), - ]; - - let btreemap: BTreeMap<([u8; 5], i32), Option<[u8; 4]>> = source_data - .iter() - .copied() - .map(|(a, b, c)| ((a, b), c)) - .collect(); - - let zeromap2d: ZeroMap2d<[u8; 5], i32, Option<[u8; 4]>> = - source_data.iter().copied().collect(); - - let mut btreemap_iter = btreemap.iter(); - - eprintln!("{zeromap2d:?}"); - - for cursor in zeromap2d.iter0() { - for (key1, value) in cursor.iter1() { - // This code runs for every (key0, key1) pair in order - let expected = btreemap_iter.next().unwrap(); - assert_eq!( - (expected.0 .0, expected.0 .1, expected.1), - (*cursor.key0(), key1.as_unsigned_int() as i32, &value.get()) - ); - } - } - assert!(btreemap_iter.next().is_none()); - } -} diff --git a/utils/zerovec/src/map2d/map.rs b/utils/zerovec/src/map2d/map.rs index 90854018f02..d9005b247b6 100644 --- a/utils/zerovec/src/map2d/map.rs +++ b/utils/zerovec/src/map2d/map.rs @@ -704,6 +704,7 @@ where #[cfg(test)] mod test { use super::*; + use alloc::collections::BTreeMap; #[test] fn stress_test() { @@ -824,4 +825,39 @@ mod test { assert_eq!(format!("{zm2d:?}"), "ZeroMap2d { keys0: ZeroVec([3, 6, 7]), joiner: ZeroVec([1, 4, 7]), keys1: [\"eee\", \"ddd\", \"mmm\", \"nnn\", \"ddd\", \"eee\", \"www\"], values: [\"EEE\", \"DD3\", \"MM1\", \"NNN\", \"DD2\", \"EEE\", \"WWW\"] }"); } + + #[test] + fn zeromap2d_metazone() { + let source_data = [ + (*b"aedxb", 0, Some(*b"gulf")), + (*b"afkbl", 0, Some(*b"afgh")), + (*b"ushnl", 0, None), + (*b"ushnl", 7272660, Some(*b"haal")), + (*b"ushnl", 0, None), + (*b"ushnl", 7272660, Some(*b"haal")), + ]; + + let btreemap: BTreeMap<([u8; 5], i32), Option<[u8; 4]>> = source_data + .iter() + .copied() + .map(|(a, b, c)| ((a, b), c)) + .collect(); + + let zeromap2d: ZeroMap2d<[u8; 5], i32, Option<[u8; 4]>> = + source_data.iter().copied().collect(); + + let mut btreemap_iter = btreemap.iter(); + + for cursor in zeromap2d.iter0() { + for (key1, value) in cursor.iter1() { + // This code runs for every (key0, key1) pair in order + let expected = btreemap_iter.next().unwrap(); + assert_eq!( + (expected.0 .0, expected.0 .1, expected.1), + (*cursor.key0(), key1.as_unsigned_int() as i32, &value.get()) + ); + } + } + assert!(btreemap_iter.next().is_none()); + } } From a837749fe4cc1af14fbcab1ff28c495841a0b370 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Tue, 17 Oct 2023 19:26:58 -0700 Subject: [PATCH 6/8] Add another test --- utils/zerovec/src/map2d/map.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/utils/zerovec/src/map2d/map.rs b/utils/zerovec/src/map2d/map.rs index d9005b247b6..ea1b11aaf29 100644 --- a/utils/zerovec/src/map2d/map.rs +++ b/utils/zerovec/src/map2d/map.rs @@ -299,7 +299,25 @@ where /// Insert `value` with `key`, returning the existing value if it exists. /// - /// See example in [`Self::get_2d()`]. + /// ```rust + /// use zerovec::ZeroMap2d; + /// + /// let mut map = ZeroMap2d::new(); + /// assert_eq!( + /// map.insert(&0, "zero", "foo"), + /// None, + /// ); + /// assert_eq!( + /// map.insert(&1, "one", "bar"), + /// None, + /// ); + /// assert_eq!( + /// map.insert(&1, "one", "baz").as_deref(), + /// Some("bar"), + /// ); + /// assert_eq!(map.get_2d(&1, "one").as_deref(), Some("baz")); + /// assert_eq!(map.len(), 2); + /// ``` pub fn insert(&mut self, key0: &K0, key1: &K1, value: &V) -> Option { let (key0_index, range) = self.get_or_insert_range_for_key0(key0); debug_assert!(range.start <= range.end); // '<=' because we may have inserted a new key0 From 5f6f9884e25d959f51dc2a5316de111574e47b6b Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Tue, 17 Oct 2023 19:27:25 -0700 Subject: [PATCH 7/8] Check invariants in from_iter (they are passing) --- utils/zerovec/src/map2d/map.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/zerovec/src/map2d/map.rs b/utils/zerovec/src/map2d/map.rs index ea1b11aaf29..433a8dabb77 100644 --- a/utils/zerovec/src/map2d/map.rs +++ b/utils/zerovec/src/map2d/map.rs @@ -715,6 +715,8 @@ where map.insert(key0, key1, value); } } + #[cfg(debug_assertions)] + map.check_invariants(); map } } From d4c693d5cc169ebfea6aa46cc3c8d4d3478b1722 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Tue, 17 Oct 2023 19:27:31 -0700 Subject: [PATCH 8/8] Fix the bug --- utils/zerovec/src/map2d/map.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/zerovec/src/map2d/map.rs b/utils/zerovec/src/map2d/map.rs index 433a8dabb77..a50ef2c77c8 100644 --- a/utils/zerovec/src/map2d/map.rs +++ b/utils/zerovec/src/map2d/map.rs @@ -322,10 +322,11 @@ where let (key0_index, range) = self.get_or_insert_range_for_key0(key0); debug_assert!(range.start <= range.end); // '<=' because we may have inserted a new key0 debug_assert!(range.end <= self.keys1.zvl_len()); + let range_start = range.start; #[allow(clippy::unwrap_used)] // by debug_assert! invariants - let index = range.start + let index = range_start + match self.keys1.zvl_binary_search_in_range(key1, range).unwrap() { - Ok(index) => return Some(self.values.zvl_replace(index, value)), + Ok(index) => return Some(self.values.zvl_replace(range_start + index, value)), Err(index) => index, }; self.keys1.zvl_insert(index, key1);