Skip to content

Commit

Permalink
Merge pull request #2362 from iced-rs/size-hint-for-row-columns
Browse files Browse the repository at this point in the history
Use `Iterator::size_hint` to initialize `Column` and `Row` capacity
  • Loading branch information
hecrj authored Apr 1, 2024
2 parents b40db56 + db4b03a commit c30b4b0
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 8 deletions.
9 changes: 8 additions & 1 deletion widget/src/column.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,18 @@ where
Self::from_vec(Vec::new())
}

/// Creates a [`Column`] with the given capacity.
pub fn with_capacity(capacity: usize) -> Self {
Self::from_vec(Vec::with_capacity(capacity))
}

/// Creates a [`Column`] with the given elements.
pub fn with_children(
children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,
) -> Self {
Self::new().extend(children)
let iterator = children.into_iter();

Self::with_capacity(iterator.size_hint().0).extend(iterator)
}

/// Creates a [`Column`] from an already allocated [`Vec`].
Expand Down
46 changes: 40 additions & 6 deletions widget/src/keyed/column.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,27 +40,49 @@ where
{
/// Creates an empty [`Column`].
pub fn new() -> Self {
Column {
Self::from_vecs(Vec::new(), Vec::new())
}

/// Creates a [`Column`] from already allocated [`Vec`]s.
///
/// Keep in mind that the [`Column`] will not inspect the [`Vec`]s, which means
/// it won't automatically adapt to the sizing strategy of its contents.
///
/// If any of the children have a [`Length::Fill`] strategy, you will need to
/// call [`Column::width`] or [`Column::height`] accordingly.
pub fn from_vecs(
keys: Vec<Key>,
children: Vec<Element<'a, Message, Theme, Renderer>>,
) -> Self {
Self {
spacing: 0.0,
padding: Padding::ZERO,
width: Length::Shrink,
height: Length::Shrink,
max_width: f32::INFINITY,
align_items: Alignment::Start,
keys: Vec::new(),
children: Vec::new(),
keys,
children,
}
}

/// Creates a [`Column`] with the given capacity.
pub fn with_capacity(capacity: usize) -> Self {
Self::from_vecs(
Vec::with_capacity(capacity),
Vec::with_capacity(capacity),
)
}

/// Creates a [`Column`] with the given elements.
pub fn with_children(
children: impl IntoIterator<
Item = (Key, Element<'a, Message, Theme, Renderer>),
>,
) -> Self {
children
.into_iter()
.fold(Self::new(), |column, (key, child)| column.push(key, child))
let iterator = children.into_iter();

Self::with_capacity(iterator.size_hint().0).extend(iterator)
}

/// Sets the vertical spacing _between_ elements.
Expand Down Expand Up @@ -132,6 +154,18 @@ where
self
}
}

/// Extends the [`Column`] with the given children.
pub fn extend(
self,
children: impl IntoIterator<
Item = (Key, Element<'a, Message, Theme, Renderer>),
>,
) -> Self {
children
.into_iter()
.fold(self, |column, (key, child)| column.push(key, child))
}
}

impl<'a, Key, Message, Renderer> Default for Column<'a, Key, Message, Renderer>
Expand Down
9 changes: 8 additions & 1 deletion widget/src/row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,18 @@ where
Self::from_vec(Vec::new())
}

/// Creates a [`Row`] with the given capacity.
pub fn with_capacity(capacity: usize) -> Self {
Self::from_vec(Vec::with_capacity(capacity))
}

/// Creates a [`Row`] with the given elements.
pub fn with_children(
children: impl IntoIterator<Item = Element<'a, Message, Theme, Renderer>>,
) -> Self {
Self::new().extend(children)
let iterator = children.into_iter();

Self::with_capacity(iterator.size_hint().0).extend(iterator)
}

/// Creates a [`Row`] from an already allocated [`Vec`].
Expand Down

0 comments on commit c30b4b0

Please sign in to comment.