pub struct Array<T: HasAfEnum> { /* private fields */ }
Expand description
A multidimensional data container
Currently, Array objects can store only data until four dimensions
§Sharing Across Threads
While sharing an Array with other threads, there is no need to wrap this in an Arc object unless only one such object is required to exist. The reason being that ArrayFire’s internal Array is appropriately reference counted in thread safe manner. However, if you need to modify Array object, then please do wrap the object using a Mutex or Read-Write lock.
Examples on how to share Array across threads is illustrated in our book
§NOTE
All operators(traits) from std::ops module implemented for Array object
carry out element wise operations. For example, *
does multiplication of
elements at corresponding locations in two different Arrays.
Implementations§
Source§impl<T> Array<T>where
T: HasAfEnum,
impl<T> Array<T>where
T: HasAfEnum,
Sourcepub fn new(slice: &[T], dims: Dim4) -> Self
pub fn new(slice: &[T], dims: Dim4) -> Self
Constructs a new Array object
§Examples
An example of creating an Array from f32 array
use arrayfire::{Array, Dim4, print};
let values: [f32; 3] = [1.0, 2.0, 3.0];
let indices = Array::new(&values, Dim4::new(&[3, 1, 1, 1]));
print(&indices);
An example of creating an Array from half::f16 array
use arrayfire::{Array, Dim4, is_half_available, print};
use half::f16;
let values: [f32; 3] = [1.0, 2.0, 3.0];
if is_half_available(0) { // Default device is 0, hence the argument
let half_values = values.iter().map(|&x| f16::from_f32(x)).collect::<Vec<_>>();
let hvals = Array::new(&half_values, Dim4::new(&[3, 1, 1, 1]));
print(&hvals);
} else {
println!("Half support isn't available on this device");
}
Sourcepub fn new_strided(slice: &[T], offset: i64, dims: Dim4, strides: Dim4) -> Self
pub fn new_strided(slice: &[T], offset: i64, dims: Dim4, strides: Dim4) -> Self
Constructs a new Array object from strided data
The data pointed by the slice passed to this function can possibily be offseted using an additional offset
parameter.
Sourcepub fn new_empty(dims: Dim4) -> Self
pub fn new_empty(dims: Dim4) -> Self
Constructs a new Array object of specified dimensions and type
§Examples
use arrayfire::{Array, Dim4};
let garbage_vals = Array::<f32>::new_empty(Dim4::new(&[3, 1, 1, 1]));
Sourcepub fn new_from_device_ptr(dev_ptr: *mut T, dims: Dim4) -> Self
pub fn new_from_device_ptr(dev_ptr: *mut T, dims: Dim4) -> Self
Constructs a new Array object from device pointer
The example show cases the usage using CUDA API, but usage of this function will be similar in CPU and OpenCL backends also. In the case of OpenCL backend, the pointer would be cl_mem. A short example of how to create an Array from device pointer is shown below but for detailed set of examples, please check out the tutorial book pages:
§Examples
An example of creating an Array device pointer using
rustacuda crate. The
example has to be copied to a bin
crate with following contents in Cargo.toml
to run successfully. Note that, all required setup for rustacuda and arrayfire crate
have to completed first.
[package]
....
[dependencies]
rustacuda = "0.1"
rustacuda_derive = "0.1"
rustacuda_core = "0.1"
arrayfire = "3.7.*"
use arrayfire::*;
use rustacuda::*;
use rustacuda::prelude::*;
fn main() {
let v: Vec<_> = (0u8 .. 100).map(f32::from).collect();
rustacuda::init(CudaFlags::empty());
let device = Device::get_device(0).unwrap();
let context = Context::create_and_push(ContextFlags::MAP_HOST | ContextFlags::SCHED_AUTO,
device).unwrap();
// Approach 1
{
let mut buffer = memory::DeviceBuffer::from_slice(&v).unwrap();
let array_dptr = Array::new_from_device_ptr(
buffer.as_device_ptr().as_raw_mut(), dim4!(10, 10));
af_print!("array_dptr", &array_dptr);
array_dptr.lock(); // Needed to avoid free as arrayfire takes ownership
}
// Approach 2
{
let mut dptr: *mut f32 = std::ptr::null_mut();
unsafe {
dptr = memory::cuda_malloc::<f32>(10*10).unwrap().as_raw_mut();
}
let array_dptr = Array::new_from_device_ptr(dptr, dim4!(10, 10));
// note that values might be garbage in the memory pointed out by dptr
// in this example as it is allocated but not initialized prior to passing
// along to arrayfire::Array::new*
// After ArrayFire takes over ownership of the pointer, you can use other
// arrayfire functions as usual.
af_print!("array_dptr", &array_dptr);
}
}
Sourcepub fn get_backend(&self) -> Backend
pub fn get_backend(&self) -> Backend
Returns the backend of the Array
§Return Values
Returns an value of type Backend
which indicates which backend
was active when Array was created.
Sourcepub fn get_device_id(&self) -> i32
pub fn get_device_id(&self) -> i32
Returns the device identifier(integer) on which the Array was created
§Return Values
Return the device id on which Array was created.
Sourcepub fn host<O: HasAfEnum>(&self, data: &mut [O])
pub fn host<O: HasAfEnum>(&self, data: &mut [O])
Copies the data from the Array to the mutable slice data
§Examples
Basic case
let a:Vec<u8> = vec![0,1,2,3,4,5,6,7,8];
let b = Array::<u8>::new(&a,Dim4::new(&[3,3,1,1]));
let mut c = vec!(u8::default();b.elements());
b.host(&mut c);
assert_eq!(c,a);
Generic case
fn to_vec<T:HasAfEnum+Default+Clone>(array:&Array<T>) -> Vec<T> {
let mut vec = vec!(T::default();array.elements());
array.host(&mut vec);
return vec;
}
let a = Array::<u8>::new(&[0,1,2,3,4,5,6,7,8],Dim4::new(&[3,3,1,1]));
let b:Vec<u8> = vec![0,1,2,3,4,5,6,7,8];
assert_eq!(to_vec(&a),b);
Sourcepub fn eval(&self)
pub fn eval(&self)
Evaluates any pending lazy expressions that represent the data in the Array object
Sourcepub fn copy(&self) -> Self
pub fn copy(&self) -> Self
Makes an copy of the Array
This does a deep copy of the data into a new Array
Sourcepub fn is_complex(&self) -> bool
pub fn is_complex(&self) -> bool
Check if Array is of complex type
Sourcepub fn is_integer(&self) -> bool
pub fn is_integer(&self) -> bool
Check if Array is of integral type
Sourcepub fn is_realfloating(&self) -> bool
pub fn is_realfloating(&self) -> bool
Check if Array is floating point real(not complex) data type
Sourcepub fn is_floating(&self) -> bool
pub fn is_floating(&self) -> bool
Check if Array is floating point type, either real or complex data
Sourcepub fn is_linear(&self) -> bool
pub fn is_linear(&self) -> bool
Check if Array’s memory layout is continuous and one dimensional
Sourcepub fn is_owner(&self) -> bool
pub fn is_owner(&self) -> bool
Check if Array’s memory is owned by it and not a view of another Array
Sourcepub fn lock(&self)
pub fn lock(&self)
Lock the device buffer in the memory manager
Locked buffers are not freed by memory manager until unlock is called.
Sourcepub fn unlock(&self)
pub fn unlock(&self)
Unlock the device buffer in the memory manager
This function will give back the control over the device pointer to the memory manager.
Sourcepub unsafe fn device_ptr(&self) -> void_ptr
pub unsafe fn device_ptr(&self) -> void_ptr
Get the device pointer and lock the buffer in memory manager
The device pointer is not freed by memory manager until unlock is called.
Sourcepub fn get_allocated_bytes(&self) -> usize
pub fn get_allocated_bytes(&self) -> usize
Get the size of physical allocated bytes.
This function will return the size of the parent/owner if the current Array object is an indexed Array.
Trait Implementations§
Source§impl<'a, 'b, A, B> Add<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Add<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Add<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Add<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Add<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Add<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Add<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Add<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> AddAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> AddAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn add_assign(&mut self, rhs: Array<B>)
fn add_assign(&mut self, rhs: Array<B>)
+=
operation. Read moreSource§impl<'a, 'b, A, B> BitAnd<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> BitAnd<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitAnd<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitAnd<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitAnd<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitAnd<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitAnd<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitAnd<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitAndAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitAndAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn bitand_assign(&mut self, rhs: Array<B>)
fn bitand_assign(&mut self, rhs: Array<B>)
&=
operation. Read moreSource§impl<'a, 'b, A, B> BitOr<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> BitOr<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitOr<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitOr<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitOr<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitOr<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitOr<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitOr<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitOrAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitOrAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn bitor_assign(&mut self, rhs: Array<B>)
fn bitor_assign(&mut self, rhs: Array<B>)
|=
operation. Read moreSource§impl<'a, 'b, A, B> BitXor<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> BitXor<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitXor<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitXor<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> BitXor<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> BitXor<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitXor<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitXor<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> BitXorAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> BitXorAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn bitxor_assign(&mut self, rhs: Array<B>)
fn bitxor_assign(&mut self, rhs: Array<B>)
^=
operation. Read moreSource§impl<T> Clone for Array<T>where
T: HasAfEnum,
Returns a new Array object after incrementing the reference count of native resource
impl<T> Clone for Array<T>where
T: HasAfEnum,
Returns a new Array object after incrementing the reference count of native resource
Cloning an Array does not do a deep copy of the underlying array data. It increments the reference count of native resource and returns you the new reference in the form a new Array object.
To create a deep copy use copy()
Source§impl<T: HasAfEnum> Convertable for Array<T>
impl<T: HasAfEnum> Convertable for Array<T>
Source§impl<'a, 'b, A, B> Div<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Div<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Div<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Div<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Div<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Div<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Div<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Div<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> DivAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> DivAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn div_assign(&mut self, rhs: Array<B>)
fn div_assign(&mut self, rhs: Array<B>)
/=
operation. Read moreSource§impl<T> Indexable for Array<T>where
T: HasAfEnum + IndexableType,
Enables Array to be used to index another Array
impl<T> Indexable for Array<T>where
T: HasAfEnum + IndexableType,
Enables Array to be used to index another Array
This is used in functions index_gen and assign_gen
Source§impl<T: HasAfEnum> Into<Array<T>> for af_array
Used for creating Array object from native
resource id, an 64 bit integer
impl<T: HasAfEnum> Into<Array<T>> for af_array
Used for creating Array object from native resource id, an 64 bit integer
Source§impl<'a, 'b, A, B> Mul<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Mul<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Mul<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Mul<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Mul<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Mul<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Mul<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Mul<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> MulAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> MulAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn mul_assign(&mut self, rhs: Array<B>)
fn mul_assign(&mut self, rhs: Array<B>)
*=
operation. Read moreSource§impl<T> Neg for Array<T>where
T: Zero + ConstGenerator<OutType = T>,
Implement negation trait for Array
impl<T> Neg for Array<T>where
T: Zero + ConstGenerator<OutType = T>,
Implement negation trait for Array
Source§impl<'a, 'b, A, B> Rem<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Rem<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Rem<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Rem<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Rem<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Rem<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Rem<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Rem<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> RemAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> RemAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn rem_assign(&mut self, rhs: Array<B>)
fn rem_assign(&mut self, rhs: Array<B>)
%=
operation. Read moreSource§impl<'a, 'b, A, B> Shl<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Shl<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Shl<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Shl<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Shl<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Shl<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Shl<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Shl<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> ShlAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> ShlAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn shl_assign(&mut self, rhs: Array<B>)
fn shl_assign(&mut self, rhs: Array<B>)
<<=
operation. Read moreSource§impl<T> ShlAssign<u16> for Array<T>
impl<T> ShlAssign<u16> for Array<T>
Source§fn shl_assign(&mut self, rhs: u16)
fn shl_assign(&mut self, rhs: u16)
<<=
operation. Read moreSource§impl<T> ShlAssign<u32> for Array<T>
impl<T> ShlAssign<u32> for Array<T>
Source§fn shl_assign(&mut self, rhs: u32)
fn shl_assign(&mut self, rhs: u32)
<<=
operation. Read moreSource§impl<T> ShlAssign<u64> for Array<T>
impl<T> ShlAssign<u64> for Array<T>
Source§fn shl_assign(&mut self, rhs: u64)
fn shl_assign(&mut self, rhs: u64)
<<=
operation. Read moreSource§impl<T> ShlAssign<u8> for Array<T>
impl<T> ShlAssign<u8> for Array<T>
Source§fn shl_assign(&mut self, rhs: u8)
fn shl_assign(&mut self, rhs: u8)
<<=
operation. Read moreSource§impl<'a, 'b, A, B> Shr<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Shr<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Shr<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Shr<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Shr<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Shr<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Shr<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Shr<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> ShrAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> ShrAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn shr_assign(&mut self, rhs: Array<B>)
fn shr_assign(&mut self, rhs: Array<B>)
>>=
operation. Read moreSource§impl<T> ShrAssign<u16> for Array<T>
impl<T> ShrAssign<u16> for Array<T>
Source§fn shr_assign(&mut self, rhs: u16)
fn shr_assign(&mut self, rhs: u16)
>>=
operation. Read moreSource§impl<T> ShrAssign<u32> for Array<T>
impl<T> ShrAssign<u32> for Array<T>
Source§fn shr_assign(&mut self, rhs: u32)
fn shr_assign(&mut self, rhs: u32)
>>=
operation. Read moreSource§impl<T> ShrAssign<u64> for Array<T>
impl<T> ShrAssign<u64> for Array<T>
Source§fn shr_assign(&mut self, rhs: u64)
fn shr_assign(&mut self, rhs: u64)
>>=
operation. Read moreSource§impl<T> ShrAssign<u8> for Array<T>
impl<T> ShrAssign<u8> for Array<T>
Source§fn shr_assign(&mut self, rhs: u8)
fn shr_assign(&mut self, rhs: u8)
>>=
operation. Read moreSource§impl<'a, 'b, A, B> Sub<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, 'b, A, B> Sub<&'a Array<B>> for &'b Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Sub<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Sub<&'a Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<'a, A, B> Sub<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<'a, A, B> Sub<Array<B>> for &'a Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> Sub<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> Sub<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§impl<A, B> SubAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
impl<A, B> SubAssign<Array<B>> for Array<A>where
A: ImplicitPromote<B>,
B: ImplicitPromote<A>,
Source§fn sub_assign(&mut self, rhs: Array<B>)
fn sub_assign(&mut self, rhs: Array<B>)
-=
operation. Read moreimpl<T: HasAfEnum> Send for Array<T>
Enable safely moving Array objects across threads