mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-08 10:44:20 +01:00
reduce cloning for pick_unique
This commit is contained in:
@@ -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)]
|
||||
|
||||
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user