use crate::enums::MeasurementUnit;
use crate::HostTypes;
pub trait AddressRegion<H: HostTypes> {
type RegionBound: RegionBound<H>;
fn region_bound(&self) -> &Self::RegionBound;
type LocalityMetric: LocalityMetric<H>;
fn locality_metric(&self) -> &Self::LocalityMetric;
fn region_cardinality(&self) -> u64;
}
pub trait RegionBound<H: HostTypes> {
type Element: crate::kernel::address::Element<H>;
fn region_lower(&self) -> &Self::Element;
fn region_upper(&self) -> &Self::Element;
}
pub trait LocalityMetric<H: HostTypes>: crate::bridge::observable::MetricObservable<H> {}
pub trait WorkingSet<H: HostTypes> {
type AddressRegion: AddressRegion<H>;
fn working_set_regions(&self) -> &[Self::AddressRegion];
type ReductionStep: crate::kernel::reduction::ReductionStep<H>;
fn working_set_stage(&self) -> &Self::ReductionStep;
type TypeDefinition: crate::user::type_::TypeDefinition<H>;
fn working_set_type(&self) -> &Self::TypeDefinition;
fn working_set_size(&self) -> u64;
}
pub trait RegionAllocation<H: HostTypes> {
type ReductionStep: crate::kernel::reduction::ReductionStep<H>;
fn allocation_stage(&self) -> &[Self::ReductionStep];
type WorkingSet: WorkingSet<H>;
fn allocation_working_set(&self) -> &[Self::WorkingSet];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullAddressRegion<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullAddressRegion<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullAddressRegion<H> {
pub const ABSENT: NullAddressRegion<H> = NullAddressRegion {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> AddressRegion<H> for NullAddressRegion<H> {
type RegionBound = NullRegionBound<H>;
fn region_bound(&self) -> &Self::RegionBound {
&<NullRegionBound<H>>::ABSENT
}
type LocalityMetric = NullLocalityMetric<H>;
fn locality_metric(&self) -> &Self::LocalityMetric {
&<NullLocalityMetric<H>>::ABSENT
}
fn region_cardinality(&self) -> u64 {
0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullRegionBound<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullRegionBound<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullRegionBound<H> {
pub const ABSENT: NullRegionBound<H> = NullRegionBound {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> RegionBound<H> for NullRegionBound<H> {
type Element = crate::kernel::address::NullElement<H>;
fn region_lower(&self) -> &Self::Element {
&<crate::kernel::address::NullElement<H>>::ABSENT
}
fn region_upper(&self) -> &Self::Element {
&<crate::kernel::address::NullElement<H>>::ABSENT
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullLocalityMetric<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullLocalityMetric<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullLocalityMetric<H> {
pub const ABSENT: NullLocalityMetric<H> = NullLocalityMetric {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> crate::bridge::observable::Observable<H> for NullLocalityMetric<H> {
fn value(&self) -> H::Decimal {
H::EMPTY_DECIMAL
}
fn source(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
fn target(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
fn has_unit(&self) -> MeasurementUnit {
<MeasurementUnit>::default()
}
}
impl<H: HostTypes> crate::bridge::observable::MetricObservable<H> for NullLocalityMetric<H> {}
impl<H: HostTypes> LocalityMetric<H> for NullLocalityMetric<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullWorkingSet<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullWorkingSet<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullWorkingSet<H> {
pub const ABSENT: NullWorkingSet<H> = NullWorkingSet {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> WorkingSet<H> for NullWorkingSet<H> {
type AddressRegion = NullAddressRegion<H>;
fn working_set_regions(&self) -> &[Self::AddressRegion] {
&[]
}
type ReductionStep = crate::kernel::reduction::NullReductionStep<H>;
fn working_set_stage(&self) -> &Self::ReductionStep {
&<crate::kernel::reduction::NullReductionStep<H>>::ABSENT
}
type TypeDefinition = crate::user::type_::NullTypeDefinition<H>;
fn working_set_type(&self) -> &Self::TypeDefinition {
&<crate::user::type_::NullTypeDefinition<H>>::ABSENT
}
fn working_set_size(&self) -> u64 {
0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullRegionAllocation<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullRegionAllocation<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullRegionAllocation<H> {
pub const ABSENT: NullRegionAllocation<H> = NullRegionAllocation {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> RegionAllocation<H> for NullRegionAllocation<H> {
type ReductionStep = crate::kernel::reduction::NullReductionStep<H>;
fn allocation_stage(&self) -> &[Self::ReductionStep] {
&[]
}
type WorkingSet = NullWorkingSet<H>;
fn allocation_working_set(&self) -> &[Self::WorkingSet] {
&[]
}
}
#[derive(Debug)]
pub struct AddressRegionHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for AddressRegionHandle<H> {}
impl<H: HostTypes> Clone for AddressRegionHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for AddressRegionHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for AddressRegionHandle<H> {}
impl<H: HostTypes> core::hash::Hash for AddressRegionHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> AddressRegionHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait AddressRegionResolver<H: HostTypes> {
fn resolve(&self, handle: AddressRegionHandle<H>) -> Option<AddressRegionRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct AddressRegionRecord<H: HostTypes> {
pub region_bound_handle: RegionBoundHandle<H>,
pub locality_metric_handle: LocalityMetricHandle<H>,
pub region_cardinality: u64,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedAddressRegion<'r, R: AddressRegionResolver<H>, H: HostTypes> {
handle: AddressRegionHandle<H>,
resolver: &'r R,
record: Option<AddressRegionRecord<H>>,
}
impl<'r, R: AddressRegionResolver<H>, H: HostTypes> ResolvedAddressRegion<'r, R, H> {
#[inline]
pub fn new(handle: AddressRegionHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> AddressRegionHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&AddressRegionRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: AddressRegionResolver<H>, H: HostTypes> AddressRegion<H>
for ResolvedAddressRegion<'r, R, H>
{
type RegionBound = NullRegionBound<H>;
fn region_bound(&self) -> &Self::RegionBound {
&<NullRegionBound<H>>::ABSENT
}
type LocalityMetric = NullLocalityMetric<H>;
fn locality_metric(&self) -> &Self::LocalityMetric {
&<NullLocalityMetric<H>>::ABSENT
}
fn region_cardinality(&self) -> u64 {
match &self.record {
Some(r) => r.region_cardinality,
None => 0,
}
}
}
impl<'r, R: AddressRegionResolver<H>, H: HostTypes> ResolvedAddressRegion<'r, R, H> {
#[inline]
pub fn resolve_region_bound<'r2, R2: RegionBoundResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedRegionBound<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedRegionBound::new(record.region_bound_handle, r))
}
#[inline]
pub fn resolve_locality_metric<'r2, R2: LocalityMetricResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedLocalityMetric<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedLocalityMetric::new(
record.locality_metric_handle,
r,
))
}
}
#[derive(Debug)]
pub struct RegionBoundHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for RegionBoundHandle<H> {}
impl<H: HostTypes> Clone for RegionBoundHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for RegionBoundHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for RegionBoundHandle<H> {}
impl<H: HostTypes> core::hash::Hash for RegionBoundHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> RegionBoundHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait RegionBoundResolver<H: HostTypes> {
fn resolve(&self, handle: RegionBoundHandle<H>) -> Option<RegionBoundRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct RegionBoundRecord<H: HostTypes> {
pub region_lower_handle: crate::kernel::address::ElementHandle<H>,
pub region_upper_handle: crate::kernel::address::ElementHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedRegionBound<'r, R: RegionBoundResolver<H>, H: HostTypes> {
handle: RegionBoundHandle<H>,
resolver: &'r R,
record: Option<RegionBoundRecord<H>>,
}
impl<'r, R: RegionBoundResolver<H>, H: HostTypes> ResolvedRegionBound<'r, R, H> {
#[inline]
pub fn new(handle: RegionBoundHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> RegionBoundHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&RegionBoundRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: RegionBoundResolver<H>, H: HostTypes> RegionBound<H> for ResolvedRegionBound<'r, R, H> {
type Element = crate::kernel::address::NullElement<H>;
fn region_lower(&self) -> &Self::Element {
&<crate::kernel::address::NullElement<H>>::ABSENT
}
fn region_upper(&self) -> &Self::Element {
&<crate::kernel::address::NullElement<H>>::ABSENT
}
}
impl<'r, R: RegionBoundResolver<H>, H: HostTypes> ResolvedRegionBound<'r, R, H> {
#[inline]
pub fn resolve_region_lower<'r2, R2: crate::kernel::address::ElementResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::kernel::address::ResolvedElement<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::kernel::address::ResolvedElement::new(
record.region_lower_handle,
r,
))
}
#[inline]
pub fn resolve_region_upper<'r2, R2: crate::kernel::address::ElementResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::kernel::address::ResolvedElement<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::kernel::address::ResolvedElement::new(
record.region_upper_handle,
r,
))
}
}
#[derive(Debug)]
pub struct LocalityMetricHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for LocalityMetricHandle<H> {}
impl<H: HostTypes> Clone for LocalityMetricHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for LocalityMetricHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for LocalityMetricHandle<H> {}
impl<H: HostTypes> core::hash::Hash for LocalityMetricHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> LocalityMetricHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait LocalityMetricResolver<H: HostTypes> {
fn resolve(&self, handle: LocalityMetricHandle<H>) -> Option<LocalityMetricRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct LocalityMetricRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedLocalityMetric<'r, R: LocalityMetricResolver<H>, H: HostTypes> {
handle: LocalityMetricHandle<H>,
resolver: &'r R,
record: Option<LocalityMetricRecord<H>>,
}
impl<'r, R: LocalityMetricResolver<H>, H: HostTypes> ResolvedLocalityMetric<'r, R, H> {
#[inline]
pub fn new(handle: LocalityMetricHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> LocalityMetricHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&LocalityMetricRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: LocalityMetricResolver<H>, H: HostTypes> crate::bridge::observable::Observable<H>
for ResolvedLocalityMetric<'r, R, H>
{
fn value(&self) -> H::Decimal {
H::EMPTY_DECIMAL
}
fn source(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
fn target(&self) -> &H::HostString {
H::EMPTY_HOST_STRING
}
fn has_unit(&self) -> MeasurementUnit {
<MeasurementUnit>::default()
}
}
impl<'r, R: LocalityMetricResolver<H>, H: HostTypes> crate::bridge::observable::MetricObservable<H>
for ResolvedLocalityMetric<'r, R, H>
{
}
impl<'r, R: LocalityMetricResolver<H>, H: HostTypes> LocalityMetric<H>
for ResolvedLocalityMetric<'r, R, H>
{
}
#[derive(Debug)]
pub struct WorkingSetHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for WorkingSetHandle<H> {}
impl<H: HostTypes> Clone for WorkingSetHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for WorkingSetHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for WorkingSetHandle<H> {}
impl<H: HostTypes> core::hash::Hash for WorkingSetHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> WorkingSetHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait WorkingSetResolver<H: HostTypes> {
fn resolve(&self, handle: WorkingSetHandle<H>) -> Option<WorkingSetRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct WorkingSetRecord<H: HostTypes> {
pub working_set_stage_handle: crate::kernel::reduction::ReductionStepHandle<H>,
pub working_set_type_handle: crate::user::type_::TypeDefinitionHandle<H>,
pub working_set_size: u64,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedWorkingSet<'r, R: WorkingSetResolver<H>, H: HostTypes> {
handle: WorkingSetHandle<H>,
resolver: &'r R,
record: Option<WorkingSetRecord<H>>,
}
impl<'r, R: WorkingSetResolver<H>, H: HostTypes> ResolvedWorkingSet<'r, R, H> {
#[inline]
pub fn new(handle: WorkingSetHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> WorkingSetHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&WorkingSetRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: WorkingSetResolver<H>, H: HostTypes> WorkingSet<H> for ResolvedWorkingSet<'r, R, H> {
type AddressRegion = NullAddressRegion<H>;
fn working_set_regions(&self) -> &[Self::AddressRegion] {
&[]
}
type ReductionStep = crate::kernel::reduction::NullReductionStep<H>;
fn working_set_stage(&self) -> &Self::ReductionStep {
&<crate::kernel::reduction::NullReductionStep<H>>::ABSENT
}
type TypeDefinition = crate::user::type_::NullTypeDefinition<H>;
fn working_set_type(&self) -> &Self::TypeDefinition {
&<crate::user::type_::NullTypeDefinition<H>>::ABSENT
}
fn working_set_size(&self) -> u64 {
match &self.record {
Some(r) => r.working_set_size,
None => 0,
}
}
}
impl<'r, R: WorkingSetResolver<H>, H: HostTypes> ResolvedWorkingSet<'r, R, H> {
#[inline]
pub fn resolve_working_set_stage<
'r2,
R2: crate::kernel::reduction::ReductionStepResolver<H>,
>(
&self,
r: &'r2 R2,
) -> Option<crate::kernel::reduction::ResolvedReductionStep<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::kernel::reduction::ResolvedReductionStep::new(
record.working_set_stage_handle,
r,
))
}
#[inline]
pub fn resolve_working_set_type<'r2, R2: crate::user::type_::TypeDefinitionResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::user::type_::ResolvedTypeDefinition<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::user::type_::ResolvedTypeDefinition::new(
record.working_set_type_handle,
r,
))
}
}
#[derive(Debug)]
pub struct RegionAllocationHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for RegionAllocationHandle<H> {}
impl<H: HostTypes> Clone for RegionAllocationHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for RegionAllocationHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for RegionAllocationHandle<H> {}
impl<H: HostTypes> core::hash::Hash for RegionAllocationHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> RegionAllocationHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait RegionAllocationResolver<H: HostTypes> {
fn resolve(&self, handle: RegionAllocationHandle<H>) -> Option<RegionAllocationRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct RegionAllocationRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedRegionAllocation<'r, R: RegionAllocationResolver<H>, H: HostTypes> {
handle: RegionAllocationHandle<H>,
resolver: &'r R,
record: Option<RegionAllocationRecord<H>>,
}
impl<'r, R: RegionAllocationResolver<H>, H: HostTypes> ResolvedRegionAllocation<'r, R, H> {
#[inline]
pub fn new(handle: RegionAllocationHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> RegionAllocationHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&RegionAllocationRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: RegionAllocationResolver<H>, H: HostTypes> RegionAllocation<H>
for ResolvedRegionAllocation<'r, R, H>
{
type ReductionStep = crate::kernel::reduction::NullReductionStep<H>;
fn allocation_stage(&self) -> &[Self::ReductionStep] {
&[]
}
type WorkingSet = NullWorkingSet<H>;
fn allocation_working_set(&self) -> &[Self::WorkingSet] {
&[]
}
}