pub struct CudaExecSession<'a> { /* private fields */ }Expand description
Borrowed CUDA execution capability.
This is the single public execution-authority boundary for CUDA kernel
extensions (issue #1597). External operation crates obtain it through
with_cuda_exec_session and then borrow backend/device-scoped extension
sessions via CudaExecSession::with_cubecl and
CudaExecSession::with_raw.
The session is not constructible by users and is !Send + !Sync: it
carries thread-local execution capability. Success of an enrolled operation
means the work was enqueued; only CudaExecSession::synchronize is a
host barrier.
Implementations§
Source§impl CudaExecSession<'_>
impl CudaExecSession<'_>
Sourcepub fn runtime(&self) -> &CudaRuntime
pub fn runtime(&self) -> &CudaRuntime
Borrow the provider runtime without exposing the backend.
Sourcepub fn runtime_identity(&self) -> CudaRuntimeIdentity
pub fn runtime_identity(&self) -> CudaRuntimeIdentity
Return the identity of the borrowed provider runtime.
Sourcepub fn supports(&self, capability: GpuExtensionCapability) -> bool
pub fn supports(&self, capability: GpuExtensionCapability) -> bool
Report whether this session supports a GPU extension capability.
§Examples
use tenferro_gpu::cuda::{CudaExecSession, GpuExtensionCapability};
// Method-call check only: `CudaExecSession` is not user-constructible, so
// the example asserts the method is callable from an external crate.
fn check(session: &CudaExecSession<'_>, capability: GpuExtensionCapability) -> bool {
session.supports(capability)
}
let _ = check;Sourcepub fn device_info(&self) -> &CudaDeviceInfo
pub fn device_info(&self) -> &CudaDeviceInfo
Borrow immutable metadata for the session’s device.
§Examples
use tenferro_gpu::cuda::CudaExecSession;
// Method-call check only: `CudaExecSession` is not user-constructible, so
// the example asserts the method is callable from an external crate.
fn check(session: &CudaExecSession<'_>) {
let _ = session.device_info();
}
let _ = check;Sourcepub fn allocation_domain(&self) -> AllocationDomainId
pub fn allocation_domain(&self) -> AllocationDomainId
Return the allocation ownership domain of this session.
§Examples
use tenferro_gpu::cuda::CudaExecSession;
// Method-call check only: `CudaExecSession` is not user-constructible, so
// the example asserts the method is callable from an external crate.
fn check(session: &CudaExecSession<'_>) -> tenferro_tensor::AllocationDomainId {
session.allocation_domain()
}
let _ = check;Sourcepub fn ensure_gpu_resident(
&self,
input: &Tensor,
op: &'static str,
) -> Result<()>
pub fn ensure_gpu_resident( &self, input: &Tensor, op: &'static str, ) -> Result<()>
Validate that a dense GPU tensor is resident on this exact session: CubeCL-backed, same allocation domain, and placed on this runtime’s CUDA device. Rejects host tensors, foreign-backend buffers, and foreign-runtime/device tensors without an implicit transfer.
This is the credentialed public-seam residency guard for extension
crates that receive a session but must validate inputs before entering
a with_raw/with_cubecl sub-session.
§Errors
Returns crate::Error::RuntimeState when the tensor is not resident
on this exact session runtime/device.
§Examples
use tenferro_gpu::cuda::CudaExecSession;
// Method-call check only: `CudaExecSession` is not user-constructible.
fn check(session: &CudaExecSession<'_>, tensor: &tenferro_tensor::Tensor) -> tenferro_tensor::Result<()> {
session.ensure_gpu_resident(tensor, "test.ensure_gpu_resident")
}
let _ = check;Sourcepub fn synchronize(&mut self) -> Result<()>
pub fn synchronize(&mut self) -> Result<()>
Block the host until work enqueued on the session’s stream completes.
This is the only host barrier on the success path; ordinary successful session operations only enqueue.
§Errors
Returns crate::Error::BackendSource when CUDA stream
synchronization fails.
Sourcepub fn with_raw<R>(
&mut self,
op: &'static str,
f: impl for<'s> FnOnce(&mut Session<'s>) -> Result<R>,
) -> Result<R>
pub fn with_raw<R>( &mut self, op: &'static str, f: impl for<'s> FnOnce(&mut Session<'s>) -> Result<R>, ) -> Result<R>
Borrow the type-safe raw CUDA extension session for one operation.
The enter/exit protocol is fully contained in this call: a definite
CubeCL stream is captured on the current thread, pending CubeCL work is
flushed, the calling thread’s previous device/context is saved, the
tenferro primary context is activated, the callback runs, and the
previous device/context is best-effort restored on return, Err, or
unwind (restoration failures are logged to stderr). The success path
does not synchronize.
§Errors
Returns crate::Error::BackendSource when CubeCL cannot expose or
flush the stream, or when the CUDA context cannot be entered. Context
restoration on exit is best-effort: a failure to restore the caller’s
previous device/context is logged to stderr rather than propagated, so
a callback result is never replaced by a restore error.
§Examples
use tenferro_gpu::cuda::CudaExecSession;
// Method-call check only: `CudaExecSession` is not user-constructible.
fn check(session: &mut CudaExecSession<'_>) -> tenferro_tensor::Result<()> {
session.with_raw("test.raw", |raw| {
let _ = raw.stream();
Ok(SessionOutcome::Done)
})?;
Ok(())
}
enum SessionOutcome { Done }
let _ = check;Sourcepub fn with_cubecl<R>(
&mut self,
op: &'static str,
f: impl for<'s> FnOnce(&Session<'s>) -> Result<R>,
) -> Result<R>
pub fn with_cubecl<R>( &mut self, op: &'static str, f: impl for<'s> FnOnce(&Session<'s>) -> Result<R>, ) -> Result<R>
Borrow the public tenferro-wide CubeCL session for one operation.
The session exposes the exact tenferro CubeCL client bound to this
runtime. Pending CubeCL work is flushed before entering and again on
exit (including Err and unwind) so a later raw-session or host read
observes the enqueued work. The success path does not synchronize.
§Examples
use tenferro_gpu::cuda::CudaExecSession;
fn check(session: &mut CudaExecSession<'_>) {
let _ = session.with_cubecl("test.cubecl", |_cubecl| Ok(()));
}
let _ = check;§Errors
Returns the callback’s error, or crate::Error::BackendSource when
pending CubeCL work cannot be flushed on entry or exit.
Trait Implementations§
Source§impl BackendSession for CudaExecSession<'_>
impl BackendSession for CudaExecSession<'_>
Source§fn vdot_read(
&mut self,
_lhs: TensorRead<'_>,
_rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn vdot_read( &mut self, _lhs: TensorRead<'_>, _rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn norm_squared_read(&mut self, _input: TensorRead<'_>) -> Result<Tensor, Error>
fn norm_squared_read(&mut self, _input: TensorRead<'_>) -> Result<Tensor, Error>
Source§fn axpby_read_into_accum(
&mut self,
_alpha: ContractionScalar,
_x: TensorRead<'_>,
_beta: ContractionScalar,
_y: TensorWrite<'_>,
) -> Result<(), Error>
fn axpby_read_into_accum( &mut self, _alpha: ContractionScalar, _x: TensorRead<'_>, _beta: ContractionScalar, _y: TensorWrite<'_>, ) -> Result<(), Error>
y <- alpha * x + beta * y in one pass into caller-owned storage. Read moreSource§impl<'a> Debug for CudaExecSession<'a>
impl<'a> Debug for CudaExecSession<'a>
Source§impl SessionCachedDot for CudaExecSession<'_>
impl SessionCachedDot for CudaExecSession<'_>
Source§fn dot_general_read_into_accum_cached(
&mut self,
cache_slot: Option<usize>,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
config: &DotGeneralConfig,
accumulation: DotGeneralAccumulation,
out: TensorWrite<'_>,
) -> Result<()>
fn dot_general_read_into_accum_cached( &mut self, cache_slot: Option<usize>, lhs: TensorRead<'_>, rhs: TensorRead<'_>, config: &DotGeneralConfig, accumulation: DotGeneralAccumulation, out: TensorWrite<'_>, ) -> Result<()>
Source§impl TensorAnalytic for CudaExecSession<'_>
impl TensorAnalytic for CudaExecSession<'_>
Source§fn rsqrt_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
fn rsqrt_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
Source§fn pow_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn pow_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn expm1_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
fn expm1_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
Source§fn log1p_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
fn log1p_read(&mut self, input: TensorRead<'_>) -> Result<Tensor, Error>
Source§impl TensorBuffer for CudaExecSession<'_>
impl TensorBuffer for CudaExecSession<'_>
fn reclaim_buffer(&mut self, tensor: Tensor)
Source§impl TensorDeviceTransfer for CudaExecSession<'_>
impl TensorDeviceTransfer for CudaExecSession<'_>
Source§fn download_to_host(&mut self, tensor: TensorRead<'_>) -> Result<Tensor>
fn download_to_host(&mut self, tensor: TensorRead<'_>) -> Result<Tensor>
Source§fn upload_host_tensor(&mut self, tensor: TensorRead<'_>) -> Result<Tensor>
fn upload_host_tensor(&mut self, tensor: TensorRead<'_>) -> Result<Tensor>
Source§impl TensorDot for CudaExecSession<'_>
impl TensorDot for CudaExecSession<'_>
Source§fn dot_general(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
config: &DotGeneralConfig,
) -> Result<Tensor>
fn dot_general( &mut self, lhs: &Tensor, rhs: &Tensor, config: &DotGeneralConfig, ) -> Result<Tensor>
Source§fn dot_general_read_into_accum(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
config: &DotGeneralConfig,
accumulation: DotGeneralAccumulation,
out: TensorWrite<'_>,
) -> Result<()>
fn dot_general_read_into_accum( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, config: &DotGeneralConfig, accumulation: DotGeneralAccumulation, out: TensorWrite<'_>, ) -> Result<()>
Source§fn dot_general_read_into(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
config: &DotGeneralConfig,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn dot_general_read_into( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, config: &DotGeneralConfig, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§impl TensorElementwise for CudaExecSession<'_>
impl TensorElementwise for CudaExecSession<'_>
Source§fn rem(&mut self, lhs: &Tensor, rhs: &Tensor) -> Result<Tensor>
fn rem(&mut self, lhs: &Tensor, rhs: &Tensor) -> Result<Tensor>
Source§fn compare(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
dir: &CompareDir,
) -> Result<Tensor>
fn compare( &mut self, lhs: &Tensor, rhs: &Tensor, dir: &CompareDir, ) -> Result<Tensor>
Source§fn select(
&mut self,
pred: &Tensor,
on_true: &Tensor,
on_false: &Tensor,
) -> Result<Tensor>
fn select( &mut self, pred: &Tensor, on_true: &Tensor, on_false: &Tensor, ) -> Result<Tensor>
Source§fn clamp(
&mut self,
input: &Tensor,
lower: &Tensor,
upper: &Tensor,
) -> Result<Tensor>
fn clamp( &mut self, input: &Tensor, lower: &Tensor, upper: &Tensor, ) -> Result<Tensor>
Source§fn elementwise_read_into(
&mut self,
op: ElementwiseReadOp,
inputs: &[TensorRead<'_>],
out: TensorWrite<'_>,
) -> Result<(), Error>
fn elementwise_read_into( &mut self, op: ElementwiseReadOp, inputs: &[TensorRead<'_>], out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn add_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn add_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn add_into(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn add_into( &mut self, lhs: &Tensor, rhs: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn add_read_into(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn add_read_into( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn sub_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn sub_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn sub_into(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn sub_into( &mut self, lhs: &Tensor, rhs: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn sub_read_into(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn sub_read_into( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn mul_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn mul_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn mul_into(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn mul_into( &mut self, lhs: &Tensor, rhs: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn mul_read_into(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn mul_read_into( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn neg_into(
&mut self,
input: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn neg_into( &mut self, input: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn neg_read_into(
&mut self,
input: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn neg_read_into( &mut self, input: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn conj_into(
&mut self,
input: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn conj_into( &mut self, input: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn conj_read_into(
&mut self,
input: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn conj_read_into( &mut self, input: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn div_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn div_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn div_into(
&mut self,
lhs: &Tensor,
rhs: &Tensor,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn div_into( &mut self, lhs: &Tensor, rhs: &Tensor, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn div_read_into(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
out: TensorWrite<'_>,
) -> Result<(), Error>
fn div_read_into( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, out: TensorWrite<'_>, ) -> Result<(), Error>
Source§fn rem_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn rem_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn maximum_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn maximum_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn minimum_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
) -> Result<Tensor, Error>
fn minimum_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn compare_read(
&mut self,
lhs: TensorRead<'_>,
rhs: TensorRead<'_>,
dir: &CompareDir,
) -> Result<Tensor, Error>
fn compare_read( &mut self, lhs: TensorRead<'_>, rhs: TensorRead<'_>, dir: &CompareDir, ) -> Result<Tensor, Error>
Source§fn select_read(
&mut self,
pred: TensorRead<'_>,
on_true: TensorRead<'_>,
on_false: TensorRead<'_>,
) -> Result<Tensor, Error>
fn select_read( &mut self, pred: TensorRead<'_>, on_true: TensorRead<'_>, on_false: TensorRead<'_>, ) -> Result<Tensor, Error>
Source§fn clamp_read(
&mut self,
input: TensorRead<'_>,
lower: TensorRead<'_>,
upper: TensorRead<'_>,
) -> Result<Tensor, Error>
fn clamp_read( &mut self, input: TensorRead<'_>, lower: TensorRead<'_>, upper: TensorRead<'_>, ) -> Result<Tensor, Error>
impl TensorFusion for CudaExecSession<'_>
Source§impl TensorIndexing for CudaExecSession<'_>
impl TensorIndexing for CudaExecSession<'_>
Source§fn gather(
&mut self,
operand: &Tensor,
start_indices: &Tensor,
config: &GatherConfig,
) -> Result<Tensor>
fn gather( &mut self, operand: &Tensor, start_indices: &Tensor, config: &GatherConfig, ) -> Result<Tensor>
Source§fn scatter(
&mut self,
operand: &Tensor,
scatter_indices: &Tensor,
updates: &Tensor,
config: &ScatterConfig,
) -> Result<Tensor>
fn scatter( &mut self, operand: &Tensor, scatter_indices: &Tensor, updates: &Tensor, config: &ScatterConfig, ) -> Result<Tensor>
Source§fn dynamic_slice(
&mut self,
input: &Tensor,
starts: &Tensor,
slice_sizes: &[usize],
) -> Result<Tensor>
fn dynamic_slice( &mut self, input: &Tensor, starts: &Tensor, slice_sizes: &[usize], ) -> Result<Tensor>
Source§impl TensorReduction for CudaExecSession<'_>
impl TensorReduction for CudaExecSession<'_>
Source§fn reduce_sum_read(
&mut self,
input: TensorRead<'_>,
axes: &[usize],
) -> Result<Tensor, Error>
fn reduce_sum_read( &mut self, input: TensorRead<'_>, axes: &[usize], ) -> Result<Tensor, Error>
Source§fn reduce_prod_read(
&mut self,
input: TensorRead<'_>,
axes: &[usize],
) -> Result<Tensor, Error>
fn reduce_prod_read( &mut self, input: TensorRead<'_>, axes: &[usize], ) -> Result<Tensor, Error>
Source§fn reduce_max_read(
&mut self,
input: TensorRead<'_>,
axes: &[usize],
) -> Result<Tensor, Error>
fn reduce_max_read( &mut self, input: TensorRead<'_>, axes: &[usize], ) -> Result<Tensor, Error>
Source§fn reduce_min_read(
&mut self,
input: TensorRead<'_>,
axes: &[usize],
) -> Result<Tensor, Error>
fn reduce_min_read( &mut self, input: TensorRead<'_>, axes: &[usize], ) -> Result<Tensor, Error>
Source§impl TensorStructural for CudaExecSession<'_>
impl TensorStructural for CudaExecSession<'_>
Source§fn to_contiguous_read(&mut self, input: TensorRead<'_>) -> Result<Tensor>
fn to_contiguous_read(&mut self, input: TensorRead<'_>) -> Result<Tensor>
Source§fn copy_read_into(
&mut self,
src: TensorRead<'_>,
dst: TensorWrite<'_>,
) -> Result<()>
fn copy_read_into( &mut self, src: TensorRead<'_>, dst: TensorWrite<'_>, ) -> Result<()>
Source§fn broadcast_in_dim(
&mut self,
input: &Tensor,
shape: &[usize],
dims: &[usize],
) -> Result<Tensor>
fn broadcast_in_dim( &mut self, input: &Tensor, shape: &[usize], dims: &[usize], ) -> Result<Tensor>
Source§fn cast(&mut self, input: &Tensor, to: DType) -> Result<Tensor>
fn cast(&mut self, input: &Tensor, to: DType) -> Result<Tensor>
Source§fn extract_diagonal(
&mut self,
input: &Tensor,
axis_a: usize,
axis_b: usize,
) -> Result<Tensor>
fn extract_diagonal( &mut self, input: &Tensor, axis_a: usize, axis_b: usize, ) -> Result<Tensor>
Source§fn embed_diagonal(
&mut self,
input: &Tensor,
axis_a: usize,
axis_b: usize,
) -> Result<Tensor>
fn embed_diagonal( &mut self, input: &Tensor, axis_a: usize, axis_b: usize, ) -> Result<Tensor>
Source§fn transpose_read(
&mut self,
input: TensorRead<'_>,
perm: &[usize],
) -> Result<Tensor, Error>
fn transpose_read( &mut self, input: TensorRead<'_>, perm: &[usize], ) -> Result<Tensor, Error>
Source§fn reshape_read(
&mut self,
input: TensorRead<'_>,
shape: &[usize],
) -> Result<Tensor, Error>
fn reshape_read( &mut self, input: TensorRead<'_>, shape: &[usize], ) -> Result<Tensor, Error>
Source§fn broadcast_in_dim_read(
&mut self,
input: TensorRead<'_>,
shape: &[usize],
dims: &[usize],
) -> Result<Tensor, Error>
fn broadcast_in_dim_read( &mut self, input: TensorRead<'_>, shape: &[usize], dims: &[usize], ) -> Result<Tensor, Error>
Auto Trait Implementations§
impl<'a> !RefUnwindSafe for CudaExecSession<'a>
impl<'a> !Send for CudaExecSession<'a>
impl<'a> !Sync for CudaExecSession<'a>
impl<'a> !UnwindSafe for CudaExecSession<'a>
impl<'a> Freeze for CudaExecSession<'a>
impl<'a> Unpin for CudaExecSession<'a>
impl<'a> UnsafeUnpin for CudaExecSession<'a>
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<S> FaerParallelismExt for Swhere
S: BackendSession + ?Sized,
impl<S> FaerParallelismExt for Swhere
S: BackendSession + ?Sized,
impl<T, U> Imply<T> for U
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 more