reduce cloning for pick_unique

This commit is contained in:
pedrocarlo
2025-08-28 01:31:21 -03:00
parent bc6976fd33
commit faa943fc76
2 changed files with 14 additions and 16 deletions

View File

@@ -142,11 +142,15 @@ pub fn pick_index<R: Rng>(choices: usize, rng: &mut R) -> usize {
/// pick_n_unique is a helper function for uniformly picking N unique elements from a range.
/// The elements themselves are usize, typically representing indices.
pub fn pick_n_unique<R: Rng>(range: std::ops::Range<usize>, n: usize, rng: &mut R) -> Vec<usize> {
pub fn pick_n_unique<R: Rng>(
range: std::ops::Range<usize>,
n: usize,
rng: &mut R,
) -> impl Iterator<Item = usize> {
use rand::seq::SliceRandom;
let mut items: Vec<usize> = range.collect();
items.shuffle(rng);
items.into_iter().take(n).collect()
items.into_iter().take(n)
}
/// gen_random_text uses `anarchist_readable_name_generator_lib` to generate random
@@ -168,22 +172,19 @@ pub fn gen_random_text<T: Rng>(rng: &mut T) -> String {
}
}
pub fn pick_unique<T: ToOwned + PartialEq>(
items: &[T],
pub fn pick_unique<'a, T: PartialEq>(
items: &'a [T],
count: usize,
rng: &mut impl rand::Rng,
) -> Vec<T::Owned>
where
<T as ToOwned>::Owned: PartialEq,
{
let mut picked: Vec<T::Owned> = Vec::new();
) -> impl Iterator<Item = &'a T> {
let mut picked: Vec<&T> = Vec::new();
while picked.len() < count {
let item = pick(items, rng);
if !picked.contains(&item.to_owned()) {
picked.push(item.to_owned());
if !picked.contains(&item) {
picked.push(item);
}
}
picked
picked.into_iter()
}
#[cfg(test)]

View File

@@ -169,8 +169,7 @@ impl ArbitrarySized for SelectInner {
.collect::<Vec<_>>();
let selected_columns = pick_unique(&flat_columns_names, num_result_columns, rng);
let columns = selected_columns
.into_iter()
.map(|col_name| ResultColumn::Column(col_name))
.map(|col_name| ResultColumn::Column(col_name.clone()))
.collect();
select_inner.columns = columns;
@@ -338,7 +337,6 @@ impl Arbitrary for CreateIndex {
let picked_column_indices = pick_n_unique(0..table.columns.len(), num_columns_to_pick, rng);
let columns = picked_column_indices
.into_iter()
.map(|i| {
let column = &table.columns[i];
(
@@ -372,7 +370,6 @@ impl Arbitrary for Update {
let num_cols = rng.random_range(1..=table.columns.len());
let columns = pick_unique(&table.columns, num_cols, rng);
let set_values: Vec<(String, SimValue)> = columns
.iter()
.map(|column| {
(
column.name.clone(),