diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9bebe22 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,49 @@ +{ + "psi-header.config": { + "license": "MPL-2.0+", + "forceToTop": true, + "blankLinesAfter": 1, + "copyrightHolder": "Bodil Stokke" + }, + "psi-header.changes-tracking": { + "autoHeader": "manualSave", + "enforceHeader": true, + "excludeGlob": [ + "target/**", + "dist/**" + ], + "exclude": [ + "jsonc", + "json", + "markdown", + "toml", + "yaml" + ] + }, + "psi-header.lang-config": [ + { + "language": "javascript", + "begin": "", + "end": "", + "prefix": "// " + }, + { + "language": "typescript", + "mapTo": "javascript" + }, + { + "language": "rust", + "mapTo": "javascript" + } + ], + "psi-header.templates": [ + { + "language": "*", + "template": [ + "This Source Code Form is subject to the terms of the Mozilla Public", + "License, v. 2.0. If a copy of the MPL was not distributed with this", + "file, You can obtain one at http://mozilla.org/MPL/2.0/." + ] + } + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 05fed6c..edcf429 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [15.1.0] - 2022-04-29 + +### Added + +- `HashSet` now implements `From>` and `From<&Vector> where A: Clone`. + +### Fixed + +- Fixed a long standing crash bug in `OrdMap`/`OrdSet`. (#154, #143, #152, #124) +- The `union` method on maps/sets will now prefer to mutate the larger set (which leads to less + work) rather than the first set. (#163) +- Ensure `TreeFocus` only implements `Send`/`Sync` when the underlying type does. (#157, #158) +- There was an issue where nodes in very large `OrdMap`s could overflow when removing an element + and cause a panic, which has now been fixed. (#141) +- Assorted doc cleanup. (#150, #173, #186, #194) + ## [15.0.0] - 2020-05-15 ### Changed diff --git a/Cargo.toml b/Cargo.toml index 034b449..93f581d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,9 @@ [package] name = "im" -version = "15.0.0" +version = "15.1.0" authors = ["Bodil Stokke "] edition = "2018" +rust-version = "1.46.0" license = "MPL-2.0+" description = "Immutable collection datatypes" repository = "https://github.com/bodil/im-rs" @@ -26,9 +27,6 @@ all-features = true [lib] path = "./src/lib.rs" -[badges] -travis-ci = { repository = "bodil/im-rs" } - [build-dependencies] version_check = "0.9" @@ -38,22 +36,22 @@ debug = [] [dependencies] typenum = "1.12" bitmaps = "2" -sized-chunks = "0.6" -rand_core = "0.5.1" -rand_xoshiro = "0.4" -quickcheck = { version = "0.9", optional = true } -proptest = { version = "0.9", optional = true } +sized-chunks = "0.6.4" +rand_core = "0.6" +rand_xoshiro = "0.6" +quickcheck = { version = "1", optional = true } +proptest = { version = "1", optional = true } serde = { version = "1", optional = true } rayon = { version = "1", optional = true } refpool = { version = "0.4", optional = true } -arbitrary = { version = "0.4", optional = true } +arbitrary = { version = "1.1", optional = true } [dev-dependencies] -proptest = "0.9" +proptest = "1" serde = "1" serde_json = "1" rayon = "1" -rand = { version = "0.7", features = ["small_rng"] } -pretty_assertions = "0.6" +rand = { version = "0.8", features = ["small_rng"] } +pretty_assertions = "1" metrohash = "1" -proptest-derive = "0.1" +proptest-derive = "0.3" diff --git a/README.md b/README.md index 1d315fc..d95c071 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # im-rs +[![Crate Status](https://img.shields.io/crates/v/im.svg)](https://crates.io/crates/im) + Blazing fast immutable collection datatypes for Rust. Comes in two versions: [`im`](https://crates.io/crates/im) (thread safe) and diff --git a/benches/hashmap.rs b/benches/hashmap.rs index 25044a5..68d1024 100644 --- a/benches/hashmap.rs +++ b/benches/hashmap.rs @@ -9,7 +9,6 @@ extern crate rand; extern crate test; use rand::{rngs::SmallRng, Rng, SeedableRng}; -use std::iter::FromIterator; use test::Bencher; use im::hashmap::HashMap; @@ -41,7 +40,7 @@ fn reorder(vec: &[A]) -> Vec { fn hashmap_lookup_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let m: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, 1))); + let m: HashMap = keys.into_iter().map(|i| (i, 1)).collect::>(); b.iter(|| { for i in &order { let _ = m.get(i); @@ -122,7 +121,7 @@ fn hashmap_insert_mut_10000(b: &mut Bencher) { fn hashmap_remove_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let map: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: HashMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); for i in &order { @@ -149,7 +148,7 @@ fn hashmap_remove_1000(b: &mut Bencher) { fn hashmap_remove_mut_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let map: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: HashMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); for i in &order { @@ -176,7 +175,7 @@ fn hashmap_remove_mut_1000(b: &mut Bencher) { fn hashmap_insert_once_n(size: usize, b: &mut Bencher) { let mut keys = random_keys(size + 1); let key = keys.pop().unwrap(); - let map: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: HashMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.update(key, key)) } @@ -203,7 +202,7 @@ fn hashmap_insert_once_10000(b: &mut Bencher) { fn hashmap_remove_once_n(size: usize, b: &mut Bencher) { let keys = random_keys(size + 1); let key = keys[0]; - let map: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: HashMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.without(&key)) } @@ -230,7 +229,7 @@ fn hashmap_remove_once_10000(b: &mut Bencher) { fn hashmap_lookup_once_n(size: usize, b: &mut Bencher) { let keys = random_keys(size + 1); let key = keys[0]; - let map: HashMap = HashMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: HashMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.get(&key)) } diff --git a/benches/native.rs b/benches/native.rs index 36db8f1..fd33d4f 100644 --- a/benches/native.rs +++ b/benches/native.rs @@ -8,9 +8,8 @@ extern crate im; extern crate rand; extern crate test; -use rand::{rngs::SmallRng, SeedableRng, Rng}; +use rand::{rngs::SmallRng, Rng, SeedableRng}; use std::collections::{BTreeMap, HashMap, VecDeque}; -use std::iter::FromIterator; use test::Bencher; fn random_keys(size: usize) -> Vec { @@ -165,7 +164,7 @@ fn vecdeque_push_back_mut_100000(b: &mut Bencher) { } fn vecdeque_pop_front_mut(b: &mut Bencher, count: usize) { - let l = VecDeque::::from_iter(0..count as i32); + let l = (0..count as i32).collect::>(); b.iter(|| { let mut p = l.clone(); for _ in 0..count { @@ -195,7 +194,7 @@ fn vecdeque_pop_front_mut_100000(b: &mut Bencher) { } fn vecdeque_pop_back_mut(b: &mut Bencher, count: usize) { - let l = VecDeque::::from_iter(0..count as i32); + let l = (0..count as i32).collect::>(); b.iter(|| { let mut p = l.clone(); for _ in 0..count { @@ -225,7 +224,7 @@ fn vecdeque_pop_back_mut_100000(b: &mut Bencher) { } fn vecdeque_split(b: &mut Bencher, count: usize) { - let vec = VecDeque::::from_iter(0..count as i32); + let vec = (0..count as i32).collect::>(); b.iter(|| { let mut left = vec.clone(); let _right = left.split_off(count / 2); @@ -254,8 +253,8 @@ fn vecdeque_split_100000(b: &mut Bencher) { fn vecdeque_append(b: &mut Bencher, count: usize) { let count = count as i32; - let vec1 = VecDeque::::from_iter(0..count / 2); - let vec2 = VecDeque::::from_iter(count / 2..count); + let vec1 = (0..count / 2).collect::>(); + let vec2 = (count / 2..count).collect::>(); b.iter(|| { let mut vec = vec1.clone(); vec.append(&mut vec2.clone()); @@ -288,7 +287,7 @@ fn vecdeque_append_100000(b: &mut Bencher) { } fn vec_split(b: &mut Bencher, count: usize) { - let vec = Vec::::from_iter(0..count as i32); + let vec = (0..count as i32).collect::>(); b.iter(|| { let _left = vec[..count / 2].to_owned(); let _right = vec[count / 2..].to_owned(); @@ -317,8 +316,8 @@ fn vec_split_100000(b: &mut Bencher) { fn vec_append(b: &mut Bencher, count: usize) { let count = count as i32; - let vec1 = Vec::::from_iter(0..count / 2); - let vec2 = Vec::::from_iter(count / 2..count); + let vec1 = (0..count / 2).collect::>(); + let vec2 = (count / 2..count).collect::>(); b.iter(|| { let mut vec = vec1.clone(); vec.append(&mut vec2.clone()); @@ -380,7 +379,7 @@ fn vec_push_back_mut_100000(b: &mut Bencher) { } fn vec_pop_back_mut(b: &mut Bencher, count: usize) { - let l = Vec::::from_iter(0..count as i32); + let l = (0..count as i32).collect::>(); b.iter(|| { let mut p = l.clone(); for _ in 0..count { diff --git a/benches/ordmap.rs b/benches/ordmap.rs index b26663d..37fe730 100644 --- a/benches/ordmap.rs +++ b/benches/ordmap.rs @@ -10,7 +10,6 @@ extern crate test; use rand::{rngs::SmallRng, Rng, SeedableRng}; use std::collections::BTreeSet; -use std::iter::FromIterator; use test::Bencher; use im::ordmap::OrdMap; @@ -40,7 +39,7 @@ fn reorder(vec: &[A]) -> Vec { fn ordmap_lookup_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let m: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, 1))); + let m: OrdMap = keys.into_iter().map(|i| (i, 1)).collect::>(); b.iter(|| { for i in &order { let _ = m.get(i); @@ -158,7 +157,7 @@ fn ordmap_insert_mut_pooled_10000(b: &mut Bencher) { fn ordmap_remove_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let map: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: OrdMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); for i in &order { @@ -185,7 +184,7 @@ fn ordmap_remove_1000(b: &mut Bencher) { fn ordmap_remove_mut_n(size: usize, b: &mut Bencher) { let keys = random_keys(size); let order = reorder(&keys); - let map: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: OrdMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); for i in &order { @@ -211,7 +210,7 @@ fn ordmap_remove_mut_1000(b: &mut Bencher) { #[bench] fn ordmap_remove_min_1000(b: &mut Bencher) { - let map: OrdMap = OrdMap::from_iter((0..1000).map(|i| (i, i))); + let map: OrdMap = (0..1000).map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); assert!(!m.is_empty()); @@ -224,7 +223,7 @@ fn ordmap_remove_min_1000(b: &mut Bencher) { #[bench] fn ordmap_remove_max_1000(b: &mut Bencher) { - let map: OrdMap = OrdMap::from_iter((0..1000).map(|i| (i, i))); + let map: OrdMap = (0..1000).map(|i| (i, i)).collect::>(); b.iter(|| { let mut m = map.clone(); assert!(!m.is_empty()); @@ -238,7 +237,7 @@ fn ordmap_remove_max_1000(b: &mut Bencher) { fn ordmap_insert_once_n(size: usize, b: &mut Bencher) { let mut keys = random_keys(size + 1); let key = keys.pop().unwrap(); - let map: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: OrdMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.update(key, key)) } @@ -265,7 +264,7 @@ fn ordmap_insert_once_10000(b: &mut Bencher) { fn ordmap_remove_once_n(size: usize, b: &mut Bencher) { let keys = random_keys(size + 1); let key = keys[0]; - let map: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: OrdMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.without(&key)) } @@ -292,7 +291,7 @@ fn ordmap_remove_once_10000(b: &mut Bencher) { fn ordmap_lookup_once_n(size: usize, b: &mut Bencher) { let keys = random_keys(size + 1); let key = keys[0]; - let map: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, i))); + let map: OrdMap = keys.into_iter().map(|i| (i, i)).collect::>(); b.iter(|| map.get(&key)) } @@ -318,7 +317,7 @@ fn ordmap_lookup_once_10000(b: &mut Bencher) { fn ordmap_iter(size: usize, b: &mut Bencher) { let keys = random_keys(size); - let m: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, 1))); + let m: OrdMap = keys.into_iter().map(|i| (i, 1)).collect::>(); b.iter(|| for _ in m.iter() {}) } @@ -344,7 +343,7 @@ fn ordmap_iter_10000(b: &mut Bencher) { fn ordmap_range_iter(size: usize, b: &mut Bencher) { let keys = random_keys(size); - let m: OrdMap = OrdMap::from_iter(keys.into_iter().map(|i| (i, 1))); + let m: OrdMap = keys.into_iter().map(|i| (i, 1)).collect::>(); b.iter(|| for _ in m.range(..) {}) } diff --git a/benches/vector.rs b/benches/vector.rs index 052939b..372b73c 100644 --- a/benches/vector.rs +++ b/benches/vector.rs @@ -11,7 +11,6 @@ extern crate test; use rand::distributions::{Distribution, Standard}; use rand::Rng; -use std::iter::FromIterator; use test::Bencher; use im::vector::Vector; @@ -83,7 +82,7 @@ fn vector_push_back_mut_100000(b: &mut Bencher) { } fn vector_pop_front_mut(b: &mut Bencher, count: usize) { - let l = Vector::::from_iter(0..count as i32); + let l = (0..count as i32).collect::>(); b.iter(|| { let mut p = l.clone(); for _ in 0..count { @@ -113,7 +112,7 @@ fn vector_pop_front_mut_100000(b: &mut Bencher) { } fn vector_pop_back_mut(b: &mut Bencher, count: usize) { - let l = Vector::::from_iter(0..count as i32); + let l = (0..count as i32).collect::>(); b.iter(|| { let mut p = l.clone(); for _ in 0..count { @@ -143,7 +142,7 @@ fn vector_pop_back_mut_100000(b: &mut Bencher) { } fn vector_split(b: &mut Bencher, count: usize) { - let vec = Vector::::from_iter(0..count as i32); + let vec = (0..count as i32).collect::>(); b.iter(|| vec.clone().split_off(count / 2)) } @@ -169,8 +168,8 @@ fn vector_split_100000(b: &mut Bencher) { fn vector_append(b: &mut Bencher, count: usize) { let count = count as i32; - let vec1 = Vector::::from_iter(0..count / 2); - let vec2 = Vector::::from_iter(count / 2..count); + let vec1 = (0..count / 2).collect::>(); + let vec2 = (count / 2..count).collect::>(); b.iter(|| { let mut vec = vec1.clone(); vec.append(vec2.clone()); diff --git a/proptest-regressions/ord/map.txt b/proptest-regressions/ord/map.txt index fc1e1de..9111b32 100644 --- a/proptest-regressions/ord/map.txt +++ b/proptest-regressions/ord/map.txt @@ -5,3 +5,4 @@ # It is recommended to check this file in to source control so that # everyone who runs the test benefits from these saved cases. xs 888006417 2608449019 3789353629 478040202 # shrinks to ref m = {0: 0} +cc 1cc795607ade8b03fded509b229a329cf489559bf1ffd51710469db6532ef3c3 # shrinks to ref orig = {13654: -29485, -24329: 12447, 28073: 17462, -11155: 3551, 11565: -26208, -15232: 7608, 29759: 20320, 438: -16354, 571: -10462, 7614: -10288, 23780: -23920, -6563: 29101, 26479: 3890, 26520: -11140, -17636: -22688, -9506: 1900, -30037: -31504, -26114: 12976, 22103: 27666, -16535: 28839, -16809: -30920, 20788: 18978, -20423: 26728, -31348: -22678, -9794: -21451, 16178: -20708, 31232: 29025, -30976: 4474, -29215: -26793, 852: -11649, -4772: -14366, -19460: -5289, -5325: 24856, 45: -20269, -23801: -29271, 27724: -17783, -23212: -18476, 30206: -16727, 435: -2093, 15924: 4857, -25633: 29368, -20962: -9007, -7339: 27158, -30115: -25527, 14804: -18380, -14522: 29035, 15562: 23077, -20118: 17616, 28098: 8432, -27495: 12350, 14609: -13814, -9145: 29859, -31933: 16305, 19469: -825, 2409: -19471, 20578: 22502, 7884: -12550, 11389: -14638, -21015: -16375, 9053: 16535, 4588: -7460, 9046: -8592, 9482: -10249, -30236: 32067, -5302: 27299, 30181: -6167, -29843: 7210, 16374: -32301, -25407: 20496, 2749: -11107, -5975: 27109, -27089: 2177, 8897: -31616, -29271: 2162, -31613: 20560, 31507: -14262, 21540: -25321, 24744: -7423, 26657: -26369, -12605: -22618, -27512: -21723, 291: -9951, -12495: -32742, 7539: 30444, -27269: -12562, 29899: 26866, -587: 20631, -31271: -32202, -15662: -21784, 28126: -31732, -9749: -6578, -13352: -5663, -5080: 21203, -31106: -8714, 29841: -16964, -11827: -13788, -24678: 4958, 6499: 17700, -5695: 1260, 12631: 29706, 21390: 794, 5009: -5889, -32578: -14971, -26389: -8078, 26546: 17151, -22373: 15689, 27572: 568, -5244: -1643, 23163: 11329, -28715: -15929, -25818: 12223, -4427: 28582, 26061: -32554, -14351: 5137, 3017: -15529, -23194: -19328, 30499: 5974, 16990: -31204, 28136: 23024, -13986: 5556, 12355: -10820, 2837: -15764, -8318: -22640, 19390: -32081, 5443: -11767, 14269: 4778, 12880: -8658, 23857: 15963, 29819: 14185, -28642: -14213, 1092: -1891, 3065: 7306, 5667: -16519, 13195: 30960, 30981: 3805, -18227: 17519, 26714: -10844, 1867: 3065, -21164: -23958, -27908: 23652, -3016: -25807, 21021: -24516, 601: 6650, 10464: -30444, -25383: 21397, 16149: -20990, -23678: 19268, 13651: -30926, -30193: 4015, -20550: -3813, 8984: 23024, 8529: 12538, 13423: 3073, 24037: -11619, -20993: -31582, -7056: -2892, -12795: 10504, -16197: 1330, -20748: -17973, -31199: 22341, 31286: -22643, 9674: -18049, -29206: -15460, -25215: -15832, 28334: 11339, 14680: 15220, -25943: 24920, 32275: -6093, 13259: 30579, -29041: -17489, 15886: 7941, 15683: 9359, -1635: 54, -30492: -21635, 10271: 18315, 13384: -5318, 31595: -23502, 14243: 5855, 10461: -11363, -3155: -29668, -5835: -8232, -28140: 19386, -761: 30096, -2515: 27267, -17737: -31871, 31096: -26754, -24336: 13642, -14011: -8588, -14996: 25507, 28759: 9825, -14214: 9160, -14712: -24558, 19038: -18469, -30816: -20086, 4334: -10671, -17006: 1184, -3730: 13058, 31026: -16485, 9580: -17771, -21186: 18345, -9664: -11262, -8480: 7648, 22920: -14965, -21022: -28133, -8744: -11234, -30252: -16231, -26305: 12363, -28149: -24604, -26462: 3796, 3057: -18784, 16634: 13983, 6987: -20371, 7469: 11214, 1205: -21956, -29086: 28404, 12269: 16334, 32493: -11094, 18386: -27104, -25066: -26762, -8850: 27225, -21958: -12209, -13409: -10100, -14283: -27726, -339: -26813, -25875: -8615, -9605: 8712, 10133: 21989, 9858: -12796, -19094: 32285, 32169: -26413, 2531: 30679, 15476: -23974, 14526: 26173, 32030: -8035, -32658: -23894, 32452: 31750, 8858: 3008, -22939: -30641, -570: 27228, -21127: -27648, 24710: 19973, 1390: 4422, 26123: 30745, -1229: -11664, -14679: 21300, -23645: -21514, -19979: -21143, 187: 26447, 1962: 103, -22968: 29896, 15464: 15061, 21532: 12811, -22803: -28425, 13579: -3285, -20628: -1077, -1080: 1008, 15835: -683, 29901: -2994, 8479: -3328, 21105: -27495, -3175: 19378, -30585: -24530, 17220: -24097, 30652: -32638, -21764: -4829, 24103: 19016, -21401: -27015, -31558: 18025, 30591: 11391, -22504: -23421, 5082: 27279, -2537: 27017, -12136: -749, 1815: -31786, -9416: -175, -12810: 30806, -9899: -2793, -32007: 30752, 20930: 30725, -28783: 8969, 29565: 2902, 18834: 2903, 31282: 30845, -10893: 28071, -20454: 1174, 27915: 5772, 29383: -1684, -5885: -19780, -9746: 17492, 8958: -7053, -1675: 24931, -20548: 29629, 10029: 19670, 372: 251, -22290: 1847, -22754: -8267, 15349: 14893, 6565: -16252, 5100: 31913, -21771: 247, 3407: -27092, 31264: 8619, -31498: 30586, -26457: -15280, 13900: -6472, 20237: 23494, -9435: -20123, 6560: 684, 6684: 13629, -19962: 31911, 7387: 22300, -16475: -211, 18073: -14359, 9010: -16589, -8927: 28464, -20438: -14947, 29302: -13068, 5174: -12114, -2684: 8886, 22145: -17371, -11264: -13950, -25938: -12728, -28145: -25911, -2871: -16462, -9775: -19757, 18920: 21013, 22571: 13793, -7253: 614, 1353: -19656, 22230: 14776, -25153: 4229, -26295: 15362, -25138: -16289, -26420: 21238, 32553: 2348, -17295: -15555, -18560: -30281, 25786: -5042, -10591: 10906, 17986: -1866, -32187: 14848, -8185: -18226, 28767: -25694, 15864: 740, -13565: -5281, 16351: -17855, 20798: 32488, 30621: 17130, -605: -12389, 11190: 6647, -5191: -7463, -17293: 21338, -1894: -29073, 10118: 15281, -24187: 12088, -13829: 32655, 19616: -29201, 32331: 26134, -22497: 12542, 2780: 29682, -8061: 20915, -15085: 21858, -2284: 1496, 12256: 14729, -12669: 8208, 12081: -20514, -19564: 21060, -5230: -3232, -47: 12452, -23297: 25490, 15469: 19166, -31330: -1486, 22627: 6048, 2274: 14307, -32613: -17602, 31993: -20703, 14408: -24288, -1425: 2191, -27528: 12719, -13137: -19771, -10087: -15533, 23123: 13133, -310: 28795, -17066: -28238, -323: -28130, 30008: -23016, 29855: 9227, -11934: -24563, -16278: -19539, 3943: -23354, 13038: 8483, -1376: -15228, 7177: -28754, 5920: -21813, 1028: -27574, -27086: -11996, -2451: 31603, -22198: 32494, 20534: 11352, -6499: 17474, -17125: -9124, 30067: 29674, -12170: -27056, 987: 10245, 20189: 7215, -17598: -31297, 20584: 32174, -27159: -25146, 15669: 14996, 22287: 32183, -17952: -27435, -20978: 29156, 17502: 23504, -2148: -3829, 14096: 8068, -25471: -11783, -10066: 25659, 14854: 17031, -16055: 30964, -24705: 9847, -21845: 27718, 30004: 14241, -2415: -3601, -23396: -26488, 27072: 4241, -25740: -23800, -32283: -6378, -20149: -2325, -29938: -25721, 26132: -5055, 4443: -8672, -4050: 19873, -936: -11208, -17559: 20749, 14497: 11691, 16966: 20137, -29672: 686, -11408: -10767, -2153: 29746, -31040: 2878, 2624: 10124, 7960: -27203, 17944: 18886, 5964: -30909, -6166: 25605, 13164: 10691, -27151: -18494, 6796: 10814, -9287: 8912, -27917: -2697, 21533: 22935, -27712: -24484, 8240: 27279, -10392: 24267, -5470: -32174, 18400: -29304, 6357: 9981, -10733: -30914, -20535: -266, -26868: -11399, -157: -13150, -7205: 6723, 23256: -6764, -786: 31308, -10664: 1606, -20685: -882, -24938: -1889, -7206: -3509, -25250: 31979, 30426: 128, 23897: -24001, -2859: -19488, -32217: 31472, 2593: 8890, 4407: 30506, 22878: 31925, -7560: -2864, -2411: -26849, 22106: -6447, 24278: 28527, 27516: -9012, 5476: -6024, 9147: 13764, 24213: -24869, -1759: -16068, -5603: -30129, 31029: -2919, -14714: 19182, -1590: 12635, -28358: 3872, -2090: -12305, -20911: -2417, 20313: 18181, -12831: -31538, 10130: 12759, -15468: 14679, 12923: 22142, 18271: -29174, -30962: 23155, 27775: -4512, -26395: -2421, -17588: 16263, 7453: 31385, 8023: 2389, -12214: 21076, 18059: 27701, -8734: 21859, 12513: -5333, 25322: -8656, 12712: 23597, 25917: -21636, -19326: -24361, 4360: -11045, -22272: 31718, -20938: -18069, 13566: -7383, -23839: -21705, -24263: 21476, -24653: 13628, -23521: 15327, -7348: -27475, -19318: -806, -8248: 14683, -29376: -8615, 24517: 4415, 19604: 19484, -32302: 22802, -24795: -13299, -12528: 32372, 13871: 5985, -8162: -19078, -22665: -32732, 9803: -4532, 27376: -14806, 15809: -23444, 16523: -6943, -25262: -4067, 12042: 6032, -13822: 21798, 11271: 16788, -6415: 783, 8921: -12257, -10523: 11184, 13024: 26551, -8164: -15301, 26059: 21139, -19775: -15038, 28467: 13920, 24798: 27943, 23346: 24954, 22060: -14719, 4525: -7210, -27468: -30621, 25871: -1553} diff --git a/rc/Cargo.toml b/rc/Cargo.toml index 0045fed..f0fc2ff 100644 --- a/rc/Cargo.toml +++ b/rc/Cargo.toml @@ -1,7 +1,8 @@ [package] name = "im-rc" -version = "15.0.0" +version = "15.1.0" edition = "2018" +rust-version = "1.46.0" authors = ["Bodil Stokke "] license = "MPL-2.0+" description = "Immutable collection datatypes (the fast but not thread safe version)" @@ -32,25 +33,25 @@ version_check = "0.9" [dependencies] typenum = "1.12" bitmaps = "2" -sized-chunks = "0.6" -rand_core = "0.5.1" -rand_xoshiro = "0.4" -quickcheck = { version = "0.9", optional = true } -proptest = { version = "0.9", optional = true } +sized-chunks = "0.6.4" +rand_core = "0.6" +rand_xoshiro = "0.6" +quickcheck = { version = "1", optional = true } +proptest = { version = "1", optional = true } serde = { version = "1", optional = true } rayon = { version = "1", optional = true } refpool = { version = "0.4", optional = true } -arbitrary = { version = "0.4", optional = true } +arbitrary = { version = "1.1", optional = true } [dev-dependencies] -proptest = "0.9" +proptest = "1" serde = "1" serde_json = "1" rayon = "1" -rand = { version = "0.7", features = ["small_rng"] } -pretty_assertions = "0.6" +rand = { version = "0.8", features = ["small_rng"] } +pretty_assertions = "1" metrohash = "1" -proptest-derive = "0.1" +proptest-derive = "0.3" ["package.metadata.docs.rs"] version_check = "0.9" diff --git a/release.toml b/release.toml index 6e0f03e..7032427 100644 --- a/release.toml +++ b/release.toml @@ -1,4 +1,5 @@ -no-dev-version = true sign-commit = true -pre-release-replacements = [ { file="CHANGELOG.md", search="\\[Unreleased\\]", replace="[{{version}}] - {{date}}" } ] +pre-release-replacements = [ + { file = "CHANGELOG.md", search = "\\[Unreleased\\]", replace = "[{{version}}] - {{date}}" } +] pre-release-hook = ["cargo", "make", "prepare-release"] diff --git a/src/arbitrary.rs b/src/arbitrary.rs index 86d2e4e..777a3b3 100644 --- a/src/arbitrary.rs +++ b/src/arbitrary.rs @@ -3,51 +3,17 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. use std::hash::{BuildHasher, Hash}; -use std::iter; use ::arbitrary::{size_hint, Arbitrary, Result, Unstructured}; use crate::{HashMap, HashSet, OrdMap, OrdSet, Vector}; -fn empty() -> Box> { - Box::new(iter::empty()) -} - -fn shrink_collection( - entries: impl Iterator, - f: impl Fn(&T) -> Box>, -) -> Box>> { - let entries: Vec<_> = entries.collect(); - if entries.is_empty() { - return empty(); - } - - let mut shrinkers: Vec> = vec![]; - let mut i = entries.len(); - loop { - shrinkers.push(entries.iter().take(i).map(&f).collect()); - i /= 2; - if i == 0 { - break; - } - } - Box::new(iter::once(Vec::new()).chain(iter::from_fn(move || loop { - let mut shrinker = shrinkers.pop()?; - let x: Option> = shrinker.iter_mut().map(|s| s.next()).collect(); - if x.is_none() { - continue; - } - shrinkers.push(shrinker); - return x; - }))) -} - -impl Arbitrary for Vector { - fn arbitrary(u: &mut Unstructured<'_>) -> Result { +impl<'a, A: Arbitrary<'a> + Clone> Arbitrary<'a> for Vector { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { u.arbitrary_iter()?.collect() } - fn arbitrary_take_rest(u: Unstructured<'_>) -> Result { + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { u.arbitrary_take_rest_iter()?.collect() } @@ -56,19 +22,14 @@ impl Arbitrary for Vector { size_hint::and(::size_hint(depth), (0, None)) }) } - - fn shrink(&self) -> Box> { - let collections = shrink_collection(self.iter(), |x| x.shrink()); - Box::new(collections.map(|entries| entries.into_iter().collect())) - } } -impl Arbitrary for OrdMap { - fn arbitrary(u: &mut Unstructured<'_>) -> Result { +impl<'a, K: Arbitrary<'a> + Ord + Clone, V: Arbitrary<'a> + Clone> Arbitrary<'a> for OrdMap { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { u.arbitrary_iter()?.collect() } - fn arbitrary_take_rest(u: Unstructured<'_>) -> Result { + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { u.arbitrary_take_rest_iter()?.collect() } @@ -77,20 +38,14 @@ impl Arbitrary for OrdMap::size_hint(depth), (0, None)) }) } - - fn shrink(&self) -> Box> { - let collections = - shrink_collection(self.iter(), |(k, v)| Box::new(k.shrink().zip(v.shrink()))); - Box::new(collections.map(|entries| entries.into_iter().collect())) - } } -impl Arbitrary for OrdSet { - fn arbitrary(u: &mut Unstructured<'_>) -> Result { +impl<'a, A: Arbitrary<'a> + Ord + Clone> Arbitrary<'a> for OrdSet { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { u.arbitrary_iter()?.collect() } - fn arbitrary_take_rest(u: Unstructured<'_>) -> Result { + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { u.arbitrary_take_rest_iter()?.collect() } @@ -99,24 +54,19 @@ impl Arbitrary for OrdSet { size_hint::and(::size_hint(depth), (0, None)) }) } - - fn shrink(&self) -> Box> { - let collections = shrink_collection(self.iter(), |v| v.shrink()); - Box::new(collections.map(|entries| entries.into_iter().collect())) - } } -impl Arbitrary for HashMap +impl<'a, K, V, S> Arbitrary<'a> for HashMap where - K: Arbitrary + Hash + Eq + Clone, - V: Arbitrary + Clone, + K: Arbitrary<'a> + Hash + Eq + Clone, + V: Arbitrary<'a> + Clone, S: BuildHasher + Default + 'static, { - fn arbitrary(u: &mut Unstructured<'_>) -> Result { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { u.arbitrary_iter()?.collect() } - fn arbitrary_take_rest(u: Unstructured<'_>) -> Result { + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { u.arbitrary_take_rest_iter()?.collect() } @@ -125,24 +75,18 @@ where size_hint::and(::size_hint(depth), (0, None)) }) } - - fn shrink(&self) -> Box> { - let collections = - shrink_collection(self.iter(), |(k, v)| Box::new(k.shrink().zip(v.shrink()))); - Box::new(collections.map(|entries| entries.into_iter().collect())) - } } -impl Arbitrary for HashSet +impl<'a, A, S> Arbitrary<'a> for HashSet where - A: Arbitrary + Hash + Eq + Clone, + A: Arbitrary<'a> + Hash + Eq + Clone, S: BuildHasher + Default + 'static, { - fn arbitrary(u: &mut Unstructured<'_>) -> Result { + fn arbitrary(u: &mut Unstructured<'a>) -> Result { u.arbitrary_iter()?.collect() } - fn arbitrary_take_rest(u: Unstructured<'_>) -> Result { + fn arbitrary_take_rest(u: Unstructured<'a>) -> Result { u.arbitrary_take_rest_iter()?.collect() } @@ -151,9 +95,4 @@ where size_hint::and(::size_hint(depth), (0, None)) }) } - - fn shrink(&self) -> Box> { - let collections = shrink_collection(self.iter(), |v| v.shrink()); - Box::new(collections.map(|entries| entries.into_iter().collect())) - } } diff --git a/src/hash/map.rs b/src/hash/map.rs index 02b84ba..4bbba40 100644 --- a/src/hash/map.rs +++ b/src/hash/map.rs @@ -376,7 +376,7 @@ where } let mut seen = collections::HashSet::new(); for (key, value) in self.iter() { - if Some(value) != other.get(&key) { + if Some(value) != other.get(key) { return false; } seen.insert(key); @@ -932,11 +932,16 @@ where /// assert_eq!(expected, map1.union(map2)); /// ``` #[must_use] - pub fn union(mut self, other: Self) -> Self { - for (k, v) in other { - self.entry(k).or_insert(v); + pub fn union(self, other: Self) -> Self { + let (mut to_mutate, to_consume) = if self.len() >= other.len() { + (self, other) + } else { + (other, self) + }; + for (k, v) in to_consume { + to_mutate.entry(k).or_insert(v); } - self + to_mutate } /// Construct the union of two maps, using a function to decide @@ -982,7 +987,20 @@ where /// )); /// ``` #[must_use] - pub fn union_with_key(mut self, other: Self, mut f: F) -> Self + pub fn union_with_key(self, other: Self, mut f: F) -> Self + where + F: FnMut(&K, V, V) -> V, + { + if self.len() >= other.len() { + self.union_with_key_inner(other, f) + } else { + other.union_with_key_inner(self, |key, other_value, self_value| { + f(key, self_value, other_value) + }) + } + } + + fn union_with_key_inner(mut self, other: Self, mut f: F) -> Self where F: FnMut(&K, V, V) -> V, { @@ -2109,7 +2127,7 @@ mod test { #[test] fn safe_mutation() { - let v1: HashMap = HashMap::from_iter((0..131_072).map(|i| (i, i))); + let v1: HashMap = (0..131_072).map(|i| (i, i)).collect::>(); let mut v2 = v1.clone(); v2.insert(131_000, 23); assert_eq!(Some(&23), v2.get(&131_000)); @@ -2196,15 +2214,15 @@ mod test { #[test] fn entry_api() { let mut map = hashmap! {"bar" => 5}; - map.entry(&"foo").and_modify(|v| *v += 5).or_insert(1); + map.entry("foo").and_modify(|v| *v += 5).or_insert(1); assert_eq!(1, map[&"foo"]); - map.entry(&"foo").and_modify(|v| *v += 5).or_insert(1); + map.entry("foo").and_modify(|v| *v += 5).or_insert(1); assert_eq!(6, map[&"foo"]); - map.entry(&"bar").and_modify(|v| *v += 5).or_insert(1); + map.entry("bar").and_modify(|v| *v += 5).or_insert(1); assert_eq!(10, map[&"bar"]); assert_eq!( 10, - match map.entry(&"bar") { + match map.entry("bar") { Entry::Occupied(entry) => entry.remove(), _ => panic!(), } diff --git a/src/hash/set.rs b/src/hash/set.rs index 894632f..11ba3a0 100644 --- a/src/hash/set.rs +++ b/src/hash/set.rs @@ -34,6 +34,7 @@ use std::ops::{Add, Deref, Mul}; use crate::nodes::hamt::{hash_key, Drain as NodeDrain, HashValue, Iter as NodeIter, Node}; use crate::ordset::OrdSet; use crate::util::{Pool, PoolRef, Ref}; +use crate::Vector; /// Construct a set from a sequence of values. /// @@ -336,7 +337,7 @@ where } let mut seen = collections::HashSet::new(); for value in self.iter() { - if !other.contains(&value) { + if !other.contains(value) { return false; } seen.insert(value); @@ -371,7 +372,7 @@ where RS: Borrow, { let o = other.borrow(); - self.iter().all(|a| o.contains(&a)) + self.iter().all(|a| o.contains(a)) } /// Test whether a set is a proper subset of another set, meaning @@ -511,11 +512,16 @@ where /// assert_eq!(expected, set1.union(set2)); /// ``` #[must_use] - pub fn union(mut self, other: Self) -> Self { - for value in other { - self.insert(value); + pub fn union(self, other: Self) -> Self { + let (mut to_mutate, to_consume) = if self.len() >= other.len() { + (self, other) + } else { + (other, self) + }; + for value in to_consume { + to_mutate.insert(value); } - self + to_mutate } /// Construct the union of multiple sets. @@ -974,6 +980,26 @@ where } } +impl From> for HashSet +where + A: Hash + Eq + Clone, + S: BuildHasher + Default, +{ + fn from(vector: Vector) -> Self { + vector.into_iter().collect() + } +} + +impl<'a, A, S> From<&'a Vector> for HashSet +where + A: Hash + Eq + Clone, + S: BuildHasher + Default, +{ + fn from(vector: &Vector) -> Self { + vector.iter().cloned().collect() + } +} + impl From> for HashSet where A: Eq + Hash + Clone, @@ -1077,7 +1103,7 @@ mod test { use crate::test::MetroHashBuilder; for i in 0..1000 { let mut lhs = vec![0, 1, 2]; - lhs.sort(); + lhs.sort_unstable(); let hasher = Ref::from(MetroHashBuilder::new(i)); let mut iset: HashSet<_, MetroHashBuilder> = HashSet::with_hasher(hasher.clone()); @@ -1086,7 +1112,7 @@ mod test { } let mut rhs: Vec<_> = iset.clone().into_iter().collect(); - rhs.sort(); + rhs.sort_unstable(); if lhs != rhs { println!("iteration: {}", i); diff --git a/src/nodes/btree.rs b/src/nodes/btree.rs index f327296..84f63fa 100644 --- a/src/nodes/btree.rs +++ b/src/nodes/btree.rs @@ -16,7 +16,7 @@ use crate::util::{Pool, PoolClone, PoolDefault, PoolRef}; use self::Insert::*; use self::InsertAction::*; -const NODE_SIZE: usize = NodeSize::USIZE; +pub(crate) const NODE_SIZE: usize = NodeSize::USIZE; const MEDIAN: usize = (NODE_SIZE + 1) >> 1; pub trait BTreeValue { @@ -92,9 +92,14 @@ pub(crate) enum Remove { Update(A, Node), } +enum Boundary { + Lowest, + Highest, +} + enum RemoveAction { DeleteAt(usize), - PullUp(usize, usize, usize), + PullUp(Boundary, usize, usize), Merge(usize), StealFromLeft(usize), StealFromRight(usize), @@ -134,11 +139,6 @@ impl Node { self.keys.len() < MEDIAN } - #[inline] - fn is_leaf(&self) -> bool { - self.children[0].is_none() - } - #[inline] pub(crate) fn unit(value: A) -> Self { Node { @@ -247,10 +247,7 @@ impl Node { Ok(index) => Some(&self.keys[index]), Err(index) => match self.children[index] { None if index == 0 => None, - None => match self.keys.get(index - 1) { - Some(_) => Some(&self.keys[index - 1]), - None => None, - }, + None => self.keys.get(index - 1).map(|_| &self.keys[index - 1]), Some(ref node) => node.lookup_prev(key), }, } @@ -267,10 +264,7 @@ impl Node { match A::search_key(&self.keys, key) { Ok(index) => Some(&self.keys[index]), Err(index) => match self.children[index] { - None => match self.keys.get(index) { - Some(_) => Some(&self.keys[index]), - None => None, - }, + None => self.keys.get(index).map(|_| &self.keys[index]), Some(ref node) => node.lookup_next(key), }, } @@ -400,7 +394,17 @@ impl Node { path.push((self, index)); path } - None => Vec::new(), + None => { + // go back up to find next + while let Some((node, idx)) = path.last() { + if node.keys.len() == *idx { + path.pop(); + } else { + break; + } + } + path + } }, Some(ref node) => { path.push((self, index)); @@ -429,14 +433,22 @@ impl Node { path } Err(index) => match self.children[index] { - None if index == 0 => Vec::new(), - None => match self.keys.get(index - 1) { - Some(_) => { - path.push((self, index)); - path + None if index == 0 => { + // go back up to find prev + while let Some((_, idx)) = path.last_mut() { + if *idx == 0 { + path.pop(); + } else { + *idx -= 1; + break; + } } - None => Vec::new(), - }, + path + } + None => { + path.push((self, index - 1)); + path + } Some(ref node) => { path.push((self, index)); node.path_prev(key, path) @@ -623,14 +635,32 @@ impl Node { A::Key: Borrow, { let index = A::search_key(&self.keys, key); - self.remove_index(pool, index, key) + self.remove_index(pool, index, Ok(key)) + } + + fn remove_target( + &mut self, + pool: &Pool>, + target: Result<&BK, Boundary>, + ) -> Remove + where + A: Clone, + BK: Ord + ?Sized, + A::Key: Borrow, + { + let index = match target { + Ok(key) => A::search_key(&self.keys, key), + Err(Boundary::Lowest) => Err(0), + Err(Boundary::Highest) => Err(self.keys.len()), + }; + self.remove_index(pool, index, target) } fn remove_index( &mut self, pool: &Pool>, index: Result, - key: &BK, + target: Result<&BK, Boundary>, ) -> Remove where A: Clone, @@ -643,32 +673,30 @@ impl Node { match (&self.children[index], &self.children[index + 1]) { // If we're a leaf, just delete the entry. (&None, &None) => RemoveAction::DeleteAt(index), - // If the left hand child has capacity, pull the predecessor up. - (&Some(ref left), _) if !left.too_small() => { - if left.is_leaf() { - RemoveAction::PullUp(left.keys.len() - 1, index, index) - } else { - RemoveAction::StealFromLeft(index + 1) - } - } - // If the right hand child has capacity, pull the successor up. - (_, &Some(ref right)) if !right.too_small() => { - if right.is_leaf() { - RemoveAction::PullUp(0, index, index + 1) + // First consider pulling either predecessor (from left) or successor (from right). + // otherwise just merge the two small children. + (&Some(ref left), &Some(ref right)) => { + if !left.too_small() { + RemoveAction::PullUp(Boundary::Highest, index, index) + } else if !right.too_small() { + RemoveAction::PullUp(Boundary::Lowest, index, index + 1) } else { - RemoveAction::StealFromRight(index) + RemoveAction::Merge(index) } } - // If neither child has capacity, we'll have to merge them. - (&Some(_), &Some(_)) => RemoveAction::Merge(index), - // If one child exists and the other doesn't, we're in a bad state. - _ => unreachable!(), + _ => unreachable!("Branch missing children"), } } - // Key is adjacent to some key in node + // Target is adjacent to some key in node Err(index) => match self.children[index] { - // No child at location means key isn't in map. - None => return Remove::NoChange, + // We're deading with a leaf node + None => match target { + // No child at location means key isn't in map. + Ok(_key) => return Remove::NoChange, + // Looking for the lowest or highest key + Err(Boundary::Lowest) => RemoveAction::DeleteAt(0), + Err(Boundary::Highest) => RemoveAction::DeleteAt(self.keys.len() - 1), + }, // Child at location, but it's at minimum capacity. Some(ref child) if child.too_small() => { let left = if index > 0 { @@ -704,13 +732,13 @@ impl Node { self.children.remove(index); Remove::Removed(pair) } - RemoveAction::PullUp(target_index, pull_to, child_index) => { + RemoveAction::PullUp(boundary, pull_to, child_index) => { let children = &mut self.children; let mut update = None; let value; if let Some(&mut Some(ref mut child_ref)) = children.get_mut(child_index) { let child = PoolRef::make_mut(pool, child_ref); - match child.remove_index(pool, Ok(target_index), key) { + match child.remove_target(pool, Err(boundary)) { Remove::NoChange => unreachable!(), Remove::Removed(pulled_value) => { value = self.keys.set(pull_to, pulled_value); @@ -737,7 +765,7 @@ impl Node { PoolRef::unwrap_or_clone(left), PoolRef::unwrap_or_clone(right), ); - let (removed, new_child) = match merged_child.remove(pool, key) { + let (removed, new_child) = match merged_child.remove_target(pool, target) { Remove::NoChange => unreachable!(), Remove::Removed(removed) => (removed, merged_child), Remove::Update(removed, updated_child) => (removed, updated_child), @@ -756,13 +784,7 @@ impl Node { { let mut children = self.children.as_mut_slice()[index - 1..=index] .iter_mut() - .map(|n| { - if let Some(ref mut o) = *n { - o - } else { - unreachable!() - } - }); + .map(|n| n.as_mut().unwrap()); let left = PoolRef::make_mut(pool, children.next().unwrap()); let child = PoolRef::make_mut(pool, children.next().unwrap()); // Prepare the rebalanced node. @@ -770,7 +792,7 @@ impl Node { left.children.last().unwrap().clone(), self.keys[index - 1].clone(), ); - match child.remove(pool, key) { + match child.remove_target(pool, target) { Remove::NoChange => { // Key wasn't there, we need to revert the steal. child.pop_min(); @@ -802,18 +824,12 @@ impl Node { { let mut children = self.children.as_mut_slice()[index..index + 2] .iter_mut() - .map(|n| { - if let Some(ref mut o) = *n { - o - } else { - unreachable!() - } - }); + .map(|n| n.as_mut().unwrap()); let child = PoolRef::make_mut(pool, children.next().unwrap()); let right = PoolRef::make_mut(pool, children.next().unwrap()); // Prepare the rebalanced node. child.push_max(right.children[0].clone(), self.keys[index].clone()); - match child.remove(pool, key) { + match child.remove_target(pool, target) { Remove::NoChange => { // Key wasn't there, we need to revert the steal. child.pop_max(); @@ -840,11 +856,17 @@ impl Node { Remove::Removed(out_value) } RemoveAction::MergeFirst(index) => { - if self.keys[index].cmp_keys(key) != Ordering::Equal - && !self.child_contains(index, key) - && !self.child_contains(index + 1, key) - { - return Remove::NoChange; + if let Ok(key) = target { + // Bail early if we're looking for a not existing key + match self.keys[index].cmp_keys(key) { + Ordering::Less if !self.child_contains(index + 1, key) => { + return Remove::NoChange + } + Ordering::Greater if !self.child_contains(index, key) => { + return Remove::NoChange + } + _ => (), + } } let left = self.children.remove(index).unwrap(); let right = mem::replace(&mut self.children[index], None).unwrap(); @@ -856,7 +878,7 @@ impl Node { ); let update; let out_value; - match merged.remove(pool, key) { + match merged.remove_target(pool, target) { Remove::NoChange => { panic!("nodes::btree::Node::remove: caught an absent key too late while merging"); } @@ -883,7 +905,7 @@ impl Node { let out_value; if let Some(&mut Some(ref mut child_ref)) = self.children.get_mut(index) { let child = PoolRef::make_mut(pool, child_ref); - match child.remove(pool, key) { + match child.remove_target(pool, target) { Remove::NoChange => return Remove::NoChange, Remove::Removed(value) => { out_value = value; @@ -1265,7 +1287,7 @@ impl<'a, A: 'a> DiffIter<'a, A> { fn push_node(stack: &mut Vec>, maybe_node: &'a Option>>) { if let Some(ref node) = *maybe_node { - stack.push(IterItem::Consider(&node)) + stack.push(IterItem::Consider(node)) } } @@ -1290,11 +1312,11 @@ where match (self.old_stack.pop(), self.new_stack.pop()) { (None, None) => return None, (None, Some(new)) => match new { - IterItem::Consider(new) => Self::push(&mut self.new_stack, &new), + IterItem::Consider(new) => Self::push(&mut self.new_stack, new), IterItem::Yield(new) => return Some(DiffItem::Add(new)), }, (Some(old), None) => match old { - IterItem::Consider(old) => Self::push(&mut self.old_stack, &old), + IterItem::Consider(old) => Self::push(&mut self.old_stack, old), IterItem::Yield(old) => return Some(DiffItem::Remove(old)), }, (Some(old), Some(new)) => match (old, new) { @@ -1302,29 +1324,29 @@ where if !std::ptr::eq(old, new) { match old.keys[0].cmp_values(&new.keys[0]) { Ordering::Less => { - Self::push(&mut self.old_stack, &old); + Self::push(&mut self.old_stack, old); self.new_stack.push(IterItem::Consider(new)); } Ordering::Greater => { self.old_stack.push(IterItem::Consider(old)); - Self::push(&mut self.new_stack, &new); + Self::push(&mut self.new_stack, new); } Ordering::Equal => { - Self::push(&mut self.old_stack, &old); - Self::push(&mut self.new_stack, &new); + Self::push(&mut self.old_stack, old); + Self::push(&mut self.new_stack, new); } } } } (IterItem::Consider(old), IterItem::Yield(new)) => { - Self::push(&mut self.old_stack, &old); + Self::push(&mut self.old_stack, old); self.new_stack.push(IterItem::Yield(new)); } (IterItem::Yield(old), IterItem::Consider(new)) => { self.old_stack.push(IterItem::Yield(old)); - Self::push(&mut self.new_stack, &new); + Self::push(&mut self.new_stack, new); } - (IterItem::Yield(old), IterItem::Yield(new)) => match old.cmp_values(&new) { + (IterItem::Yield(old), IterItem::Yield(new)) => match old.cmp_values(new) { Ordering::Less => { self.new_stack.push(IterItem::Yield(new)); return Some(DiffItem::Remove(old)); diff --git a/src/nodes/hamt.rs b/src/nodes/hamt.rs index 8ee6157..945068b 100644 --- a/src/nodes/hamt.rs +++ b/src/nodes/hamt.rs @@ -100,10 +100,7 @@ impl Clone for Entry { impl Entry { fn is_value(&self) -> bool { - match self { - Entry::Value(_, _) => true, - _ => false, - } + matches!(self, Entry::Value(_, _)) } fn unwrap_value(self) -> A { diff --git a/src/nodes/rrb.rs b/src/nodes/rrb.rs index 2ef031a..8809b84 100644 --- a/src/nodes/rrb.rs +++ b/src/nodes/rrb.rs @@ -235,10 +235,7 @@ impl Entry { } fn is_empty_node(&self) -> bool { - match self { - Empty => true, - _ => false, - } + matches!(self, Empty) } } @@ -384,10 +381,7 @@ impl Node { /// True if the node is dense and so doesn't have a size table fn is_dense(&self) -> bool { - match self.children { - Entry::Nodes(Size::Table(_), _) => false, - _ => true, - } + !matches!(self.children, Entry::Nodes(Size::Table(_), _)) } /// True if the node and its children are dense and at capacity @@ -1042,11 +1036,7 @@ impl Node { // Parent nodes should never occur at level 0. assert_ne!(0, level); let mut lengths = Vec::new(); - let should_be_dense = if let Size::Size(_) = size { - true - } else { - false - }; + let should_be_dense = matches!(size, Size::Size(_)); for (index, child) in children.iter().enumerate() { let len = child.assert_invariants(level - 1); if should_be_dense && index < children.len() - 1 { diff --git a/src/ord/map.rs b/src/ord/map.rs index c2c0dfa..1c32a38 100644 --- a/src/ord/map.rs +++ b/src/ord/map.rs @@ -981,11 +981,16 @@ where /// ``` #[inline] #[must_use] - pub fn union(mut self, other: Self) -> Self { - for (k, v) in other { - self.entry(k).or_insert(v); + pub fn union(self, other: Self) -> Self { + let (mut to_mutate, to_consume) = if self.len() >= other.len() { + (self, other) + } else { + (other, self) + }; + for (k, v) in to_consume { + to_mutate.entry(k).or_insert(v); } - self + to_mutate } /// Construct the union of two maps, using a function to decide @@ -1031,7 +1036,20 @@ where /// )); /// ``` #[must_use] - pub fn union_with_key(mut self, other: Self, mut f: F) -> Self + pub fn union_with_key(self, other: Self, mut f: F) -> Self + where + F: FnMut(&K, V, V) -> V, + { + if self.len() >= other.len() { + self.union_with_key_inner(other, f) + } else { + other.union_with_key_inner(self, |key, other_value, self_value| { + f(key, self_value, other_value) + }) + } + } + + fn union_with_key_inner(mut self, other: Self, mut f: F) -> Self where F: FnMut(&K, V, V) -> V, { @@ -1930,10 +1948,7 @@ where V: 'a, { fn next_back(&mut self) -> Option { - match self.it.next_back() { - None => None, - Some((k, _)) => Some(k), - } + self.it.next_back().map(|(k, _)| k) } } @@ -1971,10 +1986,7 @@ where V: 'a, { fn next_back(&mut self) -> Option { - match self.it.next_back() { - None => None, - Some((_, v)) => Some(v), - } + self.it.next_back().map(|(_, v)| v) } } @@ -2307,7 +2319,7 @@ mod test { #[test] fn safe_mutation() { - let v1 = OrdMap::from_iter((0..131_072).map(|i| (i, i))); + let v1 = (0..131_072).map(|i| (i, i)).collect::>(); let mut v2 = v1.clone(); v2.insert(131_000, 23); assert_eq!(Some(&23), v2.get(&131_000)); @@ -2325,15 +2337,15 @@ mod test { #[test] fn entry_api() { let mut map = ordmap! {"bar" => 5}; - map.entry(&"foo").and_modify(|v| *v += 5).or_insert(1); + map.entry("foo").and_modify(|v| *v += 5).or_insert(1); assert_eq!(1, map[&"foo"]); - map.entry(&"foo").and_modify(|v| *v += 5).or_insert(1); + map.entry("foo").and_modify(|v| *v += 5).or_insert(1); assert_eq!(6, map[&"foo"]); - map.entry(&"bar").and_modify(|v| *v += 5).or_insert(1); + map.entry("bar").and_modify(|v| *v += 5).or_insert(1); assert_eq!(10, map[&"bar"]); assert_eq!( 10, - match map.entry(&"bar") { + match map.entry("bar") { Entry::Occupied(entry) => entry.remove(), _ => panic!(), } @@ -2354,19 +2366,19 @@ mod test { #[test] fn ranged_iter() { - let map: OrdMap = ordmap![1=>2, 2=>3, 3=>4, 4=>5, 5=>6]; + let map: OrdMap = ordmap![1=>2, 2=>3, 3=>4, 4=>5, 5=>6, 7=>8]; let range: Vec<(i32, i32)> = map.range(..).map(|(k, v)| (*k, *v)).collect(); - assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], range); + assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (7, 8)], range); let range: Vec<(i32, i32)> = map.range(..).rev().map(|(k, v)| (*k, *v)).collect(); - assert_eq!(vec![(5, 6), (4, 5), (3, 4), (2, 3), (1, 2)], range); + assert_eq!(vec![(7, 8), (5, 6), (4, 5), (3, 4), (2, 3), (1, 2)], range); let range: Vec<(i32, i32)> = map.range(2..5).map(|(k, v)| (*k, *v)).collect(); assert_eq!(vec![(2, 3), (3, 4), (4, 5)], range); let range: Vec<(i32, i32)> = map.range(2..5).rev().map(|(k, v)| (*k, *v)).collect(); assert_eq!(vec![(4, 5), (3, 4), (2, 3)], range); let range: Vec<(i32, i32)> = map.range(3..).map(|(k, v)| (*k, *v)).collect(); - assert_eq!(vec![(3, 4), (4, 5), (5, 6)], range); + assert_eq!(vec![(3, 4), (4, 5), (5, 6), (7, 8)], range); let range: Vec<(i32, i32)> = map.range(3..).rev().map(|(k, v)| (*k, *v)).collect(); - assert_eq!(vec![(5, 6), (4, 5), (3, 4)], range); + assert_eq!(vec![(7, 8), (5, 6), (4, 5), (3, 4)], range); let range: Vec<(i32, i32)> = map.range(..4).map(|(k, v)| (*k, *v)).collect(); assert_eq!(vec![(1, 2), (2, 3), (3, 4)], range); let range: Vec<(i32, i32)> = map.range(..4).rev().map(|(k, v)| (*k, *v)).collect(); @@ -2375,19 +2387,60 @@ mod test { assert_eq!(vec![(1, 2), (2, 3), (3, 4)], range); let range: Vec<(i32, i32)> = map.range(..=3).rev().map(|(k, v)| (*k, *v)).collect(); assert_eq!(vec![(3, 4), (2, 3), (1, 2)], range); + let range: Vec<(i32, i32)> = map.range(..6).map(|(k, v)| (*k, *v)).collect(); + assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], range); + let range: Vec<(i32, i32)> = map.range(..=6).map(|(k, v)| (*k, *v)).collect(); + assert_eq!(vec![(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], range); + } + + #[test] + fn range_iter_big() { + use crate::nodes::btree::NODE_SIZE; + use std::ops::Bound::Included; + const N: usize = NODE_SIZE * NODE_SIZE * 5; // enough for a sizeable 3 level tree + + let data = (1usize..N).filter(|i| i % 2 == 0).map(|i| (i, ())); + let bmap = data + .clone() + .collect::>(); + let omap = data.collect::>(); + + for i in (0..NODE_SIZE * 5).chain(N - NODE_SIZE * 5..=N + 1) { + assert_eq!(omap.range(i..).count(), bmap.range(i..).count()); + assert_eq!(omap.range(..i).count(), bmap.range(..i).count()); + assert_eq!(omap.range(i..i + 7).count(), bmap.range(i..i + 7).count()); + assert_eq!(omap.range(i..=i + 7).count(), bmap.range(i..=i + 7).count()); + assert_eq!( + omap.range((Included(i), Included(i + 7))).count(), + bmap.range((Included(i), Included(i + 7))).count(), + ); + } + } + + #[test] + fn issue_124() { + let mut map = OrdMap::new(); + let contents = include_str!("test-fixtures/issue_124.txt"); + for line in contents.lines() { + if line.starts_with("insert ") { + map.insert(line[7..].parse::().unwrap(), 0); + } else if line.starts_with("remove ") { + map.remove(&line[7..].parse::().unwrap()); + } + } } proptest! { #[test] fn length(ref input in collection::btree_map(i16::ANY, i16::ANY, 0..1000)) { let map: OrdMap = OrdMap::from(input.clone()); - input.len() == map.len() + assert_eq!(input.len(), map.len()); } #[test] fn order(ref input in collection::hash_map(i16::ANY, i16::ANY, 0..1000)) { let map: OrdMap = OrdMap::from(input.clone()); - is_sorted(map.keys()) + assert!(is_sorted(map.keys())); } #[test] @@ -2572,9 +2625,9 @@ mod test { let diff: Vec<_> = a.diff(&b).collect(); let union = b.clone().union(a.clone()); let expected: Vec<_> = union.iter().filter_map(|(k, v)| { - if a.contains_key(&k) { - if b.contains_key(&k) { - let old = a.get(&k).unwrap(); + if a.contains_key(k) { + if b.contains_key(k) { + let old = a.get(k).unwrap(); if old != v { Some(DiffItem::Update { old: (k, old), diff --git a/src/ord/set.rs b/src/ord/set.rs index 10d692b..2fd674a 100644 --- a/src/ord/set.rs +++ b/src/ord/set.rs @@ -14,7 +14,7 @@ //! [`HashSet`][hashset::HashSet] has no guaranteed ordering. //! //! [1]: https://en.wikipedia.org/wiki/B-tree -//! [hashset::HashSet]: ../hashset/struct.HashSet.html +//! [hashset::HashSet]: ./struct.HashSet.html //! [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html use std::borrow::Borrow; @@ -170,7 +170,7 @@ def_pool!(OrdSetPool, Node>); /// [`HashSet`][hashset::HashSet] has no guaranteed ordering. /// /// [1]: https://en.wikipedia.org/wiki/B-tree -/// [hashset::HashSet]: ../hashset/struct.HashSet.html +/// [hashset::HashSet]: ./struct.HashSet.html /// [std::cmp::Ord]: https://doc.rust-lang.org/std/cmp/trait.Ord.html pub struct OrdSet { size: usize, @@ -449,7 +449,7 @@ where if other.len() < self.len() { return false; } - self.iter().all(|a| other.contains(&a)) + self.iter().all(|a| other.contains(a)) } /// Test whether a set is a proper subset of another set, meaning @@ -604,7 +604,7 @@ where #[must_use] pub fn without_min(&self) -> (Option, Self) { match self.get_min() { - Some(v) => (Some(v.clone()), self.without(&v)), + Some(v) => (Some(v.clone()), self.without(v)), None => (None, self.clone()), } } @@ -616,7 +616,7 @@ where #[must_use] pub fn without_max(&self) -> (Option, Self) { match self.get_max() { - Some(v) => (Some(v.clone()), self.without(&v)), + Some(v) => (Some(v.clone()), self.without(v)), None => (None, self.clone()), } } @@ -636,11 +636,16 @@ where /// assert_eq!(expected, set1.union(set2)); /// ``` #[must_use] - pub fn union(mut self, other: Self) -> Self { - for value in other { - self.insert(value); + pub fn union(self, other: Self) -> Self { + let (mut to_mutate, to_consume) = if self.len() >= other.len() { + (self, other) + } else { + (other, self) + }; + for value in to_consume { + to_mutate.insert(value); } - self + to_mutate } /// Construct the union of multiple sets. @@ -1225,12 +1230,12 @@ mod test { fn long_ranged_iter(max in 1..1000) { let range = 0..max; let expected: Vec = range.clone().collect(); - let set: OrdSet = OrdSet::from_iter(range.clone()); + let set: OrdSet = range.clone().collect::>(); let result: Vec = set.range(..).cloned().collect(); assert_eq!(expected, result); let expected: Vec = range.clone().rev().collect(); - let set: OrdSet = OrdSet::from_iter(range); + let set: OrdSet = range.collect::>(); let result: Vec = set.range(..).rev().cloned().collect(); assert_eq!(expected, result); } diff --git a/src/ord/test-fixtures/issue_124.txt b/src/ord/test-fixtures/issue_124.txt new file mode 100644 index 0000000..5178617 --- /dev/null +++ b/src/ord/test-fixtures/issue_124.txt @@ -0,0 +1,3492 @@ +insert 1495 +insert 1568 +insert 1313 +insert 824 +insert 926 +insert 3031 +insert 872 +insert 1330 +insert 2356 +insert 298 +insert 1957 +insert 2133 +insert 3295 +insert 1139 +insert 2895 +insert 2442 +insert 553 +insert 2637 +insert 2571 +insert 352 +insert 1076 +insert 1611 +insert 902 +insert 480 +insert 1489 +insert 3223 +insert 169 +insert 2912 +insert 2276 +insert 1512 +insert 291 +insert 137 +insert 2917 +insert 2509 +insert 1729 +insert 62 +insert 1381 +insert 647 +insert 1647 +insert 2064 +insert 1847 +insert 1618 +insert 528 +insert 431 +insert 639 +insert 1910 +insert 1764 +insert 114 +insert 2872 +insert 2911 +insert 999 +insert 15 +insert 53 +insert 1924 +insert 2195 +insert 1134 +insert 269 +insert 2903 +insert 432 +insert 149 +insert 1241 +insert 3266 +insert 1975 +insert 2095 +insert 1384 +insert 2858 +insert 2814 +insert 2735 +insert 2779 +insert 991 +insert 1725 +insert 1804 +insert 959 +insert 1395 +insert 720 +insert 1758 +insert 1459 +insert 925 +insert 860 +insert 1035 +insert 1310 +insert 2892 +insert 3129 +insert 891 +insert 913 +insert 2136 +insert 45 +insert 255 +insert 2980 +insert 2918 +insert 2234 +insert 2845 +insert 2135 +insert 2818 +insert 978 +insert 2038 +insert 2251 +insert 14 +insert 333 +insert 649 +insert 1947 +insert 1768 +insert 3309 +insert 3063 +insert 788 +insert 65 +insert 833 +insert 1038 +insert 1966 +insert 1746 +insert 1595 +insert 2512 +insert 1543 +insert 1269 +insert 243 +insert 175 +insert 259 +insert 4 +insert 2715 +insert 297 +insert 2386 +insert 1060 +insert 2686 +insert 2400 +insert 2548 +insert 278 +insert 1890 +insert 1777 +insert 1424 +insert 2109 +insert 3307 +insert 1974 +insert 1985 +insert 3144 +insert 1186 +insert 1945 +insert 3184 +insert 1488 +insert 1707 +insert 2915 +insert 2995 +insert 2467 +insert 1791 +insert 1309 +insert 2916 +insert 1941 +insert 1824 +insert 1525 +insert 1626 +insert 1687 +insert 2333 +insert 2198 +insert 1237 +insert 2931 +insert 2764 +insert 2609 +insert 1202 +insert 1314 +insert 1556 +insert 1892 +insert 2329 +insert 2065 +insert 1559 +insert 2282 +insert 3279 +insert 1651 +insert 1610 +insert 2039 +insert 3269 +insert 1948 +insert 1663 +insert 1627 +insert 943 +insert 2313 +insert 1048 +insert 2399 +insert 2302 +insert 1022 +insert 946 +insert 2303 +insert 1085 +insert 108 +insert 2738 +insert 1311 +insert 844 +insert 1166 +insert 3198 +insert 1093 +insert 1192 +insert 1508 +insert 2471 +insert 2518 +insert 3209 +insert 1149 +insert 1743 +insert 1770 +insert 960 +insert 895 +insert 1806 +insert 1137 +insert 1654 +insert 1386 +insert 2727 +insert 1379 +insert 2572 +insert 128 +insert 2476 +insert 182 +insert 1037 +insert 605 +insert 2494 +insert 2561 +insert 941 +insert 2748 +insert 1448 +insert 2260 +insert 1273 +insert 2558 +insert 1198 +insert 1774 +insert 1740 +insert 1861 +insert 3049 +insert 2821 +insert 1341 +insert 1661 +insert 1506 +insert 1741 +insert 1811 +insert 1737 +insert 1693 +insert 1877 +insert 1756 +insert 1755 +insert 1553 +insert 1864 +insert 1734 +insert 1790 +insert 1753 +insert 2396 +insert 2531 +insert 1878 +insert 1809 +insert 2692 +insert 1854 +insert 1960 +insert 1999 +insert 2028 +insert 1879 +insert 1590 +insert 2521 +insert 3081 +insert 2665 +insert 1638 +insert 1667 +insert 1417 +insert 1876 +insert 3113 +insert 2757 +insert 2711 +insert 2587 +insert 1607 +insert 2568 +insert 2724 +insert 2685 +insert 2523 +insert 3151 +insert 1530 +insert 2454 +insert 2539 +insert 1356 +insert 1885 +insert 769 +insert 1982 +insert 3059 +insert 1232 +insert 2773 +insert 3270 +insert 2599 +insert 294 +insert 164 +insert 22 +insert 239 +insert 648 +insert 1679 +insert 644 +insert 398 +insert 455 +insert 443 +insert 1686 +insert 758 +insert 1720 +insert 1387 +insert 672 +insert 2569 +insert 2921 +insert 1228 +insert 1521 +insert 2115 +insert 2101 +insert 3035 +insert 2088 +insert 2094 +insert 1290 +insert 940 +insert 1303 +insert 2515 +insert 2863 +insert 1319 +insert 1315 +insert 2445 +insert 1949 +insert 2935 +insert 1992 +insert 1435 +insert 1413 +insert 1742 +insert 2769 +insert 2266 +insert 3290 +insert 3224 +insert 3171 +insert 2981 +insert 3200 +insert 3140 +insert 493 +insert 1299 +insert 338 +insert 1639 +insert 1463 +insert 730 +insert 1779 +insert 1918 +insert 2804 +insert 1476 +remove 432 +insert 296 +insert 1469 +insert 1364 +insert 1732 +insert 1908 +insert 2076 +insert 2489 +insert 2401 +insert 2560 +insert 2299 +insert 1451 +insert 3303 +insert 2174 +insert 2048 +insert 3293 +insert 2097 +insert 1705 +insert 1731 +insert 2296 +insert 2925 +insert 2932 +insert 1711 +insert 2397 +insert 2520 +insert 2742 +insert 1324 +insert 1160 +insert 1458 +insert 1439 +insert 3277 +insert 1374 +insert 1217 +insert 1218 +insert 2197 +insert 2185 +insert 1952 +insert 1798 +insert 1442 +insert 2601 +insert 2675 +insert 2283 +insert 12 +insert 567 +insert 638 +insert 1904 +insert 704 +insert 1447 +insert 1965 +insert 2728 +insert 2741 +insert 2441 +insert 2122 +insert 862 +insert 958 +insert 1955 +insert 850 +insert 2696 +insert 955 +insert 2867 +insert 2042 +insert 1925 +insert 2952 +insert 2265 +insert 1220 +insert 3289 +insert 2650 +insert 2215 +insert 2288 +insert 1373 +insert 2096 +insert 1167 +insert 830 +insert 829 +insert 1558 +insert 1189 +insert 2263 +insert 2341 +insert 2337 +insert 2270 +insert 3024 +insert 3182 +insert 1420 +insert 1557 +insert 1441 +insert 3037 +insert 3206 +insert 2913 +insert 1398 +insert 1392 +insert 1493 +insert 843 +insert 1287 +insert 2199 +insert 2838 +insert 2225 +insert 2181 +insert 736 +insert 2201 +insert 2907 +insert 808 +insert 712 +insert 2165 +insert 1219 +insert 1221 +insert 1715 +insert 1710 +insert 1700 +insert 2218 +insert 2187 +insert 1204 +insert 1709 +insert 2278 +insert 2698 +insert 1718 +insert 2240 +insert 2704 +insert 2340 +insert 1168 +insert 2256 +insert 2227 +insert 2203 +insert 2848 +insert 2305 +insert 1698 +insert 2647 +insert 2342 +insert 2275 +insert 1307 +insert 3062 +insert 2354 +insert 1312 +insert 3074 +insert 3060 +insert 1665 +insert 989 +insert 2591 +insert 3076 +insert 3136 +insert 3117 +insert 3123 +insert 234 +insert 6 +insert 698 +insert 719 +insert 3156 +insert 2358 +insert 2819 +insert 1793 +insert 3235 +insert 3000 +insert 28 +insert 3304 +insert 1856 +insert 1795 +insert 1733 +insert 1803 +insert 3127 +insert 1866 +insert 1642 +insert 1657 +insert 1723 +insert 2966 +insert 927 +insert 1055 +insert 3078 +insert 3201 +insert 3226 +insert 1014 +insert 3208 +insert 3262 +insert 2567 +insert 1430 +insert 2781 +insert 2425 +insert 1185 +insert 2385 +insert 1724 +insert 3181 +insert 2365 +insert 2361 +insert 1787 +insert 1410 +insert 1172 +insert 2746 +insert 2573 +insert 90 +insert 2268 +insert 2756 +insert 1304 +insert 1203 +insert 1860 +insert 841 +insert 1913 +insert 2284 +insert 2309 +insert 2946 +insert 1697 +remove 1975 +insert 2087 +insert 1921 +insert 3281 +insert 1894 +insert 1905 +insert 1206 +insert 1552 +insert 1179 +insert 2269 +insert 1606 +insert 1223 +insert 634 +insert 2594 +insert 1426 +insert 1164 +insert 1129 +insert 1019 +insert 897 +insert 2632 +insert 523 +insert 405 +insert 531 +insert 541 +insert 2285 +insert 1210 +insert 1212 +insert 2018 +insert 1524 +insert 1175 +insert 1857 +insert 1701 +insert 1712 +insert 1597 +insert 2737 +insert 363 +insert 3118 +insert 2006 +insert 2314 +insert 1205 +insert 1922 +insert 1293 +insert 1169 +insert 613 +insert 740 +insert 2678 +insert 655 +insert 385 +insert 1200 +insert 494 +insert 799 +insert 821 +insert 1282 +insert 2747 +insert 892 +insert 2656 +insert 1735 +insert 1766 +insert 2379 +insert 620 +insert 1776 +insert 1660 +insert 2999 +insert 3012 +insert 747 +insert 1797 +insert 1843 +insert 2074 +insert 1046 +insert 1194 +insert 136 +insert 551 +insert 147 +insert 41 +insert 429 +insert 198 +insert 272 +insert 459 +insert 2297 +insert 3174 +insert 1281 +insert 1274 +insert 1225 +insert 1780 +insert 1814 +insert 1726 +insert 1251 +insert 1305 +insert 1826 +insert 1859 +insert 1226 +insert 1187 +insert 2129 +insert 2853 +insert 3164 +insert 1497 +insert 2910 +insert 187 +insert 985 +insert 1414 +insert 2720 +insert 3299 +insert 2866 +insert 2850 +insert 1207 +insert 2308 +insert 879 +insert 2553 +insert 2554 +insert 1796 +insert 1802 +insert 1881 +insert 1738 +insert 1432 +insert 1317 +insert 2143 +insert 1747 +insert 2108 +insert 1406 +insert 3187 +insert 3065 +insert 3214 +insert 2364 +insert 2646 +insert 1942 +insert 25 +insert 162 +insert 469 +insert 511 +insert 370 +insert 377 +insert 3175 +insert 1609 +insert 2873 +insert 2802 +insert 3071 +insert 2623 +insert 2689 +insert 1358 +insert 2610 +insert 1903 +insert 2885 +insert 2036 +insert 2113 +insert 2784 +insert 2588 +insert 945 +insert 2744 +insert 190 +insert 2869 +insert 1505 +remove 2912 +insert 117 +insert 155 +insert 2723 +insert 1279 +insert 2801 +insert 2216 +insert 1736 +insert 688 +insert 3026 +insert 10 +insert 2771 +insert 2739 +insert 2162 +insert 546 +insert 1526 +insert 1501 +insert 1584 +insert 1541 +insert 1471 +insert 1548 +insert 508 +insert 2086 +insert 1858 +insert 2718 +insert 399 +insert 140 +insert 109 +insert 1869 +insert 560 +insert 1769 +insert 871 +insert 450 +insert 555 +insert 382 +insert 911 +insert 442 +insert 2236 +insert 2798 +insert 2069 +insert 795 +insert 931 +insert 1291 +insert 1275 +insert 576 +insert 2209 +insert 2212 +insert 2759 +insert 2248 +insert 2061 +insert 2224 +insert 2237 +insert 2525 +insert 2574 +insert 2244 +insert 2562 +insert 2196 +insert 3052 +insert 1266 +insert 1998 +insert 3020 +insert 3038 +insert 832 +insert 822 +insert 1359 +insert 2923 +insert 2063 +insert 2147 +insert 1976 +insert 1328 +insert 2976 +insert 1090 +insert 988 +insert 2761 +insert 1066 +insert 1719 +insert 126 +insert 151 +insert 1339 +insert 2158 +insert 1690 +insert 1692 +insert 2073 +insert 1829 +insert 1896 +insert 2005 +insert 2719 +insert 1376 +insert 2001 +insert 2057 +insert 2035 +insert 2924 +insert 1936 +insert 1461 +insert 2168 +insert 2245 +insert 1429 +insert 1409 +insert 2406 +insert 1318 +insert 1648 +insert 2843 +insert 3018 +insert 3011 +insert 3161 +insert 3028 +insert 2497 +insert 231 +insert 191 +insert 286 +insert 2188 +insert 2841 +insert 2228 +insert 2140 +insert 3133 +insert 1450 +insert 2103 +insert 1473 +insert 1487 +insert 3072 +insert 3093 +insert 3056 +insert 2894 +insert 1416 +insert 2897 +insert 2429 +insert 1956 +insert 1934 +insert 1940 +insert 1929 +insert 3084 +insert 2740 +insert 3298 +insert 3308 +insert 3247 +insert 2832 +insert 2163 +remove 2039 +insert 1899 +insert 1939 +insert 1399 +insert 1412 +insert 1365 +insert 2876 +insert 1897 +insert 2037 +insert 1930 +insert 1640 +insert 1931 +insert 3159 +insert 2899 +insert 2231 +insert 3147 +insert 2825 +insert 1243 +insert 1810 +insert 1872 +insert 3116 +insert 3165 +insert 2068 +insert 1874 +insert 2226 +insert 2250 +insert 2249 +insert 618 +insert 1370 +remove 1220 +insert 1354 +insert 1438 +insert 2213 +insert 1377 +insert 563 +insert 637 +insert 1933 +insert 734 +insert 761 +insert 29 +insert 2114 +insert 2194 +insert 2152 +insert 2217 +insert 314 +insert 440 +insert 393 +insert 670 +insert 785 +insert 2455 +insert 729 +insert 2271 +insert 2463 +insert 2481 +insert 2519 +insert 2488 +insert 1502 +insert 2485 +insert 2279 +insert 2638 +insert 656 +insert 574 +insert 2508 +insert 612 +insert 877 +insert 683 +insert 938 +insert 1298 +insert 1257 +insert 550 +insert 2117 +insert 2603 +insert 2702 +insert 2480 +insert 2941 +insert 2613 +insert 2281 +insert 1006 +insert 1016 +insert 2961 +insert 3033 +insert 1534 +insert 2962 +insert 2357 +insert 1216 +insert 1197 +insert 968 +insert 1002 +insert 1030 +insert 1003 +insert 1026 +insert 2708 +insert 2666 +insert 2542 +insert 2736 +insert 1870 +insert 2318 +insert 2344 +insert 3220 +insert 2635 +insert 3294 +insert 1183 +insert 2347 +insert 1396 +insert 2731 +insert 2164 +insert 2167 +insert 1411 +insert 2159 +insert 1694 +insert 1689 +insert 1714 +insert 1713 +insert 2373 +insert 2763 +insert 2820 +insert 3083 +insert 3030 +insert 3160 +insert 3010 +insert 3054 +insert 3112 +insert 3130 +insert 3095 +insert 3090 +insert 3158 +insert 3242 +insert 1691 +insert 3211 +insert 2418 +insert 1666 +insert 971 +insert 1695 +insert 1634 +insert 888 +insert 2794 +insert 2532 +insert 2887 +insert 2797 +insert 1316 +insert 2125 +insert 1696 +insert 1888 +insert 1706 +insert 1231 +insert 1234 +insert 2050 +insert 1235 +insert 2102 +insert 218 +insert 228 +insert 2461 +insert 3291 +insert 3267 +insert 1708 +insert 1721 +insert 1704 +insert 2792 +insert 2782 +insert 83 +insert 2906 +insert 1981 +insert 1245 +insert 1326 +insert 2622 +insert 2254 +insert 184 +insert 2750 +insert 2618 +insert 2679 +insert 2778 +insert 2628 +insert 855 +insert 2092 +insert 2118 +insert 1347 +insert 1527 +insert 2575 +insert 2119 +insert 2098 +insert 537 +insert 1623 +insert 2402 +insert 2054 +insert 193 +insert 1180 +insert 1378 +insert 1483 +insert 1188 +insert 2099 +insert 1184 +insert 1480 +insert 233 +insert 170 +insert 268 +insert 220 +insert 2261 +insert 1425 +insert 1932 +insert 1938 +insert 3047 +insert 1440 +insert 3105 +insert 3039 +insert 1443 +insert 1978 +insert 1996 +insert 1542 +insert 1547 +insert 1423 +insert 180 +insert 1585 +insert 1431 +insert 1586 +insert 2100 +insert 1444 +insert 2107 +insert 2896 +insert 1445 +insert 2743 +insert 1109 +insert 2751 +insert 2315 +insert 2634 +insert 1446 +insert 3288 +insert 1835 +insert 253 +insert 1504 +insert 371 +insert 504 +insert 204 +insert 2617 +insert 2388 +insert 107 +insert 131 +insert 111 +insert 1523 +insert 2909 +insert 1703 +insert 1717 +insert 1566 +insert 1151 +insert 1116 +insert 3172 +insert 2605 +insert 2641 +insert 1227 +insert 1230 +insert 1256 +insert 2725 +insert 1588 +insert 1529 +insert 1173 +insert 3142 +insert 3125 +insert 1581 +insert 578 +insert 3228 +insert 3239 +insert 599 +insert 759 +insert 3016 +insert 3025 +insert 619 +insert 653 +insert 626 +insert 2768 +insert 754 +insert 3231 +insert 3260 +insert 791 +insert 756 +insert 2405 +insert 2404 +insert 1474 +insert 1213 +insert 1211 +insert 2019 +insert 3077 +insert 3087 +insert 2555 +insert 1699 +insert 1464 +insert 2687 +insert 1578 +insert 1975 +insert 1490 +insert 1478 +insert 573 +insert 592 +insert 1655 +insert 1652 +insert 1669 +insert 1649 +insert 1092 +insert 1122 +insert 1153 +insert 2734 +insert 1676 +insert 1871 +insert 1131 +insert 2730 +insert 2729 +insert 1222 +insert 1196 +insert 2733 +insert 2793 +insert 1421 +insert 2672 +insert 1633 +insert 1472 +insert 2749 +insert 1477 +insert 1460 +insert 3050 +insert 1491 +insert 3114 +insert 2378 +insert 1427 +insert 1419 +insert 1722 +insert 1580 +insert 1449 +insert 1484 +insert 1053 +insert 1485 +insert 3085 +insert 2153 +insert 3002 +insert 2023 +insert 3008 +insert 2280 +insert 3003 +insert 2958 +insert 2972 +insert 3015 +insert 2803 +insert 3045 +insert 2127 +insert 2971 +insert 1437 +insert 1494 +insert 1486 +insert 3032 +insert 2809 +remove 1627 +insert 1428 +insert 775 +insert 5 +insert 3064 +insert 3107 +insert 3115 +insert 3138 +insert 3128 +insert 3111 +insert 1032 +insert 3075 +remove 298 +insert 3145 +insert 1572 +insert 186 +insert 1039 +insert 1086 +insert 236 +insert 1052 +insert 1385 +insert 252 +insert 1133 +insert 1108 +insert 928 +insert 1369 +insert 2116 +insert 2934 +insert 203 +insert 1113 +insert 2619 +insert 275 +insert 1844 +insert 1165 +insert 1868 +insert 194 +insert 254 +remove 297 +insert 2104 +insert 1603 +insert 2963 +insert 1672 +insert 3004 +insert 1683 +insert 1057 +insert 1807 +insert 2978 +insert 2004 +insert 1452 +insert 1482 +insert 2112 +insert 1436 +insert 1433 +insert 1602 +insert 1422 +insert 1575 +insert 1560 +insert 2649 +insert 1454 +insert 2658 +insert 2621 +insert 1702 +insert 1583 +insert 1467 +insert 1140 +insert 1229 +insert 1121 +insert 987 +insert 980 +insert 1174 +insert 1475 +insert 1615 +insert 1190 +insert 1619 +insert 1265 +insert 1621 +insert 1616 +insert 1492 +remove 1430 +insert 2905 +insert 1224 +insert 1538 +insert 1023 +insert 2807 +insert 1848 +insert 2659 +insert 1496 +insert 2710 +insert 1132 +insert 1154 +insert 1887 +insert 2593 +insert 1875 +remove 1429 +insert 1163 +insert 2983 +insert 2968 +insert 1587 +insert 222 +insert 283 +insert 263 +remove 1428 +insert 535 +insert 547 +insert 470 +insert 457 +insert 518 +insert 199 +insert 1263 +insert 1084 +insert 526 +insert 933 +insert 889 +remove 1437 +insert 246 +insert 530 +insert 903 +remove 2489 +insert 2682 +insert 2914 +insert 1716 +insert 2688 +insert 1332 +insert 2690 +insert 2722 +insert 2657 +insert 2908 +insert 1345 +insert 1582 +insert 2969 +insert 2612 +insert 213 +insert 225 +insert 1401 +insert 1340 +insert 1889 +insert 2017 +insert 961 +insert 1042 +insert 1873 +insert 2790 +insert 224 +insert 1177 +insert 202 +insert 1372 +insert 185 +insert 1520 +insert 1346 +insert 211 +insert 181 +insert 2745 +insert 2726 +insert 2870 +insert 1214 +insert 2940 +insert 2653 +insert 2219 +insert 2813 +insert 1532 +insert 2890 +insert 1195 +insert 1128 +insert 468 +insert 1592 +insert 1144 +remove 1219 +insert 3183 +insert 2774 +insert 1622 +insert 1141 +insert 3285 +insert 2274 +insert 2680 +insert 1161 +insert 1158 +insert 279 +insert 1613 +insert 142 +insert 1510 +insert 100 +insert 467 +insert 106 +insert 367 +insert 1546 +insert 1867 +insert 851 +insert 918 +insert 1845 +insert 1176 +insert 1178 +insert 1193 +insert 1884 +insert 2663 +insert 1617 +insert 1614 +insert 461 +insert 1783 +insert 2721 +insert 1851 +insert 3255 +insert 1517 +insert 237 +insert 1535 +insert 1973 +insert 2880 +insert 2883 +insert 1928 +remove 1424 +insert 2991 +insert 2202 +insert 1574 +insert 2206 +insert 538 +insert 1573 +insert 96 +insert 3 +insert 32 +insert 13 +insert 98 +insert 121 +insert 30 +insert 66 +insert 127 +insert 118 +insert 2732 +remove 1166 +insert 113 +insert 628 +insert 2246 +insert 1567 +insert 1688 +insert 1579 +insert 3014 +insert 2223 +insert 2145 +insert 2232 +insert 2190 +insert 2053 +insert 1882 +insert 381 +insert 3170 +insert 2651 +insert 3148 +insert 1805 +insert 543 +insert 406 +insert 517 +insert 454 +insert 1664 +insert 2806 +insert 1886 +insert 1865 +insert 3135 +insert 3179 +insert 2156 +insert 1628 +insert 1636 +insert 1819 +insert 2151 +insert 1968 +insert 2009 +insert 2134 +insert 3237 +insert 2886 +insert 2262 +insert 2957 +insert 2959 +insert 1972 +insert 31 +insert 842 +insert 2193 +insert 2106 +insert 2755 +insert 2645 +insert 2091 +insert 3001 +insert 2901 +insert 1678 +insert 2144 +insert 2891 +insert 1728 +insert 1645 +insert 1745 +insert 3166 +insert 1662 +insert 1366 +insert 2105 +insert 1612 +insert 2882 +insert 2528 +insert 1987 +insert 1599 +insert 229 +insert 1284 +insert 1156 +insert 1296 +insert 1297 +insert 2570 +insert 2078 +insert 2307 +insert 2565 +insert 2847 +insert 1343 +insert 1323 +insert 2900 +insert 2902 +insert 2089 +insert 1259 +insert 1288 +insert 2912 +insert 1252 +insert 256 +insert 232 +insert 230 +insert 2888 +insert 2684 +insert 2111 +insert 2090 +insert 2693 +insert 240 +insert 2898 +insert 295 +insert 2893 +insert 2264 +insert 2884 +insert 2705 +insert 2859 +insert 2904 +insert 2222 +insert 2889 +insert 389 +insert 1397 +insert 1407 +insert 1862 +insert 1250 +insert 1969 +insert 1375 +insert 1404 +insert 2433 +insert 2436 +insert 2948 +insert 1402 +insert 1320 +insert 1271 +insert 2453 +insert 2439 +insert 1300 +insert 2421 +insert 2110 +insert 2430 +insert 2121 +insert 2205 +insert 1353 +insert 509 +insert 515 +insert 1249 +insert 2919 +insert 2960 +insert 1389 +insert 139 +insert 542 +insert 2026 +insert 2039 +insert 2586 +insert 2581 +insert 2137 +insert 2936 +insert 2412 +insert 2431 +insert 2393 +insert 2362 +insert 2484 +insert 2440 +insert 2413 +insert 2468 +insert 2556 +insert 1898 +insert 1624 +insert 766 +insert 1608 +insert 1600 +insert 669 +insert 659 +insert 658 +insert 328 +insert 3221 +insert 3194 +insert 144 +insert 477 +insert 372 +insert 426 +insert 145 +insert 310 +insert 423 +insert 621 +insert 641 +insert 725 +insert 738 +insert 2093 +insert 2590 +insert 2499 +insert 1919 +insert 329 +insert 311 +insert 2580 +insert 2221 +insert 2833 +insert 2243 +insert 1564 +insert 2258 +insert 1917 +insert 2239 +insert 1901 +insert 2235 +insert 2701 +insert 2992 +insert 2752 +insert 395 +insert 2047 +insert 1967 +insert 1962 +insert 353 +insert 391 +insert 339 +insert 2211 +insert 419 +insert 409 +insert 2230 +insert 2247 +insert 2189 +insert 2229 +insert 907 +insert 957 +insert 1604 +insert 859 +insert 848 +insert 1838 +insert 883 +insert 1620 +insert 3213 +insert 456 +insert 2438 +insert 444 +insert 402 +insert 414 +insert 331 +insert 2448 +insert 400 +insert 284 +insert 421 +insert 365 +insert 280 +insert 208 +insert 2290 +insert 1596 +insert 1570 +insert 1594 +insert 1550 +remove 1490 +insert 1348 +insert 1344 +insert 1390 +insert 1511 +insert 1342 +insert 1306 +insert 1264 +insert 1286 +insert 2977 +insert 1371 +insert 1408 +insert 1544 +insert 1238 +insert 1242 +insert 2852 +insert 1605 +insert 1625 +insert 1334 +insert 1327 +insert 1576 +insert 2949 +insert 1565 +insert 3034 +insert 1589 +insert 2945 +insert 2973 +insert 2975 +insert 1637 +insert 2422 +insert 2860 +insert 2056 +insert 2045 +insert 2811 +insert 2812 +insert 2289 +insert 2041 +insert 2207 +insert 2920 +insert 1632 +insert 1394 +insert 3199 +insert 3287 +insert 3305 +insert 1368 +remove 3116 +insert 2021 +insert 3280 +insert 1964 +insert 2161 +insert 3273 +insert 1986 +insert 2022 +insert 2130 +insert 3240 +insert 3261 +insert 2040 +insert 3272 +insert 1883 +insert 1577 +insert 1555 +insert 1828 +insert 2055 +insert 2072 +insert 2257 +insert 2259 +insert 2070 +insert 2238 +insert 1591 +insert 2180 +insert 2120 +insert 2182 +insert 1360 +insert 2506 +insert 1382 +insert 2510 +insert 2220 +insert 1355 +insert 2141 +insert 1337 +insert 2437 +insert 2469 +insert 2443 +insert 1863 +insert 2166 +insert 2585 +insert 2139 +insert 2522 +insert 2331 +insert 2503 +insert 2210 +insert 2175 +insert 11 +insert 1515 +insert 119 +insert 1519 +insert 1593 +insert 201 +insert 258 +insert 1601 +insert 205 +insert 2176 +insert 1403 +insert 1598 +insert 1522 +insert 1514 +insert 1466 +insert 3274 +insert 1561 +insert 1393 +insert 2157 +insert 1503 +insert 910 +insert 924 +insert 861 +insert 388 +insert 3205 +insert 407 +insert 932 +insert 195 +insert 942 +insert 241 +insert 922 +insert 2024 +insert 864 +insert 1627 +insert 271 +insert 265 +insert 2376 +insert 247 +insert 2077 +insert 2277 +insert 3202 +insert 2267 +insert 2464 +insert 2446 +insert 1367 +insert 1380 +insert 2301 +insert 1405 +insert 2348 +insert 418 +insert 396 +insert 413 +insert 1363 +insert 1294 +insert 3229 +insert 3217 +remove 1411 +insert 2540 +insert 2633 +insert 1388 +insert 2577 +insert 2557 +insert 1272 +insert 2502 +insert 2516 +insert 2564 +insert 2559 +insert 2434 +insert 1953 +insert 2664 +insert 1837 +insert 2677 +insert 1827 +insert 2625 +insert 2667 +insert 2369 +insert 2360 +insert 1880 +insert 2387 +insert 335 +insert 2416 +insert 2643 +remove 1312 +insert 2410 +insert 2420 +insert 2411 +insert 2368 +insert 2374 +insert 2375 +insert 2417 +insert 2383 +insert 2395 +insert 1350 +insert 1260 +insert 1244 +insert 2123 +insert 1509 +insert 2584 +insert 2582 +insert 2578 +insert 1911 +insert 2479 +insert 2566 +insert 2346 +insert 2292 +insert 691 +insert 1277 +insert 882 +insert 846 +insert 2287 +insert 849 +insert 866 +insert 55 +insert 2526 +insert 869 +insert 827 +insert 1171 +insert 1533 +insert 350 +insert 46 +insert 135 +insert 2615 +insert 1528 +insert 1554 +insert 1539 +insert 1468 +insert 3185 +insert 1182 +insert 1479 +remove 1495 +insert 1507 +insert 1518 +insert 384 +insert 1301 +insert 1240 +insert 1254 +insert 112 +insert 75 +insert 72 +remove 1494 +insert 138 +insert 89 +insert 2840 +insert 200 +insert 1191 +insert 168 +insert 167 +insert 890 +insert 944 +insert 920 +insert 868 +insert 839 +insert 1146 +insert 1012 +insert 2255 +insert 2815 +insert 1563 +insert 2579 +insert 1545 +insert 2583 +insert 3089 +insert 1785 +insert 2273 +remove 1370 +insert 1739 +insert 3098 +insert 192 +insert 2242 +insert 172 +insert 3091 +insert 935 +insert 221 +insert 251 +insert 178 +insert 1751 +insert 369 +insert 929 +insert 82 +insert 436 +insert 276 +insert 244 +insert 387 +remove 2216 +insert 410 +insert 3053 +insert 1498 +insert 2826 +insert 366 +remove 1238 +insert 289 +insert 972 +insert 1761 +insert 441 +insert 361 +insert 401 +insert 2306 +insert 2390 +insert 2291 +insert 1199 +insert 982 +insert 270 +remove 1399 +insert 1551 +remove 1346 +insert 2169 +insert 986 +insert 394 +insert 3116 +insert 2272 +insert 3119 +insert 1494 +insert 3236 +insert 916 +insert 896 +insert 3152 +insert 3248 +insert 2132 +insert 2131 +insert 2155 +insert 1338 +insert 1043 +insert 954 +insert 3167 +insert 1562 +insert 3134 +insert 1571 +insert 898 +insert 1540 +insert 930 +insert 949 +insert 863 +insert 507 +insert 923 +insert 840 +insert 914 +insert 899 +insert 2184 +insert 2204 +insert 2128 +insert 2160 +insert 2173 +insert 2191 +insert 2171 +insert 2177 +insert 2179 +insert 1549 +insert 1569 +insert 1500 +remove 1389 +insert 1823 +insert 1812 +remove 1371 +remove 1375 +insert 1792 +insert 831 +insert 1831 +insert 1516 +insert 1822 +insert 1846 +insert 125 +insert 1799 +insert 129 +insert 1825 +insert 1836 +insert 210 +insert 188 +insert 1499 +insert 174 +insert 99 +insert 1833 +insert 1028 +insert 1024 +insert 1362 +insert 217 +insert 952 +insert 838 +insert 835 +insert 886 +insert 904 +insert 1041 +insert 1047 +insert 124 +insert 179 +insert 134 +insert 173 +insert 209 +insert 215 +insert 901 +insert 19 +insert 141 +remove 1387 +insert 177 +insert 160 +insert 157 +insert 998 +insert 16 +insert 1789 +insert 1748 +insert 1784 +insert 1818 +insert 908 +insert 950 +insert 939 +insert 936 +insert 1531 +insert 919 +insert 905 +insert 937 +insert 582 +insert 664 +insert 597 +insert 906 +insert 549 +insert 506 +insert 575 +insert 479 +insert 947 +insert 76 +insert 577 +insert 56 +insert 51 +insert 623 +insert 652 +remove 1364 +insert 1537 +remove 1396 +insert 1434 +insert 1415 +insert 1346 +insert 1399 +insert 1335 +insert 1513 +remove 1403 +insert 1536 +remove 1409 +remove 1366 +insert 1391 +remove 1287 +insert 1280 +remove 1503 +remove 1406 +insert 1383 +insert 2549 +insert 2538 +insert 2495 +insert 1268 +remove 1390 +insert 2527 +remove 1493 +remove 1394 +insert 1255 +remove 1315 +remove 1311 +insert 1276 +insert 1331 +remove 1317 +insert 1400 +remove 1354 +insert 1322 +insert 1357 +insert 1481 +remove 1405 +insert 285 +insert 288 +insert 261 +insert 640 +insert 632 +insert 525 +insert 266 +insert 962 +insert 629 +insert 378 +insert 380 +remove 1359 +insert 1351 +insert 587 +insert 368 +insert 376 +insert 1333 +insert 1050 +insert 1040 +insert 337 +insert 1352 +insert 3196 +insert 1997 +insert 326 +remove 2228 +insert 17 +insert 320 +insert 86 +remove 1502 +insert 1135 +remove 1298 +insert 132 +insert 156 +insert 1361 +insert 1215 +insert 2775 +insert 122 +insert 2816 +insert 2800 +insert 2799 +insert 1208 +insert 1285 +insert 1329 +insert 1201 +insert 1951 +insert 2786 +insert 2783 +insert 2822 +insert 2827 +insert 2805 +insert 2956 +insert 2862 +insert 2988 +insert 953 +insert 2791 +insert 2844 +insert 2777 +insert 2846 +insert 2785 +insert 2951 +insert 430 +insert 375 +insert 104 +insert 154 +insert 427 +insert 373 +insert 1025 +insert 146 +insert 379 +insert 894 +insert 867 +insert 969 +insert 159 +insert 887 +insert 876 +insert 176 +insert 1027 +insert 1119 +insert 994 +insert 917 +insert 1349 +insert 153 +insert 1033 +insert 875 +insert 0 +insert 1336 +insert 912 +remove 1357 +insert 501 +insert 206 +insert 1029 +insert 1081 +insert 152 +insert 1115 +insert 545 +insert 1044 +insert 1145 +insert 909 +insert 472 +insert 1056 +insert 845 +insert 881 +insert 1112 +insert 915 +insert 536 +insert 383 +insert 544 +insert 163 +insert 558 +remove 1343 +insert 1292 +insert 103 +insert 1321 +insert 554 +insert 825 +insert 559 +insert 539 +insert 242 +insert 556 +insert 235 +insert 245 +insert 133 +insert 374 +insert 161 +insert 34 +insert 1143 +insert 1136 +insert 1059 +insert 1087 +insert 1155 +insert 143 +insert 158 +insert 123 +insert 115 +insert 166 +insert 893 +insert 94 +insert 71 +insert 88 +insert 18 +remove 1314 +insert 238 +insert 260 +insert 1130 +insert 984 +insert 1152 +insert 1079 +insert 557 +insert 223 +insert 207 +insert 257 +insert 281 +insert 292 +insert 532 +insert 197 +insert 274 +insert 497 +insert 2655 +insert 267 +insert 686 +insert 212 +insert 854 +insert 880 +insert 325 +insert 673 +insert 216 +insert 196 +insert 7 +insert 782 +insert 2669 +insert 63 +insert 744 +insert 1 +insert 277 +insert 214 +insert 364 +insert 148 +insert 57 +remove 1274 +insert 727 +insert 787 +insert 772 +insert 20 +insert 293 +insert 773 +insert 1010 +insert 183 +insert 873 +insert 617 +insert 836 +insert 878 +insert 451 +insert 313 +insert 607 +insert 1102 +insert 386 +insert 424 +insert 404 +insert 650 +insert 826 +insert 1162 +insert 794 +insert 334 +insert 101 +insert 345 +insert 110 +insert 865 +insert 226 +insert 667 +insert 1088 +insert 651 +insert 273 +insert 870 +insert 852 +insert 189 +insert 1045 +insert 1031 +insert 102 +insert 347 +insert 54 +remove 1345 +insert 354 +insert 631 +insert 1159 +insert 837 +insert 150 +insert 105 +insert 583 +insert 657 +insert 606 +insert 624 +insert 2 +insert 9 +insert 601 +insert 248 +insert 360 +insert 663 +insert 777 +insert 315 +insert 615 +insert 765 +insert 750 +insert 593 +insert 595 +insert 548 +insert 979 +insert 1049 +insert 1157 +insert 1148 +insert 322 +insert 332 +insert 1051 +insert 1013 +insert 349 +insert 552 +insert 390 +insert 974 +insert 1080 +insert 392 +insert 1325 +remove 1328 +insert 1054 +insert 1034 +insert 478 +insert 287 +insert 1302 +insert 805 +insert 492 +insert 24 +insert 529 +insert 533 +insert 165 +insert 79 +insert 584 +insert 884 +insert 815 +insert 776 +insert 534 +insert 49 +insert 524 +insert 874 +insert 264 +insert 482 +insert 495 +insert 505 +insert 810 +insert 885 +insert 64 +insert 1364 +insert 726 +insert 858 +insert 249 +insert 757 +insert 743 +insert 358 +insert 921 +insert 521 +insert 739 +insert 857 +insert 318 +insert 282 +insert 951 +insert 1246 +insert 745 +insert 26 +insert 21 +insert 58 +remove 1352 +insert 302 +insert 1270 +insert 1058 +insert 8 +insert 803 +insert 316 +insert 770 +insert 262 +insert 27 +insert 611 +insert 1289 +insert 73 +insert 23 +insert 856 +insert 527 +insert 52 +insert 1253 +insert 760 +insert 120 +insert 807 +insert 643 +insert 116 +insert 362 +insert 646 +insert 668 +insert 642 +insert 227 +insert 1104 +insert 680 +insert 812 +insert 793 +insert 823 +insert 717 +insert 755 +insert 1781 +insert 1065 +insert 636 +insert 290 +insert 767 +insert 1261 +insert 1283 +insert 1295 +remove 1351 +remove 1341 +remove 1339 +insert 1262 +insert 397 +insert 408 +insert 445 +insert 746 +insert 437 +insert 710 +insert 723 +insert 403 +insert 715 +insert 434 +insert 514 +insert 681 +insert 540 +insert 463 +insert 490 +insert 438 +insert 806 +insert 420 +insert 741 +insert 714 +insert 692 +insert 458 +insert 447 +insert 448 +insert 753 +insert 412 +insert 728 +insert 718 +remove 1296 +remove 1276 +insert 735 +insert 1209 +insert 1036 +insert 1124 +insert 722 +insert 748 +insert 742 +insert 724 +insert 1181 +insert 751 +insert 733 +insert 416 +insert 1170 +insert 446 +insert 2881 +remove 1358 +remove 1288 +insert 449 +insert 40 +insert 33 +insert 130 +insert 1456 +insert 1418 +remove 1489 +insert 1455 +insert 1453 +remove 1473 +remove 1478 +remove 1484 +insert 2154 +insert 1470 +insert 1462 +remove 1487 +insert 1909 +insert 1914 +insert 1465 +insert 1853 +remove 1410 +insert 2252 +remove 1483 +remove 1467 +remove 1316 +insert 948 +insert 1296 +insert 1750 +insert 171 +insert 1238 +insert 749 +insert 697 +insert 219 +insert 721 +insert 828 +insert 2327 +insert 737 +insert 1760 +insert 1775 +insert 1782 +insert 685 +insert 1778 +insert 731 +insert 2352 +insert 706 +insert 1762 +insert 679 +insert 732 +insert 1767 +insert 2325 +insert 2208 +insert 1788 +insert 1772 +insert 1771 +insert 1765 +insert 752 +insert 674 +insert 690 +insert 2353 +insert 1980 +insert 2142 +insert 2286 +insert 2200 +insert 1954 +insert 2338 +insert 453 +insert 411 +insert 2339 +insert 2192 +insert 1749 +insert 2334 +insert 1993 +insert 2015 +insert 428 +insert 2322 +insert 433 +insert 2178 +insert 1727 +remove 1488 +remove 1363 +insert 1916 +insert 2335 +insert 1311 +remove 1461 +insert 2332 +insert 2319 +insert 2930 +insert 1278 +insert 2753 +insert 1754 +insert 2321 +insert 2851 +insert 2214 +insert 2172 +insert 2170 +insert 1314 +remove 1283 +insert 1786 +insert 250 +remove 1355 +insert 1317 +insert 1958 +remove 1325 +insert 2839 +insert 1074 +insert 1752 +insert 2124 +remove 2259 +insert 1457 +insert 1487 +insert 2146 +insert 2138 +remove 2257 +insert 2150 +insert 2241 +insert 1937 +insert 2148 +insert 1730 +insert 1308 +insert 1239 +remove 1165 +insert 2183 +insert 1920 +insert 834 +insert 764 +insert 853 +remove 2258 +insert 2233 +insert 1842 +insert 1943 +insert 847 +insert 783 +insert 1935 +insert 816 +insert 2186 +insert 2126 +insert 2149 +insert 792 +insert 1927 +insert 1315 +insert 1912 +remove 1280 +insert 1902 +insert 1915 +insert 820 +remove 1324 +insert 1923 +insert 1390 +insert 813 +insert 695 +insert 817 +insert 1926 +insert 1895 +insert 705 +insert 1389 +insert 790 +insert 682 +remove 1491 +insert 786 +insert 796 +insert 804 +insert 800 +insert 1950 +insert 811 +insert 771 +insert 435 +insert 452 +insert 464 +insert 432 +insert 784 +insert 900 +remove 1957 +insert 417 +insert 425 +insert 2695 +insert 2796 +insert 415 +insert 48 +insert 801 +insert 802 +insert 1069 +insert 603 +insert 460 +insert 422 +insert 439 +insert 774 +remove 1448 +insert 779 +insert 579 +insert 809 +insert 762 +insert 778 +insert 798 +insert 622 +insert 797 +insert 819 +insert 814 +insert 565 +insert 780 +insert 600 +insert 781 +insert 789 +insert 763 +insert 768 +insert 818 +remove 1408 +insert 1794 +insert 2350 +insert 581 +insert 2384 +insert 590 +insert 2349 +insert 466 +insert 2351 +insert 2394 +insert 608 +insert 598 +insert 519 +insert 633 +insert 485 +insert 627 +insert 2293 +insert 2253 +insert 2817 +insert 2366 +insert 500 +insert 2600 +insert 2627 +insert 2310 +remove 980 +insert 1110 +insert 1757 +insert 512 +insert 568 +insert 462 +insert 498 +remove 1342 +insert 2808 +insert 496 +insert 1258 +insert 1120 +insert 1150 +insert 91 +insert 1316 +insert 47 +insert 1312 +insert 1324 +insert 513 +insert 499 +insert 481 +insert 465 +insert 483 +insert 474 +insert 487 +insert 491 +insert 522 +insert 502 +insert 934 +remove 1300 +insert 510 +remove 1297 +remove 1273 +insert 1946 +insert 476 +insert 97 +insert 1138 +insert 503 +insert 1357 +insert 489 +insert 1147 +insert 42 +insert 1267 +insert 1248 +remove 1329 +insert 486 +insert 520 +insert 1082 +remove 1272 +insert 1068 +remove 1360 +insert 50 +remove 987 +remove 1364 +remove 1314 +insert 1283 +insert 1280 +insert 84 +remove 1344 +remove 1318 +insert 1341 +insert 59 +insert 471 +insert 1077 +insert 473 +insert 1070 +remove 1299 +remove 1315 +remove 1282 +insert 1276 +insert 3132 +remove 1347 +insert 3124 +insert 516 +insert 488 +remove 1362 +insert 300 +insert 1891 +insert 312 +insert 1118 +insert 475 +insert 359 +insert 1362 +insert 309 +insert 1067 +insert 1830 +insert 3027 +insert 2052 +insert 1816 +insert 2027 +insert 1098 +insert 1855 +insert 1078 +insert 1817 +insert 484 +insert 1142 +remove 962 +insert 1062 +insert 2563 +insert 1839 +insert 2576 +insert 1072 +insert 1107 +insert 992 +insert 1020 +insert 355 +insert 343 +insert 1094 +insert 1064 +insert 1125 +insert 1808 +insert 1236 +insert 1071 +insert 1103 +insert 1233 +insert 1840 +insert 1850 +remove 1235 +insert 1089 +insert 1815 +insert 1763 +insert 976 +insert 1773 +insert 1091 +insert 1018 +insert 1083 +insert 1075 +insert 1114 +insert 35 +insert 1123 +insert 1106 +insert 1834 +insert 1017 +insert 1117 +remove 1269 +insert 1111 +insert 1247 +insert 993 +insert 604 +insert 1849 +insert 1820 +insert 1105 +insert 2336 +insert 1095 +insert 569 +insert 2320 +insert 341 +insert 3249 +insert 983 +insert 308 +insert 306 +insert 2551 +insert 564 +remove 1311 +insert 1011 +insert 2311 +insert 1841 +insert 2871 +insert 2865 +insert 610 +insert 2828 +insert 609 +insert 2829 +insert 2834 +insert 2837 +insert 2836 +insert 321 +insert 2861 +insert 2324 +insert 2875 +insert 995 +insert 585 +insert 570 +insert 616 +insert 1906 +insert 1900 +insert 2874 +insert 2312 +insert 2787 +insert 80 +insert 2372 +insert 970 +insert 588 +insert 95 +insert 1126 +insert 324 +insert 602 +insert 571 +insert 589 +insert 561 +insert 586 +insert 342 +insert 61 +insert 2835 +insert 36 +insert 2879 +insert 2856 +insert 317 +insert 39 +insert 572 +insert 1009 +insert 654 +insert 625 +insert 2857 +insert 2830 +insert 2854 +insert 2345 +insert 2878 +insert 614 +insert 1073 +insert 1096 +insert 580 +remove 674 +insert 1005 +remove 681 +insert 635 +insert 1007 +insert 2491 +insert 2606 +insert 298 +remove 706 +insert 356 +insert 645 +insert 2595 +remove 698 +remove 692 +insert 2624 +insert 630 +insert 2642 +remove 668 +insert 2864 +insert 37 +insert 3245 +insert 2849 +insert 980 +insert 2877 +insert 2868 +insert 977 +insert 2316 +insert 2842 +insert 67 +remove 659 +insert 2500 +insert 336 +insert 81 +insert 3192 +remove 720 +remove 1164 +insert 3244 +insert 2824 +insert 2543 +insert 2295 +insert 703 +insert 2328 +insert 348 +insert 323 +insert 2823 +insert 2855 +insert 566 +insert 562 +insert 2831 +insert 2654 +insert 330 +insert 596 +insert 2700 +insert 981 +insert 346 +insert 299 +insert 591 +insert 38 +insert 1970 +remove 1268 +insert 2355 +insert 2507 +insert 2079 +insert 43 +insert 74 +insert 301 +insert 357 +insert 327 +insert 351 +insert 1990 +insert 2323 +insert 297 +insert 2300 +insert 594 +insert 2330 +insert 344 +insert 965 +insert 967 +insert 307 +insert 304 +insert 340 +insert 3241 +insert 3284 +insert 2673 +remove 1090 +insert 319 +insert 87 +insert 2699 +insert 305 +insert 85 +insert 3283 +insert 77 +insert 1008 +insert 93 +insert 2671 +insert 2530 +insert 684 +insert 78 +insert 303 +insert 2661 +insert 674 +insert 707 +insert 3169 +remove 1234 +remove 1104 +insert 2020 +insert 996 +insert 68 +insert 92 +insert 69 +insert 963 +insert 70 +insert 1977 +insert 2033 +insert 2524 +insert 1004 +insert 2450 +insert 60 +insert 701 +insert 44 +insert 671 +insert 1097 +insert 1099 +insert 720 +insert 962 +insert 1021 +insert 702 +insert 997 +insert 2709 +insert 2462 +remove 1096 +insert 2370 +insert 2298 +insert 2676 +remove 1199 +insert 2414 +insert 687 +insert 2080 +remove 1095 +insert 706 +insert 1100 +insert 1101 +insert 2668 +insert 1127 +insert 2046 +insert 2060 +insert 2044 +remove 1110 +insert 699 +insert 2714 +insert 2472 +insert 2014 +remove 1120 +insert 3234 +insert 2428 +insert 3250 +insert 1994 +insert 700 +insert 3233 +insert 964 +insert 2998 +insert 3193 +insert 2011 +insert 709 +insert 2030 +insert 3257 +insert 3264 +insert 3216 +insert 1000 +insert 3276 +insert 2717 +insert 2660 +insert 975 +remove 1087 +insert 3278 +insert 2533 +insert 3268 +insert 990 +insert 1001 +insert 2487 +insert 973 +insert 2034 +remove 1111 +insert 2517 +insert 1063 +insert 3306 +insert 696 +insert 1061 +insert 2552 +remove 1119 +insert 2432 +insert 2707 +insert 2326 +insert 716 +insert 660 +remove 1122 +insert 3271 +insert 2424 +insert 3013 +insert 3238 +insert 3258 +insert 692 +insert 3203 +insert 2294 +insert 1979 +insert 2997 +insert 2391 +insert 2029 +insert 1630 +insert 956 +insert 2505 +insert 3215 +insert 1641 +insert 3302 +insert 2367 +insert 676 +insert 2381 +insert 666 +insert 675 +insert 1015 +remove 1112 +insert 2071 +insert 3043 +insert 3301 +insert 2475 +insert 698 +insert 2031 +insert 3048 +insert 2644 +insert 2419 +insert 2059 +insert 2550 +insert 3046 +insert 2067 +insert 3312 +insert 3296 +insert 3006 +insert 2965 +insert 2460 +insert 2652 +insert 2758 +insert 677 +insert 1959 +insert 713 +insert 2359 +insert 2694 +insert 2674 +insert 2703 +insert 1684 +insert 2713 +insert 1653 +insert 2964 +insert 2389 +insert 3086 +insert 3204 +insert 3021 +insert 2639 +insert 2616 +insert 3246 +insert 3195 +insert 2795 +insert 3036 +insert 3207 +insert 2630 +insert 1682 +insert 2670 +insert 2085 +insert 3297 +insert 711 +insert 2712 +insert 2477 +insert 2681 +insert 659 +insert 2706 +insert 2683 +insert 3219 +insert 3282 +insert 3101 +insert 3109 +insert 2049 +insert 2007 +insert 3094 +insert 2716 +insert 2451 +insert 2922 +insert 2081 +insert 1629 +insert 2075 +insert 2483 +insert 2025 +insert 2691 +insert 693 +insert 2602 +insert 2513 +insert 2662 +insert 681 +insert 662 +insert 678 +insert 2986 +insert 3292 +insert 2492 +insert 3251 +insert 661 +insert 1988 +insert 2032 +insert 689 +insert 708 +insert 2944 +insert 694 +insert 2697 +insert 2604 +insert 2620 +insert 2435 +insert 3029 +insert 2970 +insert 2974 +insert 2607 +insert 2766 +insert 3061 +insert 3103 +insert 1674 +insert 1673 +insert 2648 +insert 3009 +insert 2051 +insert 1852 +insert 2082 +insert 2008 +insert 3079 +insert 1971 +insert 3212 +insert 2084 +insert 1656 +insert 665 +insert 1685 +insert 2990 +insert 2984 +insert 2942 +insert 2536 +insert 3190 +insert 2062 +insert 3188 +insert 3073 +insert 3102 +insert 3096 +insert 2987 +insert 3092 +insert 2760 +insert 2631 +insert 2066 +insert 2943 +insert 2926 +insert 2950 +insert 2058 +insert 2589 +insert 2598 +insert 3131 +insert 3120 +insert 1832 +insert 2363 +insert 2083 +insert 2933 +insert 2967 +insert 3082 +insert 3100 +insert 2415 +insert 2776 +insert 1983 +insert 1813 +insert 3099 +insert 2493 +insert 2597 +insert 2537 +insert 2010 +insert 1643 +insert 3191 +insert 2989 +insert 2937 +insert 3149 +insert 3057 +insert 2013 +insert 2929 +insert 3176 +insert 2636 +insert 3163 +remove 1163 +insert 1984 +insert 2000 +insert 2608 +insert 2043 +insert 3137 +insert 3189 +insert 3263 +insert 2994 +insert 2498 +insert 2596 +insert 1800 +insert 3259 +insert 1759 +insert 2762 +insert 3023 +insert 3017 +insert 2955 +insert 2592 +insert 2511 +insert 3005 +insert 3097 +insert 3121 +insert 2629 +insert 2534 +insert 2927 +insert 2544 +insert 3055 +insert 2640 +insert 1821 +insert 3300 +insert 3153 +insert 2954 +insert 3275 +insert 3227 +insert 3168 +insert 3225 +insert 1801 +insert 1744 +insert 3154 +insert 3143 +insert 2452 +insert 2614 +insert 3044 +insert 2611 +insert 2409 +insert 2407 +insert 3070 +insert 2545 +insert 2953 +insert 3243 +insert 2947 +insert 2626 +insert 2398 +insert 2392 +insert 3222 +insert 3108 +insert 2377 +insert 3177 +insert 3150 +insert 2490 +insert 2456 +insert 2478 +insert 3155 +insert 2535 +insert 2501 +insert 2380 +insert 3232 +insert 1670 +remove 1129 +insert 2985 +insert 2408 +insert 2473 +insert 3122 +insert 1991 +insert 3067 +insert 1963 +insert 2423 +insert 2928 +insert 2458 +insert 2382 +insert 2993 +insert 3019 +insert 2489 +insert 3139 +insert 3068 +insert 3088 +insert 1961 +insert 2003 +insert 3146 +insert 3066 +insert 3173 +insert 3162 +insert 2016 +insert 2486 +insert 3042 +insert 1995 +insert 2444 +insert 2457 +insert 3069 +insert 3157 +insert 3186 +insert 2939 +insert 1646 +insert 2470 +insert 2982 +insert 2547 +insert 2780 +insert 3265 +insert 3178 +insert 1681 +insert 2788 +insert 3218 +insert 2012 +insert 3253 +insert 3252 +insert 1668 +insert 2789 +insert 3041 +insert 2938 +insert 2754 +insert 2002 +insert 1644 +insert 2343 +insert 3180 +insert 1675 +insert 3230 +insert 1631 +insert 2504 +insert 2767 +insert 3126 +insert 3254 +insert 3310 +insert 2466 +insert 3141 +insert 2770 +insert 3311 +insert 1907 +insert 3286 +insert 3110 +insert 3051 +insert 1957 +insert 2772 +insert 1944 +insert 1989 +insert 3256 +insert 2529 +insert 2317 +insert 3040 +insert 1658 +insert 1893 +insert 3104 +insert 2810 +insert 2482 +insert 2979 +insert 3058 +insert 2474 +insert 1671 +insert 1659 +insert 3007 +insert 2541 +insert 966 +insert 2459 +insert 2546 +insert 1677 +insert 2496 +insert 1635 +insert 1650 +insert 1680 +insert 2403 +insert 3106 +insert 2426 +insert 3080 +insert 2447 +insert 3022 +insert 3210 +insert 2304 +insert 2996 +insert 2465 +insert 2449 +insert 2371 +insert 2765 +insert 2514 +insert 3197 +insert 2427 +remove 1086 diff --git a/src/quickcheck.rs b/src/quickcheck.rs index 9005815..3faade7 100644 --- a/src/quickcheck.rs +++ b/src/quickcheck.rs @@ -4,19 +4,19 @@ use std::hash::{BuildHasher, Hash}; use std::iter::FromIterator; impl Arbitrary for Vector { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { Vector::from_iter(Vec::::arbitrary(g)) } } impl Arbitrary for OrdMap { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { OrdMap::from_iter(Vec::<(K, V)>::arbitrary(g)) } } impl Arbitrary for OrdSet { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { OrdSet::from_iter(Vec::::arbitrary(g)) } } @@ -26,7 +26,7 @@ where A: Hash + Eq + Arbitrary + Sync, S: BuildHasher + Default + Send + Sync + 'static, { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { HashSet::from_iter(Vec::::arbitrary(g)) } } @@ -37,7 +37,7 @@ where V: Arbitrary + Sync, S: BuildHasher + Default + Send + Sync + 'static, { - fn arbitrary(g: &mut G) -> Self { + fn arbitrary(g: &mut Gen) -> Self { HashMap::from(Vec::<(K, V)>::arbitrary(g)) } } diff --git a/src/tests/vector.rs b/src/tests/vector.rs index ef0ceff..14e312a 100644 --- a/src/tests/vector.rs +++ b/src/tests/vector.rs @@ -1,7 +1,6 @@ #![allow(clippy::unit_arg)] use std::fmt::{Debug, Error, Formatter, Write}; -use std::iter::FromIterator; use crate::Vector; @@ -173,7 +172,7 @@ proptest! { assert_eq!(len - 1, vec.len()); } Action::JoinLeft(mut new_nat) => { - let mut new_vec = Vector::from_iter(new_nat.iter().cloned()); + let mut new_vec = new_nat.iter().cloned().collect::>(); let add_len = new_nat.len(); let len = vec.len(); new_vec.append(vec); @@ -183,7 +182,7 @@ proptest! { assert_eq!(len + add_len, vec.len()); } Action::JoinRight(mut new_nat) => { - let new_vec = Vector::from_iter(new_nat.iter().cloned()); + let new_vec = new_nat.iter().cloned().collect::>(); let add_len = new_nat.len(); let len = vec.len(); vec.append(new_vec); @@ -197,7 +196,7 @@ proptest! { let nat_right = nat.split_off(index); assert_eq!(index, vec.len()); assert_eq!(len - index, vec_right.len()); - assert_eq!(Vector::from_iter(nat_right.iter().cloned()), vec_right); + assert_eq!(nat_right.iter().cloned().collect::>(), vec_right); } Action::SplitRight(index) => { let index = cap_index(vec.len(), index); @@ -206,14 +205,14 @@ proptest! { let nat_right = nat.split_off(index); assert_eq!(index, vec.len()); assert_eq!(len - index, vec_right.len()); - assert_eq!(Vector::from_iter(nat.iter().cloned()), vec); + assert_eq!(nat.iter().cloned().collect::>(), vec); vec = vec_right; nat = nat_right; } } vec.assert_invariants(); assert_eq!(nat.len(),vec.len()); - assert_eq!(Vector::from_iter(nat.iter().cloned()), vec); + assert_eq!(nat.iter().cloned().collect::>(), vec); } } } @@ -228,5 +227,5 @@ fn test_inserts() { let mut rv: Vec = Vec::new(); rv.extend((0..N).skip(1).step_by(2)); rv.extend((0..N).step_by(2).rev()); - assert_eq!(Vector::from_iter(rv.iter().cloned()), v); + assert_eq!(rv.iter().cloned().collect::>(), v); } diff --git a/src/vector/focus.rs b/src/vector/focus.rs index bf34255..e9105c2 100644 --- a/src/vector/focus.rs +++ b/src/vector/focus.rs @@ -11,9 +11,8 @@ use crate::nodes::chunk::Chunk; use crate::sync::Lock; use crate::util::{to_range, PoolRef, Ref}; use crate::vector::{ - Iter, IterMut, RRBPool, Vector, + Iter, IterMut, RRBPool, Rrb, Vector, VectorInner::{Full, Inline, Single}, - RRB, }; /// Focused indexing over a [`Vector`][Vector]. @@ -257,7 +256,7 @@ where } pub struct TreeFocus { - tree: RRB, + tree: Rrb, view: Range, middle_range: Range, target_range: Range, @@ -279,10 +278,10 @@ impl Clone for TreeFocus { #[allow(unsafe_code)] #[cfg(threadsafe)] -unsafe impl Send for TreeFocus {} +unsafe impl Send for TreeFocus {} #[allow(unsafe_code)] #[cfg(threadsafe)] -unsafe impl Sync for TreeFocus {} +unsafe impl Sync for TreeFocus {} #[inline] fn contains(range: &Range, index: &A) -> bool { @@ -293,7 +292,7 @@ impl TreeFocus where A: Clone, { - fn new(tree: &RRB) -> Self { + fn new(tree: &Rrb) -> Self { let middle_start = tree.outer_f.len() + tree.inner_f.len(); let middle_end = middle_start + tree.middle.len(); TreeFocus { @@ -390,7 +389,7 @@ where if !contains(&self.target_range, &phys_index) { self.set_focus(phys_index); } - let mut slice: &[A] = self.get_focus(); + let mut slice: &[A] = self.get_focus().as_slice(); let mut left = 0; let mut right = 0; if self.target_range.start < self.view.start { @@ -529,10 +528,7 @@ where /// Returns `None` if the index is out of bounds, or the replaced value /// otherwise. pub fn set(&mut self, index: usize, value: A) -> Option { - match self.get_mut(index) { - Some(ref mut pos) => Some(replace(pos, value)), - None => None, - } + self.get_mut(index).map(|pos| replace(pos, value)) } /// Swap the values at two given indices. @@ -749,17 +745,17 @@ where } } -impl<'a, A> Into> for FocusMut<'a, A> +impl<'a, A> From> for Focus<'a, A> where A: Clone + 'a, { - fn into(self) -> Focus<'a, A> { - self.unmut() + fn from(f: FocusMut<'a, A>) -> Self { + f.unmut() } } pub struct TreeFocusMut<'a, A> { - tree: Lock<&'a mut RRB>, + tree: Lock<&'a mut Rrb>, view: Range, middle_range: Range, target_range: Range, @@ -770,7 +766,7 @@ impl<'a, A> TreeFocusMut<'a, A> where A: Clone + 'a, { - fn new(tree: &'a mut RRB) -> Self { + fn new(tree: &'a mut Rrb) -> Self { let middle_start = tree.outer_f.len() + tree.inner_f.len(); let middle_end = middle_start + tree.middle.len(); TreeFocusMut { diff --git a/src/vector/mod.rs b/src/vector/mod.rs index f222f07..96170d3 100644 --- a/src/vector/mod.rs +++ b/src/vector/mod.rs @@ -147,13 +147,13 @@ pub struct Vector { } enum VectorInner { - Inline(RRBPool, InlineArray>), + Inline(RRBPool, InlineArray>), Single(RRBPool, PoolRef>), - Full(RRBPool, RRB), + Full(RRBPool, Rrb), } #[doc(hidden)] -pub struct RRB { +pub struct Rrb { length: usize, middle_level: usize, outer_f: PoolRef>, @@ -163,9 +163,9 @@ pub struct RRB { outer_b: PoolRef>, } -impl Clone for RRB { +impl Clone for Rrb { fn clone(&self) -> Self { - RRB { + Rrb { length: self.length, middle_level: self.middle_level, outer_f: self.outer_f.clone(), @@ -182,7 +182,7 @@ impl Vector { /// /// Note that if you didn't specifically construct it with a pool, you'll /// get back a reference to a pool of size 0. - #[cfg_attr(not(feature = "pool"), doc = "hidden")] + #[cfg_attr(not(feature = "pool"), doc(hidden))] pub fn pool(&self) -> &RRBPool { match self.vector { Inline(ref pool, _) => pool, @@ -219,7 +219,7 @@ impl Vector { let chunk = chunk.clone(); Full( pool.clone(), - RRB { + Rrb { length: chunk.len(), middle_level: 0, outer_f: PoolRef::default(&pool.value_pool), @@ -245,7 +245,7 @@ impl Vector { let chunk = chunk.clone(); Full( pool.clone(), - RRB { + Rrb { length: chunk.len(), middle_level: 0, outer_f: PoolRef::default(&pool.value_pool), @@ -334,11 +334,7 @@ impl Vector { #[inline] #[must_use] pub fn is_inline(&self) -> bool { - if let Inline(_, _) = &self.vector { - true - } else { - false - } + matches!(&self.vector, Inline(_, _)) } /// Test whether two vectors refer to the same content in memory. @@ -354,7 +350,7 @@ impl Vector { /// inside the space a `Vector` allocates for its pointers, so there are no heap allocations /// to compare). /// - /// Time: O(1), or O(n) for inline vectors + /// Time: O(1) #[must_use] pub fn ptr_eq(&self, other: &Self) -> bool { fn cmp_chunk(left: &PoolRef>, right: &PoolRef>) -> bool { @@ -677,7 +673,7 @@ impl Vector { /// Test if a given element is in the vector. /// /// Searches the vector for the first occurrence of a given value, - /// and returns `true if it's there. If it's nowhere to be found + /// and returns `true` if it's there. If it's nowhere to be found /// in the vector, it returns `false`. /// /// Time: O(n) @@ -808,7 +804,7 @@ impl Vector { #[must_use] pub fn unit(a: A) -> Self { let pool = RRBPool::default(); - if InlineArray::>::CAPACITY > 0 { + if InlineArray::>::CAPACITY > 0 { let mut array = InlineArray::new(); array.push(a); Self { @@ -983,7 +979,7 @@ impl Vector { } if self.is_empty() { - replace(self, other); + *self = other; return; } @@ -1177,7 +1173,7 @@ impl Vector { if local_index < tree.outer_f.len() { let of2 = PoolRef::make_mut(&pool.value_pool, &mut tree.outer_f) .split_off(local_index); - let right = RRB { + let right = Rrb { length: tree.length - index, middle_level: tree.middle_level, outer_f: PoolRef::new(&pool.value_pool, of2), @@ -1198,7 +1194,7 @@ impl Vector { if local_index < tree.inner_f.len() { let if2 = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_f) .split_off(local_index); - let right = RRB { + let right = Rrb { length: tree.length - index, middle_level: tree.middle_level, outer_f: PoolRef::new(&pool.value_pool, if2), @@ -1248,7 +1244,7 @@ impl Vector { }; (c1, c2) }; - let mut right = RRB { + let mut right = Rrb { length: tree.length - index, middle_level: tree.middle_level, outer_f: c2, @@ -1270,11 +1266,11 @@ impl Vector { if local_index < tree.inner_b.len() { let ib2 = PoolRef::make_mut(&pool.value_pool, &mut tree.inner_b) .split_off(local_index); - let right = RRB { + let right = Rrb { length: tree.length - index, outer_b: replace_pool_def(&pool.value_pool, &mut tree.outer_b), outer_f: PoolRef::new(&pool.value_pool, ib2), - ..RRB::new(pool) + ..Rrb::new(pool) }; tree.length = index; swap(&mut tree.outer_b, &mut tree.inner_b); @@ -1401,7 +1397,7 @@ impl Vector { /// Remove an element from a vector. /// /// Remove the element from position 'index', shifting all - /// elements after it to the left, and return the removec element. + /// elements after it to the left, and return the removed element. /// /// ## Performance Note /// @@ -1521,9 +1517,9 @@ impl Vector { // Implementation details -impl RRB { +impl Rrb { fn new(pool: &RRBPool) -> Self { - RRB { + Rrb { length: 0, middle_level: 0, outer_f: PoolRef::default(&pool.value_pool), @@ -2291,7 +2287,7 @@ mod test { #[test] fn large_vector_focus() { - let input = Vector::from_iter(0..100_000); + let input = (0..100_000).collect::>(); let vec = input.clone(); let mut sum: i64 = 0; let mut focus = vec.focus(); @@ -2304,7 +2300,7 @@ mod test { #[test] fn large_vector_focus_mut() { - let input = Vector::from_iter(0..100_000); + let input = (0..100_000).collect::>(); let mut vec = input.clone(); { let mut focus = vec.focus_mut(); @@ -2344,8 +2340,8 @@ mod test { #[test] fn issue_55_append() { - let mut vec1 = Vector::from_iter(0..92); - let vec2 = Vector::from_iter(0..165); + let mut vec1 = (0..92).collect::>(); + let vec2 = (0..165).collect::>(); vec1.append(vec2); } @@ -2481,8 +2477,8 @@ mod test { #[test] fn issue_107_split_off_causes_overflow() { - let mut vec = Vector::from_iter(0..4289); - let mut control = Vec::from_iter(0..4289); + let mut vec = (0..4289).collect::>(); + let mut control = (0..4289).collect::>(); let chunk = 64; while vec.len() >= chunk { @@ -2501,7 +2497,7 @@ mod test { #[test] fn issue_116() { - let vec = Vector::from_iter(0..300); + let vec = (0..300).collect::>(); let rev_vec: Vector = vec.clone().into_iter().rev().collect(); assert_eq!(vec.len(), rev_vec.len()); } @@ -2529,14 +2525,14 @@ mod test { assert!(input.ptr_eq(&inp2)); inp2.set(len - 1, 98); assert_ne!(inp2.get(len - 1), input.get(len - 1)); - assert!(!input.ptr_eq(&inp2), len); + assert!(!input.ptr_eq(&inp2)); } } proptest! { #[test] fn iter(ref vec in vec(i32::ANY, 0..1000)) { - let seq: Vector = Vector::from_iter(vec.iter().cloned()); + let seq: Vector = vec.iter().cloned().collect::>(); for (index, item) in seq.iter().enumerate() { assert_eq!(&vec[index], item); } @@ -2551,8 +2547,8 @@ mod test { vector.push_front(value); assert_eq!(count + 1, vector.len()); } - let input2 = Vec::from_iter(input.iter().rev().cloned()); - assert_eq!(input2, Vec::from_iter(vector.iter().cloned())); + let input2 = input.iter().rev().cloned().collect::>(); + assert_eq!(input2, vector.iter().cloned().collect::>()); } #[test] @@ -2563,12 +2559,12 @@ mod test { vector.push_back(value); assert_eq!(count + 1, vector.len()); } - assert_eq!(input, &Vec::from_iter(vector.iter().cloned())); + assert_eq!(input, &vector.iter().cloned().collect::>()); } #[test] fn pop_back_mut(ref input in vec(i32::ANY, 0..1000)) { - let mut vector = Vector::from_iter(input.iter().cloned()); + let mut vector = input.iter().cloned().collect::>(); assert_eq!(input.len(), vector.len()); for (index, value) in input.iter().cloned().enumerate().rev() { match vector.pop_back() { @@ -2584,7 +2580,7 @@ mod test { #[test] fn pop_front_mut(ref input in vec(i32::ANY, 0..1000)) { - let mut vector = Vector::from_iter(input.iter().cloned()); + let mut vector = input.iter().cloned().collect::>(); assert_eq!(input.len(), vector.len()); for (index, value) in input.iter().cloned().rev().enumerate().rev() { match vector.pop_front() { @@ -2621,7 +2617,7 @@ mod test { #[test] fn split(ref vec in vec(i32::ANY, 1..2000), split_pos in usize::ANY) { let split_index = split_pos % (vec.len() + 1); - let mut left = Vector::from_iter(vec.iter().cloned()); + let mut left = vec.iter().cloned().collect::>(); let right = left.split_off(split_index); assert_eq!(left.len(), split_index); assert_eq!(right.len(), vec.len() - split_index); @@ -2635,8 +2631,8 @@ mod test { #[test] fn append(ref vec1 in vec(i32::ANY, 0..1000), ref vec2 in vec(i32::ANY, 0..1000)) { - let mut seq1 = Vector::from_iter(vec1.iter().cloned()); - let seq2 = Vector::from_iter(vec2.iter().cloned()); + let mut seq1 = vec1.iter().cloned().collect::>(); + let seq2 = vec2.iter().cloned().collect::>(); assert_eq!(seq1.len(), vec1.len()); assert_eq!(seq2.len(), vec2.len()); seq1.append(seq2);