[][src]Struct truck_topology::Shell

pub struct Shell<P, C, S> { /* fields omitted */ }

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) -> usize1.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]

🔬 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 T1.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 T1.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]

🔬 This is a nightly-only experimental API. (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 to capacity().
  • 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) -> T1.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) -> T1.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]

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]

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]

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]

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) -> usize1.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) -> bool1.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]

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]

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]

🔬 This is a nightly-only experimental API. (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 dedup(&mut self)1.0.0[src]

Removes consecutive repeated elements in the vector according to the PartialEq trait implementation.

If the vector is sorted, this removes all duplicates.

Examples

let mut vec = vec![1, 2, 2, 3, 2];

vec.dedup();

assert_eq!(vec, [1, 2, 3, 2]);

pub fn remove_item<V>(&mut self, item: &V) -> Option<T> where
    T: PartialEq<V>, 
[src]

👎 Deprecated since 1.46.0:

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]

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 than range’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]

🔬 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.

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]

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?

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?

impl<P: PartialEq, C: PartialEq, S: PartialEq> PartialEq<Shell<P, C, S>> for Shell<P, C, S>[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]

impl<P, C, S> Sync for Shell<P, C, S> where
    C: Send,
    P: Send,
    S: Send
[src]

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]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.