[−][src]Struct truck_topology::Shell
Shell, a connected compounded faces.
The entity of this struct is Vec<Face>
and almost methods are inherited from
Vec<Face>
by Deref
and DerefMut
traits.
Implementations
impl<P, C, S> Shell<P, C, S>
[src]
pub const fn new() -> Shell<P, C, S>
[src]
Creates the empty shell.
pub fn with_capacity(capacity: usize) -> Shell<P, C, S>
[src]
Creates the empty shell with space for at least capacity
faces.
pub fn face_iter(&self) -> FaceIter<'_, P, C, S>
[src]
Returns an iterator over the faces. Practically, an alias of iter()
.
pub fn face_iter_mut(&mut self) -> FaceIterMut<'_, P, C, S>
[src]
Returns a mutable iterator over the faces. Practically, an alias of iter_mut()
.
pub fn face_into_iter(self) -> FaceIntoIter<P, C, S>
[src]
Creates a consuming iterator. Practically, an alias of into_iter()
.
pub fn append(&mut self, other: &mut Shell<P, C, S>)
[src]
Moves all the faces of other
into self
, leaving other
empty.
pub fn shell_condition(&self) -> ShellCondition
[src]
Determines the shell conditions: non-regular, regular, oriented, or closed.
The complexity increases in proportion to the number of edges.
Examples for each condition can be found on the page of
ShellCondition
.
pub fn extract_boundaries(&self) -> Vec<Wire<P, C>>
[src]
Returns a vector of all boundaries as wires.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 6]); let edge = [ Edge::new(&v[0], &v[1], ()), Edge::new(&v[0], &v[2], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[1], &v[4], ()), Edge::new(&v[2], &v[4], ()), Edge::new(&v[2], &v[5], ()), Edge::new(&v[3], &v[4], ()), Edge::new(&v[4], &v[5], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[2], &edge[1].inverse()]), Wire::from_iter(vec![&edge[3], &edge[7], &edge[4].inverse()]), Wire::from_iter(vec![&edge[5], &edge[8], &edge[6].inverse()]), Wire::from_iter(vec![&edge[2].inverse(), &edge[4], &edge[5].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); let boundary = shell.extract_boundaries()[0].clone(); assert_eq!( boundary, Wire::from_iter(vec![&edge[0], &edge[3], &edge[7], &edge[8], &edge[6].inverse(), &edge[1].inverse()]), );
Remarks
This method is optimized when the shell is oriented. Even if the shell is not oriented, all the edges of the boundary are extracted. However, the connected components of the boundary are split into several wires.
pub fn vertex_adjacency(&self) -> HashMap<VertexID<P>, Vec<VertexID<P>>>
[src]
Returns the adjacency matrix of vertices in the shell.
For the returned hashmap map
and each vertex v
,
the vector map[&v]
cosists all vertices which is adjacent to v
.
Exmaples
use truck_topology::*; use std::collections::HashSet; use std::iter::FromIterator; let v = Vertex::news(&[(); 4]); let edge = [ Edge::new(&v[0], &v[2], ()), Edge::new(&v[0], &v[3], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[2], &v[3], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[4], &edge[1].inverse()]), Wire::from_iter(vec![&edge[2], &edge[4], &edge[3].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); let adjacency = shell.vertex_adjacency(); let v0_ads_vec = adjacency.get(&v[0].id()).unwrap(); let v0_ads: HashSet<&VertexID<()>> = HashSet::from_iter(v0_ads_vec); assert_eq!(v0_ads, HashSet::from_iter(vec![&v[2].id(), &v[3].id()]));
pub fn face_adjacency(&self) -> HashMap<&Face<P, C, S>, Vec<&Face<P, C, S>>>
[src]
Returns the adjacency matrix of faces in the shell.
For the returned hashmap map
and each face face
,
the vector map[&face]
consists all faces adjacent to face
.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 6]); let edge = [ Edge::new(&v[0], &v[1], ()), Edge::new(&v[0], &v[2], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[1], &v[4], ()), Edge::new(&v[2], &v[4], ()), Edge::new(&v[2], &v[5], ()), Edge::new(&v[3], &v[4], ()), Edge::new(&v[4], &v[5], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[2], &edge[1].inverse()]), Wire::from_iter(vec![&edge[3], &edge[7], &edge[4].inverse()]), Wire::from_iter(vec![&edge[5], &edge[8], &edge[6].inverse()]), Wire::from_iter(vec![&edge[2].inverse(), &edge[4], &edge[5].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); let face_adjacency = shell.face_adjacency(); assert_eq!(face_adjacency[&shell[0]].len(), 1); assert_eq!(face_adjacency[&shell[1]].len(), 1); assert_eq!(face_adjacency[&shell[2]].len(), 1); assert_eq!(face_adjacency[&shell[3]].len(), 3);
pub fn is_connected(&self) -> bool
[src]
Returns whether the shell is connected or not.
Examples
// The empty shell is connected. use truck_topology::*; assert!(Shell::<(), (), ()>::new().is_connected());
// An example of a connected shell use truck_topology::*; use std::iter::FromIterator; let v = Vertex::news(&[(); 4]); let shared_edge = Edge::new(&v[1], &v[2], ()); let wire0 = Wire::from_iter(vec![ &Edge::new(&v[0], &v[1], ()), &shared_edge, &Edge::new(&v[2], &v[0], ()), ]); let face0 = Face::new(vec![wire0], ()); let wire1 = Wire::from_iter(vec![ &Edge::new(&v[3], &v[1], ()), &shared_edge, &Edge::new(&v[2], &v[3], ()), ]); let face1 = Face::new(vec![wire1], ()); let shell: Shell<_, _, _> = vec![face0, face1].into(); assert!(shell.is_connected());
// An example of a non-connected shell use truck_topology::*; use std::iter::FromIterator; let v = Vertex::news(&[(); 6]); let wire0 = Wire::from_iter(vec![ Edge::new(&v[0], &v[1], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[2], &v[0], ()) ]); let face0 = Face::new(vec![wire0], ()); let wire1 = Wire::from_iter(vec![ &Edge::new(&v[3], &v[4], ()), &Edge::new(&v[4], &v[5], ()), &Edge::new(&v[5], &v[3], ()) ]); let face1 = Face::new(vec![wire1], ()); let shell: Shell<_, _, _> = vec![face0, face1].into(); assert!(!shell.is_connected());
pub fn connected_components(&self) -> Vec<Shell<P, C, S>>
[src]
Returns a vector consisting of shells of each connected components.
Examples
use truck_topology::Shell; // The empty shell has no connected component. assert!(Shell::<(), (), ()>::new().connected_components().is_empty());
Remarks
Since this method uses the face adjacency matrix, multiple components are perhaps generated even if the shell is connected. In that case, there is a pair of faces such that share vertices but not edges.
use truck_topology::*; use std::iter::FromIterator; let v = Vertex::news(&[(); 5]); let wire0 = Wire::from_iter(vec![ Edge::new(&v[0], &v[1], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[2], &v[0], ()), ]); let wire1 = Wire::from_iter(vec![ Edge::new(&v[0], &v[3], ()), Edge::new(&v[3], &v[4], ()), Edge::new(&v[4], &v[0], ()), ]); let shell = Shell::from(vec![ Face::new(vec![wire0], ()), Face::new(vec![wire1], ()), ]); assert!(shell.is_connected()); assert_eq!(shell.connected_components().len(), 2);
pub fn singular_vertices(&self) -> Vec<Vertex<P>>
[src]
Returns the vector of all singular vertices.
Here, we say that a vertex is singular if, for a sufficiently small neighborhood U of the vertex, the set U - {the vertex} is not connected.
A regular, oriented, or closed shell becomes a manifold if and only if the shell has no singular vertices.
Examples
// A regular manifold: Mobius bundle use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(), (), (), ()]); let edge = [ Edge::new(&v[0], &v[1], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[2], &v[0], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[3], &v[2], ()), Edge::new(&v[0], &v[3], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[3], &edge[4], &edge[2]]), Wire::from_iter(vec![&edge[1], &edge[2], &edge[5], &edge[3].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); assert_eq!(shell.shell_condition(), ShellCondition::Regular); assert!(shell.singular_vertices().is_empty());
// A closed and connected shell which has a singular vertex. use truck_topology::*; use truck_topology::shell::*; use std::iter::FromIterator; let v = Vertex::news(&[(); 7]); let edge = [ Edge::new(&v[0], &v[1], ()), // 0 Edge::new(&v[0], &v[2], ()), // 1 Edge::new(&v[0], &v[3], ()), // 2 Edge::new(&v[1], &v[2], ()), // 3 Edge::new(&v[2], &v[3], ()), // 4 Edge::new(&v[3], &v[1], ()), // 5 Edge::new(&v[0], &v[4], ()), // 6 Edge::new(&v[0], &v[5], ()), // 7 Edge::new(&v[0], &v[6], ()), // 8 Edge::new(&v[4], &v[5], ()), // 9 Edge::new(&v[5], &v[6], ()), // 10 Edge::new(&v[6], &v[4], ()), // 11 ]; let wire = vec![ Wire::from_iter(vec![&edge[0].inverse(), &edge[1], &edge[3].inverse()]), Wire::from_iter(vec![&edge[1].inverse(), &edge[2], &edge[4].inverse()]), Wire::from_iter(vec![&edge[2].inverse(), &edge[0], &edge[5].inverse()]), Wire::from_iter(vec![&edge[3], &edge[4], &edge[5]]), Wire::from_iter(vec![&edge[6].inverse(), &edge[7], &edge[9].inverse()]), Wire::from_iter(vec![&edge[7].inverse(), &edge[8], &edge[10].inverse()]), Wire::from_iter(vec![&edge[8].inverse(), &edge[6], &edge[11].inverse()]), Wire::from_iter(vec![&edge[9], &edge[10], &edge[11]]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); assert_eq!(shell.shell_condition(), ShellCondition::Closed); assert!(shell.is_connected()); assert_eq!(shell.singular_vertices(), vec![v[0].clone()]);
impl<P: Tolerance, C: Curve<Point = P>, S: Surface<Point = C::Point, Vector = C::Vector, Curve = C>> Shell<P, C, S>
[src]
pub fn is_geometric_consistent(&self) -> bool
[src]
Returns the consistence of the geometry of end vertices and the geometry of edge.
impl<P: Clone, C: Clone, S: Clone> Shell<P, C, S>
[src]
pub fn compress(&self) -> CompressedShell<P, C, S>
[src]
pub fn extract(cshell: CompressedShell<P, C, S>) -> Result<Self>
[src]
Methods from Deref<Target = Vec<Face<P, C, S>>>
pub fn capacity(&self) -> usize
1.0.0[src]
Returns the number of elements the vector can hold without reallocating.
Examples
let vec: Vec<i32> = Vec::with_capacity(10); assert_eq!(vec.capacity(), 10);
pub fn reserve(&mut self, additional: usize)
1.0.0[src]
Reserves capacity for at least additional
more elements to be inserted
in the given Vec<T>
. The collection may reserve more space to avoid
frequent reallocations. After calling reserve
, capacity will be
greater than or equal to self.len() + additional
. Does nothing if
capacity is already sufficient.
Panics
Panics if the new capacity exceeds isize::MAX
bytes.
Examples
let mut vec = vec![1]; vec.reserve(10); assert!(vec.capacity() >= 11);
pub fn reserve_exact(&mut self, additional: usize)
1.0.0[src]
Reserves the minimum capacity for exactly additional
more elements to
be inserted in the given Vec<T>
. After calling reserve_exact
,
capacity will be greater than or equal to self.len() + additional
.
Does nothing if the capacity is already sufficient.
Note that the allocator may give the collection more space than it
requests. Therefore, capacity can not be relied upon to be precisely
minimal. Prefer reserve
if future insertions are expected.
Panics
Panics if the new capacity overflows usize
.
Examples
let mut vec = vec![1]; vec.reserve_exact(10); assert!(vec.capacity() >= 11);
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>
[src]
🔬 This is a nightly-only experimental API. (try_reserve
)
new API
Tries to reserve capacity for at least additional
more elements to be inserted
in the given Vec<T>
. The collection may reserve more space to avoid
frequent reallocations. After calling try_reserve
, capacity will be
greater than or equal to self.len() + additional
. Does nothing if
capacity is already sufficient.
Errors
If the capacity overflows, or the allocator reports a failure, then an error is returned.
Examples
#![feature(try_reserve)] use std::collections::TryReserveError; fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> { let mut output = Vec::new(); // Pre-reserve the memory, exiting if we can't output.try_reserve(data.len())?; // Now we know this can't OOM in the middle of our complex work output.extend(data.iter().map(|&val| { val * 2 + 5 // very complicated })); Ok(output) }
pub fn try_reserve_exact(
&mut self,
additional: usize
) -> Result<(), TryReserveError>
[src]
&mut self,
additional: usize
) -> Result<(), TryReserveError>
🔬 This is a nightly-only experimental API. (try_reserve
)
new API
Tries to reserve the minimum capacity for exactly additional
elements to be inserted in the given Vec<T>
. After calling
try_reserve_exact
, capacity will be greater than or equal to
self.len() + additional
if it returns Ok(())
.
Does nothing if the capacity is already sufficient.
Note that the allocator may give the collection more space than it
requests. Therefore, capacity can not be relied upon to be precisely
minimal. Prefer reserve
if future insertions are expected.
Errors
If the capacity overflows, or the allocator reports a failure, then an error is returned.
Examples
#![feature(try_reserve)] use std::collections::TryReserveError; fn process_data(data: &[u32]) -> Result<Vec<u32>, TryReserveError> { let mut output = Vec::new(); // Pre-reserve the memory, exiting if we can't output.try_reserve_exact(data.len())?; // Now we know this can't OOM in the middle of our complex work output.extend(data.iter().map(|&val| { val * 2 + 5 // very complicated })); Ok(output) }
pub fn shrink_to_fit(&mut self)
1.0.0[src]
Shrinks the capacity of the vector as much as possible.
It will drop down as close as possible to the length but the allocator may still inform the vector that there is space for a few more elements.
Examples
let mut vec = Vec::with_capacity(10); vec.extend([1, 2, 3].iter().cloned()); assert_eq!(vec.capacity(), 10); vec.shrink_to_fit(); assert!(vec.capacity() >= 3);
pub fn shrink_to(&mut self, min_capacity: usize)
[src]
🔬 This is a nightly-only experimental API. (shrink_to
)
new API
Shrinks the capacity of the vector with a lower bound.
The capacity will remain at least as large as both the length and the supplied value.
Panics
Panics if the current capacity is smaller than the supplied minimum capacity.
Examples
#![feature(shrink_to)] let mut vec = Vec::with_capacity(10); vec.extend([1, 2, 3].iter().cloned()); assert_eq!(vec.capacity(), 10); vec.shrink_to(4); assert!(vec.capacity() >= 4); vec.shrink_to(0); assert!(vec.capacity() >= 3);
pub fn truncate(&mut self, len: usize)
1.0.0[src]
Shortens the vector, keeping the first len
elements and dropping
the rest.
If len
is greater than the vector's current length, this has no
effect.
The drain
method can emulate truncate
, but causes the excess
elements to be returned instead of dropped.
Note that this method has no effect on the allocated capacity of the vector.
Examples
Truncating a five element vector to two elements:
let mut vec = vec![1, 2, 3, 4, 5]; vec.truncate(2); assert_eq!(vec, [1, 2]);
No truncation occurs when len
is greater than the vector's current
length:
let mut vec = vec![1, 2, 3]; vec.truncate(8); assert_eq!(vec, [1, 2, 3]);
Truncating when len == 0
is equivalent to calling the clear
method.
let mut vec = vec![1, 2, 3]; vec.truncate(0); assert_eq!(vec, []);
pub fn as_slice(&self) -> &[T]
1.7.0[src]
Extracts a slice containing the entire vector.
Equivalent to &s[..]
.
Examples
use std::io::{self, Write}; let buffer = vec![1, 2, 3, 5, 8]; io::sink().write(buffer.as_slice()).unwrap();
pub fn as_mut_slice(&mut self) -> &mut [T]
1.7.0[src]
Extracts a mutable slice of the entire vector.
Equivalent to &mut s[..]
.
Examples
use std::io::{self, Read}; let mut buffer = vec![0; 3]; io::repeat(0b101).read_exact(buffer.as_mut_slice()).unwrap();
pub fn as_ptr(&self) -> *const T
1.37.0[src]
Returns a raw pointer to the vector's buffer.
The caller must ensure that the vector outlives the pointer this function returns, or else it will end up pointing to garbage. Modifying the vector may cause its buffer to be reallocated, which would also make any pointers to it invalid.
The caller must also ensure that the memory the pointer (non-transitively) points to
is never written to (except inside an UnsafeCell
) using this pointer or any pointer
derived from it. If you need to mutate the contents of the slice, use as_mut_ptr
.
Examples
let x = vec![1, 2, 4]; let x_ptr = x.as_ptr(); unsafe { for i in 0..x.len() { assert_eq!(*x_ptr.add(i), 1 << i); } }
pub fn as_mut_ptr(&mut self) -> *mut T
1.37.0[src]
Returns an unsafe mutable pointer to the vector's buffer.
The caller must ensure that the vector outlives the pointer this function returns, or else it will end up pointing to garbage. Modifying the vector may cause its buffer to be reallocated, which would also make any pointers to it invalid.
Examples
// Allocate vector big enough for 4 elements. let size = 4; let mut x: Vec<i32> = Vec::with_capacity(size); let x_ptr = x.as_mut_ptr(); // Initialize elements via raw pointer writes, then set length. unsafe { for i in 0..size { *x_ptr.add(i) = i as i32; } x.set_len(size); } assert_eq!(&*x, &[0, 1, 2, 3]);
pub fn allocator(&self) -> &A
[src]
allocator_api
)Returns a reference to the underlying allocator.
pub unsafe fn set_len(&mut self, new_len: usize)
1.0.0[src]
Forces the length of the vector to new_len
.
This is a low-level operation that maintains none of the normal
invariants of the type. Normally changing the length of a vector
is done using one of the safe operations instead, such as
truncate
, resize
, extend
, or clear
.
Safety
new_len
must be less than or equal tocapacity()
.- The elements at
old_len..new_len
must be initialized.
Examples
This method can be useful for situations in which the vector is serving as a buffer for other code, particularly over FFI:
pub fn get_dictionary(&self) -> Option<Vec<u8>> { // Per the FFI method's docs, "32768 bytes is always enough". let mut dict = Vec::with_capacity(32_768); let mut dict_length = 0; // SAFETY: When `deflateGetDictionary` returns `Z_OK`, it holds that: // 1. `dict_length` elements were initialized. // 2. `dict_length` <= the capacity (32_768) // which makes `set_len` safe to call. unsafe { // Make the FFI call... let r = deflateGetDictionary(self.strm, dict.as_mut_ptr(), &mut dict_length); if r == Z_OK { // ...and update the length to what was initialized. dict.set_len(dict_length); Some(dict) } else { None } } }
While the following example is sound, there is a memory leak since
the inner vectors were not freed prior to the set_len
call:
let mut vec = vec![vec![1, 0, 0], vec![0, 1, 0], vec![0, 0, 1]]; // SAFETY: // 1. `old_len..0` is empty so no elements need to be initialized. // 2. `0 <= capacity` always holds whatever `capacity` is. unsafe { vec.set_len(0); }
Normally, here, one would use clear
instead to correctly drop
the contents and thus not leak memory.
pub fn swap_remove(&mut self, index: usize) -> T
1.0.0[src]
Removes an element from the vector and returns it.
The removed element is replaced by the last element of the vector.
This does not preserve ordering, but is O(1).
Panics
Panics if index
is out of bounds.
Examples
let mut v = vec!["foo", "bar", "baz", "qux"]; assert_eq!(v.swap_remove(1), "bar"); assert_eq!(v, ["foo", "qux", "baz"]); assert_eq!(v.swap_remove(0), "foo"); assert_eq!(v, ["baz", "qux"]);
pub fn insert(&mut self, index: usize, element: T)
1.0.0[src]
Inserts an element at position index
within the vector, shifting all
elements after it to the right.
Panics
Panics if index > len
.
Examples
let mut vec = vec![1, 2, 3]; vec.insert(1, 4); assert_eq!(vec, [1, 4, 2, 3]); vec.insert(4, 5); assert_eq!(vec, [1, 4, 2, 3, 5]);
pub fn remove(&mut self, index: usize) -> T
1.0.0[src]
Removes and returns the element at position index
within the vector,
shifting all elements after it to the left.
Panics
Panics if index
is out of bounds.
Examples
let mut v = vec![1, 2, 3]; assert_eq!(v.remove(1), 2); assert_eq!(v, [1, 3]);
pub fn retain<F>(&mut self, f: F) where
F: FnMut(&T) -> bool,
1.0.0[src]
F: FnMut(&T) -> bool,
Retains only the elements specified by the predicate.
In other words, remove all elements e
such that f(&e)
returns false
.
This method operates in place, visiting each element exactly once in the
original order, and preserves the order of the retained elements.
Examples
let mut vec = vec![1, 2, 3, 4]; vec.retain(|&x| x % 2 == 0); assert_eq!(vec, [2, 4]);
The exact order may be useful for tracking external state, like an index.
let mut vec = vec![1, 2, 3, 4, 5]; let keep = [false, true, true, false, true]; let mut i = 0; vec.retain(|_| (keep[i], i += 1).0); assert_eq!(vec, [2, 3, 5]);
pub fn dedup_by_key<F, K>(&mut self, key: F) where
K: PartialEq<K>,
F: FnMut(&mut T) -> K,
1.16.0[src]
K: PartialEq<K>,
F: FnMut(&mut T) -> K,
Removes all but the first of consecutive elements in the vector that resolve to the same key.
If the vector is sorted, this removes all duplicates.
Examples
let mut vec = vec![10, 20, 21, 30, 20]; vec.dedup_by_key(|i| *i / 10); assert_eq!(vec, [10, 20, 30, 20]);
pub fn dedup_by<F>(&mut self, same_bucket: F) where
F: FnMut(&mut T, &mut T) -> bool,
1.16.0[src]
F: FnMut(&mut T, &mut T) -> bool,
Removes all but the first of consecutive elements in the vector satisfying a given equality relation.
The same_bucket
function is passed references to two elements from the vector and
must determine if the elements compare equal. The elements are passed in opposite order
from their order in the slice, so if same_bucket(a, b)
returns true
, a
is removed.
If the vector is sorted, this removes all duplicates.
Examples
let mut vec = vec!["foo", "bar", "Bar", "baz", "bar"]; vec.dedup_by(|a, b| a.eq_ignore_ascii_case(b)); assert_eq!(vec, ["foo", "bar", "baz", "bar"]);
pub fn push(&mut self, value: T)
1.0.0[src]
Appends an element to the back of a collection.
Panics
Panics if the new capacity exceeds isize::MAX
bytes.
Examples
let mut vec = vec![1, 2]; vec.push(3); assert_eq!(vec, [1, 2, 3]);
pub fn pop(&mut self) -> Option<T>
1.0.0[src]
Removes the last element from a vector and returns it, or None
if it
is empty.
Examples
let mut vec = vec![1, 2, 3]; assert_eq!(vec.pop(), Some(3)); assert_eq!(vec, [1, 2]);
pub fn append(&mut self, other: &mut Vec<T, A>)
1.4.0[src]
Moves all the elements of other
into Self
, leaving other
empty.
Panics
Panics if the number of elements in the vector overflows a usize
.
Examples
let mut vec = vec![1, 2, 3]; let mut vec2 = vec![4, 5, 6]; vec.append(&mut vec2); assert_eq!(vec, [1, 2, 3, 4, 5, 6]); assert_eq!(vec2, []);
pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A> where
R: RangeBounds<usize>,
1.6.0[src]
R: RangeBounds<usize>,
Creates a draining iterator that removes the specified range in the vector and yields the removed items.
When the iterator is dropped, all elements in the range are removed
from the vector, even if the iterator was not fully consumed. If the
iterator is not dropped (with mem::forget
for example), it is
unspecified how many elements are removed.
Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Examples
let mut v = vec![1, 2, 3]; let u: Vec<_> = v.drain(1..).collect(); assert_eq!(v, &[1]); assert_eq!(u, &[2, 3]); // A full range clears the vector v.drain(..); assert_eq!(v, &[]);
pub fn clear(&mut self)
1.0.0[src]
Clears the vector, removing all values.
Note that this method has no effect on the allocated capacity of the vector.
Examples
let mut v = vec![1, 2, 3]; v.clear(); assert!(v.is_empty());
pub fn len(&self) -> usize
1.0.0[src]
Returns the number of elements in the vector, also referred to as its 'length'.
Examples
let a = vec![1, 2, 3]; assert_eq!(a.len(), 3);
pub fn is_empty(&self) -> bool
1.0.0[src]
Returns true
if the vector contains no elements.
Examples
let mut v = Vec::new(); assert!(v.is_empty()); v.push(1); assert!(!v.is_empty());
#[must_use = "use `.truncate()` if you don't need the other half"]pub fn split_off(&mut self, at: usize) -> Vec<T, A> where
A: Clone,
1.4.0[src]
A: Clone,
Splits the collection into two at the given index.
Returns a newly allocated vector containing the elements in the range
[at, len)
. After the call, the original vector will be left containing
the elements [0, at)
with its previous capacity unchanged.
Panics
Panics if at > len
.
Examples
let mut vec = vec![1, 2, 3]; let vec2 = vec.split_off(1); assert_eq!(vec, [1]); assert_eq!(vec2, [2, 3]);
pub fn resize_with<F>(&mut self, new_len: usize, f: F) where
F: FnMut() -> T,
1.33.0[src]
F: FnMut() -> T,
Resizes the Vec
in-place so that len
is equal to new_len
.
If new_len
is greater than len
, the Vec
is extended by the
difference, with each additional slot filled with the result of
calling the closure f
. The return values from f
will end up
in the Vec
in the order they have been generated.
If new_len
is less than len
, the Vec
is simply truncated.
This method uses a closure to create new values on every push. If
you'd rather Clone
a given value, use Vec::resize
. If you
want to use the Default
trait to generate values, you can
pass Default::default
as the second argument.
Examples
let mut vec = vec![1, 2, 3]; vec.resize_with(5, Default::default); assert_eq!(vec, [1, 2, 3, 0, 0]); let mut vec = vec![]; let mut p = 1; vec.resize_with(4, || { p *= 2; p }); assert_eq!(vec, [2, 4, 8, 16]);
pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit<T>]
[src]
vec_spare_capacity
)Returns the remaining spare capacity of the vector as a slice of
MaybeUninit<T>
.
The returned slice can be used to fill the vector with data (e.g. by
reading from a file) before marking the data as initialized using the
set_len
method.
Examples
#![feature(vec_spare_capacity, maybe_uninit_extra)] // Allocate vector big enough for 10 elements. let mut v = Vec::with_capacity(10); // Fill in the first 3 elements. let uninit = v.spare_capacity_mut(); uninit[0].write(0); uninit[1].write(1); uninit[2].write(2); // Mark the first 3 elements of the vector as being initialized. unsafe { v.set_len(3); } assert_eq!(&v, &[0, 1, 2]);
pub fn resize(&mut self, new_len: usize, value: T)
1.5.0[src]
Resizes the Vec
in-place so that len
is equal to new_len
.
If new_len
is greater than len
, the Vec
is extended by the
difference, with each additional slot filled with value
.
If new_len
is less than len
, the Vec
is simply truncated.
This method requires T
to implement Clone
,
in order to be able to clone the passed value.
If you need more flexibility (or want to rely on Default
instead of
Clone
), use Vec::resize_with
.
Examples
let mut vec = vec!["hello"]; vec.resize(3, "world"); assert_eq!(vec, ["hello", "world", "world"]); let mut vec = vec![1, 2, 3, 4]; vec.resize(2, 0); assert_eq!(vec, [1, 2]);
pub fn extend_from_slice(&mut self, other: &[T])
1.6.0[src]
Clones and appends all elements in a slice to the Vec
.
Iterates over the slice other
, clones each element, and then appends
it to this Vec
. The other
vector is traversed in-order.
Note that this function is same as extend
except that it is
specialized to work with slices instead. If and when Rust gets
specialization this function will likely be deprecated (but still
available).
Examples
let mut vec = vec![1]; vec.extend_from_slice(&[2, 3, 4]); assert_eq!(vec, [1, 2, 3, 4]);
pub fn remove_item<V>(&mut self, item: &V) -> Option<T> where
T: PartialEq<V>,
[src]
T: PartialEq<V>,
Removing the first item equal to a needle is already easily possible with iterators and the current Vec methods. Furthermore, having a method for one particular case of removal (linear search, only the first item, no swap remove) but not for others is inconsistent. This method will be removed soon.
🔬 This is a nightly-only experimental API. (vec_remove_item
)
recently added
Removes the first instance of item
from the vector if the item exists.
This method will be removed soon.
pub fn splice<R, I>(
&mut self,
range: R,
replace_with: I
) -> Splice<'_, <I as IntoIterator>::IntoIter, A> where
I: IntoIterator<Item = T>,
R: RangeBounds<usize>,
1.21.0[src]
&mut self,
range: R,
replace_with: I
) -> Splice<'_, <I as IntoIterator>::IntoIter, A> where
I: IntoIterator<Item = T>,
R: RangeBounds<usize>,
Creates a splicing iterator that replaces the specified range in the vector
with the given replace_with
iterator and yields the removed items.
replace_with
does not need to be the same length as range
.
range
is removed even if the iterator is not consumed until the end.
It is unspecified how many elements are removed from the vector
if the Splice
value is leaked.
The input iterator replace_with
is only consumed when the Splice
value is dropped.
This is optimal if:
- The tail (elements in the vector after
range
) is empty, - or
replace_with
yields fewer elements thanrange
’s length - or the lower bound of its
size_hint()
is exact.
Otherwise, a temporary vector is allocated and the tail is moved twice.
Panics
Panics if the starting point is greater than the end point or if the end point is greater than the length of the vector.
Examples
let mut v = vec![1, 2, 3]; let new = [7, 8]; let u: Vec<_> = v.splice(..2, new.iter().cloned()).collect(); assert_eq!(v, &[7, 8, 3]); assert_eq!(u, &[1, 2]);
pub fn drain_filter<F>(&mut self, filter: F) -> DrainFilter<'_, T, F, A> where
F: FnMut(&mut T) -> bool,
[src]
F: FnMut(&mut T) -> bool,
🔬 This is a nightly-only experimental API. (drain_filter
)
recently added
Creates an iterator which uses a closure to determine if an element should be removed.
If the closure returns true, then the element is removed and yielded. If the closure returns false, the element will remain in the vector and will not be yielded by the iterator.
Using this method is equivalent to the following code:
let mut i = 0; while i != vec.len() { if some_predicate(&mut vec[i]) { let val = vec.remove(i); // your code here } else { i += 1; } }
But drain_filter
is easier to use. drain_filter
is also more efficient,
because it can backshift the elements of the array in bulk.
Note that drain_filter
also lets you mutate every element in the filter closure,
regardless of whether you choose to keep or remove it.
Examples
Splitting an array into evens and odds, reusing the original allocation:
#![feature(drain_filter)] let mut numbers = vec![1, 2, 3, 4, 5, 6, 8, 9, 11, 13, 14, 15]; let evens = numbers.drain_filter(|x| *x % 2 == 0).collect::<Vec<_>>(); let odds = numbers; assert_eq!(evens, vec![2, 4, 6, 8, 14]); assert_eq!(odds, vec![1, 3, 5, 9, 11, 13, 15]);
Trait Implementations
impl<P, C, S> Clone for Shell<P, C, S>
[src]
impl<P: Debug, C: Debug, S: Debug> Debug for Shell<P, C, S>
[src]
impl<P, C, S> Deref for Shell<P, C, S>
[src]
type Target = Vec<Face<P, C, S>>
The resulting type after dereferencing.
pub fn deref(&self) -> &Vec<Face<P, C, S>>
[src]
impl<P, C, S> DerefMut for Shell<P, C, S>
[src]
impl<P: Eq, C: Eq, S: Eq> Eq for Shell<P, C, S>
[src]
impl<P, C, S> From<Shell<P, C, S>> for Vec<Face<P, C, S>>
[src]
impl<P, C, S> From<Vec<Face<P, C, S>, Global>> for Shell<P, C, S>
[src]
impl<P, C, S> FromIterator<Face<P, C, S>> for Shell<P, C, S>
[src]
pub fn from_iter<I: IntoIterator<Item = Face<P, C, S>>>(
iter: I
) -> Shell<P, C, S>
[src]
iter: I
) -> Shell<P, C, S>
impl<P, C, S> IntoIterator for Shell<P, C, S>
[src]
type Item = Face<P, C, S>
The type of the elements being iterated over.
type IntoIter = IntoIter<Face<P, C, S>>
Which kind of iterator are we turning this into?
pub fn into_iter(self) -> Self::IntoIter
[src]
impl<'a, P, C, S> IntoIterator for &'a Shell<P, C, S>
[src]
type Item = &'a Face<P, C, S>
The type of the elements being iterated over.
type IntoIter = Iter<'a, Face<P, C, S>>
Which kind of iterator are we turning this into?
pub fn into_iter(self) -> Self::IntoIter
[src]
impl<P: PartialEq, C: PartialEq, S: PartialEq> PartialEq<Shell<P, C, S>> for Shell<P, C, S>
[src]
pub fn eq(&self, other: &Shell<P, C, S>) -> bool
[src]
pub fn ne(&self, other: &Shell<P, C, S>) -> bool
[src]
impl<P, C, S> StructuralEq for Shell<P, C, S>
[src]
impl<P, C, S> StructuralPartialEq for Shell<P, C, S>
[src]
Auto Trait Implementations
impl<P, C, S> RefUnwindSafe for Shell<P, C, S>
[src]
impl<P, C, S> Send for Shell<P, C, S> where
C: Send,
P: Send,
S: Send,
[src]
C: Send,
P: Send,
S: Send,
impl<P, C, S> Sync for Shell<P, C, S> where
C: Send,
P: Send,
S: Send,
[src]
C: Send,
P: Send,
S: Send,
impl<P, C, S> Unpin for Shell<P, C, S>
[src]
impl<P, C, S> UnwindSafe for Shell<P, C, S>
[src]
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,