pub struct BufferHandle(/* private fields */);Expand description
A handle to a buffer allocation.
There are two kinds of buffer allocations supported:
- host allocations, which were allocated by the global allocator and reside in main memory
- device allocations, which are remote to the CPU and live on a GPU or other external device.
A device allocation can be copied to the host, yielding a new ByteBuffer containing the
copied data. Copying can fail at runtime, error recovery is system-dependent.
Implementations§
Source§impl BufferHandle
impl BufferHandle
Sourcepub fn new_host(byte_buffer: ByteBuffer) -> Self
pub fn new_host(byte_buffer: ByteBuffer) -> Self
Create a new handle to a host ByteBuffer.
Sourcepub fn new_device(device: Arc<dyn DeviceBuffer>) -> Self
pub fn new_device(device: Arc<dyn DeviceBuffer>) -> Self
Create a new handle to a memory allocation that exists on an external device.
Allocations on external devices are not cheaply accessible from the CPU and most be copied into new memory when we read them.
Source§impl BufferHandle
impl BufferHandle
Sourcepub fn is_on_device(&self) -> bool
pub fn is_on_device(&self) -> bool
Returns true if this buffer resides on the device (GPU).
Sourcepub fn is_on_host(&self) -> bool
pub fn is_on_host(&self) -> bool
Returns true if this buffer resides on the host (CPU).
Sourcepub fn is_aligned_to(&self, alignment: Alignment) -> bool
pub fn is_aligned_to(&self, alignment: Alignment) -> bool
Returns true if the buffer is aligned to the given alignment.
Sourcepub fn ensure_aligned(self, alignment: Alignment) -> VortexResult<Self>
pub fn ensure_aligned(self, alignment: Alignment) -> VortexResult<Self>
Ensure the buffer satisfies the requested alignment.
Both host and device buffers will be copied if necessary to satisfy the alignment.
Sourcepub fn slice(&self, range: Range<usize>) -> Self
pub fn slice(&self, range: Range<usize>) -> Self
Creates a new handle to a subrange of memory at the given bind range.
§Example
let handle1 = BufferHandle::new_host(buffer![1u8,2,3,4]);
let handle2 = handle1.slice(1..4);
assert_eq!(handle2.unwrap_host(), buffer![2u8,3,4]);Sourcepub fn slice_typed<T: Sized>(&self, range: Range<usize>) -> Self
pub fn slice_typed<T: Sized>(&self, range: Range<usize>) -> Self
Reinterpret the pointee as a buffer of T and slice the provided element range.
§Example
let values = buffer![1u32, 2u32, 3u32, 4u32];
let handle = BufferHandle::new_host(values.into_byte_buffer());
let sliced = handle.slice_typed::<u32>(1..4);
let result = Buffer::<u32>::from_byte_buffer(sliced.to_host_sync());
assert_eq!(result, buffer![2, 3, 4]);Sourcepub fn unwrap_host(self) -> ByteBuffer
pub fn unwrap_host(self) -> ByteBuffer
Sourcepub fn unwrap_device(self) -> Arc<dyn DeviceBuffer>
pub fn unwrap_device(self) -> Arc<dyn DeviceBuffer>
Sourcepub fn as_host_opt(&self) -> Option<&ByteBuffer>
pub fn as_host_opt(&self) -> Option<&ByteBuffer>
Downcast this handle as a handle to a host-resident buffer, or None.
Sourcepub fn as_device_opt(&self) -> Option<&Arc<dyn DeviceBuffer>>
pub fn as_device_opt(&self) -> Option<&Arc<dyn DeviceBuffer>>
Downcast this handle as a handle to a device buffer, or None.
Sourcepub fn as_host(&self) -> &ByteBuffer
pub fn as_host(&self) -> &ByteBuffer
A version of as_host_opt that panics if the allocation is
not a host allocation.
Sourcepub fn as_device(&self) -> &Arc<dyn DeviceBuffer>
pub fn as_device(&self) -> &Arc<dyn DeviceBuffer>
A version of as_device_opt that panics if the allocation is
not a device allocation.
Sourcepub fn to_host_sync(&self) -> ByteBuffer
pub fn to_host_sync(&self) -> ByteBuffer
Returns a host-resident copy of the data in the buffer.
If the data was already host-resident, this is trivial.
If the data was device-resident, data will be copied from the device to a new allocation on the host.
§Panics
This function will never panic if the data is already host-resident.
For a device-resident handle, any errors triggered by the copying from device to host will result in a panic.
See also: try_to_host.
Sourcepub fn into_host_sync(self) -> ByteBuffer
pub fn into_host_sync(self) -> ByteBuffer
Sourcepub fn try_to_host_sync(&self) -> VortexResult<ByteBuffer>
pub fn try_to_host_sync(&self) -> VortexResult<ByteBuffer>
Attempts to load this buffer into a host-resident allocation.
If the allocation is already host-resident, this trivially completes with success.
If it is a device allocation, then this issues an operation that attempts to copy the data from the device into a host-resident buffer, and returns a handle to that buffer.
Sourcepub fn try_into_host_sync(self) -> VortexResult<ByteBuffer>
pub fn try_into_host_sync(self) -> VortexResult<ByteBuffer>
Attempts to load this buffer into a host-resident allocation, consuming the handle.
See also try_to_host.
Sourcepub fn try_to_host(
&self,
) -> VortexResult<BoxFuture<'static, VortexResult<ByteBuffer>>>
pub fn try_to_host( &self, ) -> VortexResult<BoxFuture<'static, VortexResult<ByteBuffer>>>
Sourcepub fn try_into_host(
self,
) -> VortexResult<BoxFuture<'static, VortexResult<ByteBuffer>>>
pub fn try_into_host( self, ) -> VortexResult<BoxFuture<'static, VortexResult<ByteBuffer>>>
Sourcepub fn to_host(&self) -> BoxFuture<'static, ByteBuffer>
pub fn to_host(&self) -> BoxFuture<'static, ByteBuffer>
Asynchronously copies the buffer to the host.
§Panics
Any errors triggered by the copying from device to host will result in a panic.
Sourcepub fn into_host(self) -> BoxFuture<'static, ByteBuffer>
pub fn into_host(self) -> BoxFuture<'static, ByteBuffer>
Asynchronously copies the buffer to the host, consuming the handle.
§Panics
Any errors triggered by the copying from device to host will result in a panic.
Trait Implementations§
Source§impl ArrayEq for BufferHandle
impl ArrayEq for BufferHandle
Source§impl ArrayHash for BufferHandle
impl ArrayHash for BufferHandle
Source§impl Clone for BufferHandle
impl Clone for BufferHandle
Source§fn clone(&self) -> BufferHandle
fn clone(&self) -> BufferHandle
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BufferHandle
impl Debug for BufferHandle
Source§impl TryFrom<BufferHandle> for ArrayParts
impl TryFrom<BufferHandle> for ArrayParts
Source§type Error = VortexError
type Error = VortexError
Auto Trait Implementations§
impl !Freeze for BufferHandle
impl !RefUnwindSafe for BufferHandle
impl Send for BufferHandle
impl Sync for BufferHandle
impl Unpin for BufferHandle
impl UnsafeUnpin for BufferHandle
impl !UnwindSafe for BufferHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> DynArrayEq for Twhere
T: ArrayEq + 'static,
impl<T> DynArrayEq for Twhere
T: ArrayEq + 'static,
Source§impl<T> DynArrayHash for T
impl<T> DynArrayHash for T
fn dyn_array_hash(&self, state: &mut dyn Hasher, precision: Precision)
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> SessionVar for T
impl<T> SessionVar for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.