use crate::HostTypes;
pub trait Effect<H: HostTypes> {
type EffectTarget: EffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget;
type Context: crate::user::state::Context<H>;
fn pre_context(&self) -> &Self::Context;
fn post_context(&self) -> &Self::Context;
fn free_rank_delta(&self) -> i64;
fn composite_index(&self) -> u64;
fn is_commutative_with(&self) -> bool;
}
pub trait ReversibleEffect<H: HostTypes>: Effect<H> {}
pub trait PinningEffect<H: HostTypes>: ReversibleEffect<H> {}
pub trait UnbindingEffect<H: HostTypes>: Effect<H> {}
pub trait PhaseEffect<H: HostTypes>: ReversibleEffect<H> {
fn phase_angle_delta(&self) -> H::Decimal;
}
pub trait CompositeEffect<H: HostTypes>: Effect<H> {
type Effect: Effect<H>;
fn composite_head(&self) -> &Self::Effect;
fn composite_tail(&self) -> &[Self::Effect];
}
pub trait ExternalEffect<H: HostTypes>: Effect<H> {
type EffectShape: crate::bridge::conformance_::EffectShape<H>;
fn external_effect_shape(&self) -> &Self::EffectShape;
}
pub trait EffectTarget<H: HostTypes> {
type SiteIndex: crate::bridge::partition::SiteIndex<H>;
fn target_sites(&self) -> &[Self::SiteIndex];
fn target_cardinality(&self) -> u64;
}
pub trait DisjointnessWitness<H: HostTypes> {
type EffectTarget: EffectTarget<H>;
fn disjointness_left(&self) -> &Self::EffectTarget;
fn disjointness_right(&self) -> &Self::EffectTarget;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullEffect<H> {
pub const ABSENT: NullEffect<H> = NullEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullReversibleEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullReversibleEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullReversibleEffect<H> {
pub const ABSENT: NullReversibleEffect<H> = NullReversibleEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullReversibleEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> ReversibleEffect<H> for NullReversibleEffect<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullPinningEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullPinningEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullPinningEffect<H> {
pub const ABSENT: NullPinningEffect<H> = NullPinningEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullPinningEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> ReversibleEffect<H> for NullPinningEffect<H> {}
impl<H: HostTypes> PinningEffect<H> for NullPinningEffect<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullUnbindingEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullUnbindingEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullUnbindingEffect<H> {
pub const ABSENT: NullUnbindingEffect<H> = NullUnbindingEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullUnbindingEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> UnbindingEffect<H> for NullUnbindingEffect<H> {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullPhaseEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullPhaseEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullPhaseEffect<H> {
pub const ABSENT: NullPhaseEffect<H> = NullPhaseEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullPhaseEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> ReversibleEffect<H> for NullPhaseEffect<H> {}
impl<H: HostTypes> PhaseEffect<H> for NullPhaseEffect<H> {
fn phase_angle_delta(&self) -> H::Decimal {
H::EMPTY_DECIMAL
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullCompositeEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullCompositeEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullCompositeEffect<H> {
pub const ABSENT: NullCompositeEffect<H> = NullCompositeEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullCompositeEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> CompositeEffect<H> for NullCompositeEffect<H> {
type Effect = NullEffect<H>;
fn composite_head(&self) -> &Self::Effect {
&<NullEffect<H>>::ABSENT
}
fn composite_tail(&self) -> &[Self::Effect] {
&[]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullExternalEffect<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullExternalEffect<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullExternalEffect<H> {
pub const ABSENT: NullExternalEffect<H> = NullExternalEffect {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> Effect<H> for NullExternalEffect<H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<H: HostTypes> ExternalEffect<H> for NullExternalEffect<H> {
type EffectShape = crate::bridge::conformance_::NullEffectShape<H>;
fn external_effect_shape(&self) -> &Self::EffectShape {
&<crate::bridge::conformance_::NullEffectShape<H>>::ABSENT
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullEffectTarget<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullEffectTarget<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullEffectTarget<H> {
pub const ABSENT: NullEffectTarget<H> = NullEffectTarget {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> EffectTarget<H> for NullEffectTarget<H> {
type SiteIndex = crate::bridge::partition::NullSiteIndex<H>;
fn target_sites(&self) -> &[Self::SiteIndex] {
&[]
}
fn target_cardinality(&self) -> u64 {
0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct NullDisjointnessWitness<H: HostTypes> {
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Default for NullDisjointnessWitness<H> {
fn default() -> Self {
Self {
_phantom: core::marker::PhantomData,
}
}
}
impl<H: HostTypes> NullDisjointnessWitness<H> {
pub const ABSENT: NullDisjointnessWitness<H> = NullDisjointnessWitness {
_phantom: core::marker::PhantomData,
};
}
impl<H: HostTypes> DisjointnessWitness<H> for NullDisjointnessWitness<H> {
type EffectTarget = NullEffectTarget<H>;
fn disjointness_left(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
fn disjointness_right(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
}
#[derive(Debug)]
pub struct EffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for EffectHandle<H> {}
impl<H: HostTypes> Clone for EffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for EffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for EffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for EffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> EffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait EffectResolver<H: HostTypes> {
fn resolve(&self, handle: EffectHandle<H>) -> Option<EffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct EffectRecord<H: HostTypes> {
pub effect_target_handle: EffectTargetHandle<H>,
pub pre_context_handle: crate::user::state::ContextHandle<H>,
pub post_context_handle: crate::user::state::ContextHandle<H>,
pub free_rank_delta: i64,
pub composite_index: u64,
pub is_commutative_with: bool,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedEffect<'r, R: EffectResolver<H>, H: HostTypes> {
handle: EffectHandle<H>,
resolver: &'r R,
record: Option<EffectRecord<H>>,
}
impl<'r, R: EffectResolver<H>, H: HostTypes> ResolvedEffect<'r, R, H> {
#[inline]
pub fn new(handle: EffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> EffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&EffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: EffectResolver<H>, H: HostTypes> Effect<H> for ResolvedEffect<'r, R, H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
match &self.record {
Some(r) => r.free_rank_delta,
None => 0,
}
}
fn composite_index(&self) -> u64 {
match &self.record {
Some(r) => r.composite_index,
None => 0,
}
}
fn is_commutative_with(&self) -> bool {
match &self.record {
Some(r) => r.is_commutative_with,
None => false,
}
}
}
impl<'r, R: EffectResolver<H>, H: HostTypes> ResolvedEffect<'r, R, H> {
#[inline]
pub fn resolve_effect_target<'r2, R2: EffectTargetResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedEffectTarget<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedEffectTarget::new(record.effect_target_handle, r))
}
#[inline]
pub fn resolve_pre_context<'r2, R2: crate::user::state::ContextResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::user::state::ResolvedContext<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::user::state::ResolvedContext::new(
record.pre_context_handle,
r,
))
}
#[inline]
pub fn resolve_post_context<'r2, R2: crate::user::state::ContextResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<crate::user::state::ResolvedContext<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::user::state::ResolvedContext::new(
record.post_context_handle,
r,
))
}
}
#[derive(Debug)]
pub struct ReversibleEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for ReversibleEffectHandle<H> {}
impl<H: HostTypes> Clone for ReversibleEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for ReversibleEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for ReversibleEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for ReversibleEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> ReversibleEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait ReversibleEffectResolver<H: HostTypes> {
fn resolve(&self, handle: ReversibleEffectHandle<H>) -> Option<ReversibleEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct ReversibleEffectRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedReversibleEffect<'r, R: ReversibleEffectResolver<H>, H: HostTypes> {
handle: ReversibleEffectHandle<H>,
resolver: &'r R,
record: Option<ReversibleEffectRecord<H>>,
}
impl<'r, R: ReversibleEffectResolver<H>, H: HostTypes> ResolvedReversibleEffect<'r, R, H> {
#[inline]
pub fn new(handle: ReversibleEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> ReversibleEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&ReversibleEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: ReversibleEffectResolver<H>, H: HostTypes> Effect<H>
for ResolvedReversibleEffect<'r, R, H>
{
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: ReversibleEffectResolver<H>, H: HostTypes> ReversibleEffect<H>
for ResolvedReversibleEffect<'r, R, H>
{
}
#[derive(Debug)]
pub struct PinningEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for PinningEffectHandle<H> {}
impl<H: HostTypes> Clone for PinningEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for PinningEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for PinningEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for PinningEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> PinningEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait PinningEffectResolver<H: HostTypes> {
fn resolve(&self, handle: PinningEffectHandle<H>) -> Option<PinningEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct PinningEffectRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedPinningEffect<'r, R: PinningEffectResolver<H>, H: HostTypes> {
handle: PinningEffectHandle<H>,
resolver: &'r R,
record: Option<PinningEffectRecord<H>>,
}
impl<'r, R: PinningEffectResolver<H>, H: HostTypes> ResolvedPinningEffect<'r, R, H> {
#[inline]
pub fn new(handle: PinningEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> PinningEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&PinningEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: PinningEffectResolver<H>, H: HostTypes> Effect<H> for ResolvedPinningEffect<'r, R, H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: PinningEffectResolver<H>, H: HostTypes> ReversibleEffect<H>
for ResolvedPinningEffect<'r, R, H>
{
}
impl<'r, R: PinningEffectResolver<H>, H: HostTypes> PinningEffect<H>
for ResolvedPinningEffect<'r, R, H>
{
}
#[derive(Debug)]
pub struct UnbindingEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for UnbindingEffectHandle<H> {}
impl<H: HostTypes> Clone for UnbindingEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for UnbindingEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for UnbindingEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for UnbindingEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> UnbindingEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait UnbindingEffectResolver<H: HostTypes> {
fn resolve(&self, handle: UnbindingEffectHandle<H>) -> Option<UnbindingEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct UnbindingEffectRecord<H: HostTypes> {
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedUnbindingEffect<'r, R: UnbindingEffectResolver<H>, H: HostTypes> {
handle: UnbindingEffectHandle<H>,
resolver: &'r R,
record: Option<UnbindingEffectRecord<H>>,
}
impl<'r, R: UnbindingEffectResolver<H>, H: HostTypes> ResolvedUnbindingEffect<'r, R, H> {
#[inline]
pub fn new(handle: UnbindingEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> UnbindingEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&UnbindingEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: UnbindingEffectResolver<H>, H: HostTypes> Effect<H>
for ResolvedUnbindingEffect<'r, R, H>
{
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: UnbindingEffectResolver<H>, H: HostTypes> UnbindingEffect<H>
for ResolvedUnbindingEffect<'r, R, H>
{
}
#[derive(Debug)]
pub struct PhaseEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for PhaseEffectHandle<H> {}
impl<H: HostTypes> Clone for PhaseEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for PhaseEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for PhaseEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for PhaseEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> PhaseEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait PhaseEffectResolver<H: HostTypes> {
fn resolve(&self, handle: PhaseEffectHandle<H>) -> Option<PhaseEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct PhaseEffectRecord<H: HostTypes> {
pub phase_angle_delta: H::Decimal,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedPhaseEffect<'r, R: PhaseEffectResolver<H>, H: HostTypes> {
handle: PhaseEffectHandle<H>,
resolver: &'r R,
record: Option<PhaseEffectRecord<H>>,
}
impl<'r, R: PhaseEffectResolver<H>, H: HostTypes> ResolvedPhaseEffect<'r, R, H> {
#[inline]
pub fn new(handle: PhaseEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> PhaseEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&PhaseEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: PhaseEffectResolver<H>, H: HostTypes> Effect<H> for ResolvedPhaseEffect<'r, R, H> {
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: PhaseEffectResolver<H>, H: HostTypes> ReversibleEffect<H>
for ResolvedPhaseEffect<'r, R, H>
{
}
impl<'r, R: PhaseEffectResolver<H>, H: HostTypes> PhaseEffect<H> for ResolvedPhaseEffect<'r, R, H> {
fn phase_angle_delta(&self) -> H::Decimal {
match &self.record {
Some(r) => r.phase_angle_delta,
None => H::EMPTY_DECIMAL,
}
}
}
#[derive(Debug)]
pub struct CompositeEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for CompositeEffectHandle<H> {}
impl<H: HostTypes> Clone for CompositeEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for CompositeEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for CompositeEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for CompositeEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> CompositeEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait CompositeEffectResolver<H: HostTypes> {
fn resolve(&self, handle: CompositeEffectHandle<H>) -> Option<CompositeEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct CompositeEffectRecord<H: HostTypes> {
pub composite_head_handle: EffectHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedCompositeEffect<'r, R: CompositeEffectResolver<H>, H: HostTypes> {
handle: CompositeEffectHandle<H>,
resolver: &'r R,
record: Option<CompositeEffectRecord<H>>,
}
impl<'r, R: CompositeEffectResolver<H>, H: HostTypes> ResolvedCompositeEffect<'r, R, H> {
#[inline]
pub fn new(handle: CompositeEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> CompositeEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&CompositeEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: CompositeEffectResolver<H>, H: HostTypes> Effect<H>
for ResolvedCompositeEffect<'r, R, H>
{
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: CompositeEffectResolver<H>, H: HostTypes> CompositeEffect<H>
for ResolvedCompositeEffect<'r, R, H>
{
type Effect = NullEffect<H>;
fn composite_head(&self) -> &Self::Effect {
&<NullEffect<H>>::ABSENT
}
fn composite_tail(&self) -> &[Self::Effect] {
&[]
}
}
impl<'r, R: CompositeEffectResolver<H>, H: HostTypes> ResolvedCompositeEffect<'r, R, H> {
#[inline]
pub fn resolve_composite_head<'r2, R2: EffectResolver<H>>(
&self,
r: &'r2 R2,
) -> Option<ResolvedEffect<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(ResolvedEffect::new(record.composite_head_handle, r))
}
}
#[derive(Debug)]
pub struct ExternalEffectHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for ExternalEffectHandle<H> {}
impl<H: HostTypes> Clone for ExternalEffectHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for ExternalEffectHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for ExternalEffectHandle<H> {}
impl<H: HostTypes> core::hash::Hash for ExternalEffectHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> ExternalEffectHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait ExternalEffectResolver<H: HostTypes> {
fn resolve(&self, handle: ExternalEffectHandle<H>) -> Option<ExternalEffectRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct ExternalEffectRecord<H: HostTypes> {
pub external_effect_shape_handle: crate::bridge::conformance_::EffectShapeHandle<H>,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedExternalEffect<'r, R: ExternalEffectResolver<H>, H: HostTypes> {
handle: ExternalEffectHandle<H>,
resolver: &'r R,
record: Option<ExternalEffectRecord<H>>,
}
impl<'r, R: ExternalEffectResolver<H>, H: HostTypes> ResolvedExternalEffect<'r, R, H> {
#[inline]
pub fn new(handle: ExternalEffectHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> ExternalEffectHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&ExternalEffectRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: ExternalEffectResolver<H>, H: HostTypes> Effect<H>
for ResolvedExternalEffect<'r, R, H>
{
type EffectTarget = NullEffectTarget<H>;
fn effect_target(&self) -> &Self::EffectTarget {
&<NullEffectTarget<H>>::ABSENT
}
type Context = crate::user::state::NullContext<H>;
fn pre_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn post_context(&self) -> &Self::Context {
&<crate::user::state::NullContext<H>>::ABSENT
}
fn free_rank_delta(&self) -> i64 {
0
}
fn composite_index(&self) -> u64 {
0
}
fn is_commutative_with(&self) -> bool {
false
}
}
impl<'r, R: ExternalEffectResolver<H>, H: HostTypes> ExternalEffect<H>
for ResolvedExternalEffect<'r, R, H>
{
type EffectShape = crate::bridge::conformance_::NullEffectShape<H>;
fn external_effect_shape(&self) -> &Self::EffectShape {
&<crate::bridge::conformance_::NullEffectShape<H>>::ABSENT
}
}
impl<'r, R: ExternalEffectResolver<H>, H: HostTypes> ResolvedExternalEffect<'r, R, H> {
#[inline]
pub fn resolve_external_effect_shape<
'r2,
R2: crate::bridge::conformance_::EffectShapeResolver<H>,
>(
&self,
r: &'r2 R2,
) -> Option<crate::bridge::conformance_::ResolvedEffectShape<'r2, R2, H>> {
let record = self.record.as_ref()?;
Some(crate::bridge::conformance_::ResolvedEffectShape::new(
record.external_effect_shape_handle,
r,
))
}
}
#[derive(Debug)]
pub struct EffectTargetHandle<H: HostTypes> {
pub fingerprint: crate::enforcement::ContentFingerprint,
_phantom: core::marker::PhantomData<H>,
}
impl<H: HostTypes> Copy for EffectTargetHandle<H> {}
impl<H: HostTypes> Clone for EffectTargetHandle<H> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<H: HostTypes> PartialEq for EffectTargetHandle<H> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.fingerprint == other.fingerprint
}
}
impl<H: HostTypes> Eq for EffectTargetHandle<H> {}
impl<H: HostTypes> core::hash::Hash for EffectTargetHandle<H> {
#[inline]
fn hash<S: core::hash::Hasher>(&self, state: &mut S) {
self.fingerprint.hash(state);
}
}
impl<H: HostTypes> EffectTargetHandle<H> {
#[inline]
#[must_use]
pub const fn new(fingerprint: crate::enforcement::ContentFingerprint) -> Self {
Self {
fingerprint,
_phantom: core::marker::PhantomData,
}
}
}
pub trait EffectTargetResolver<H: HostTypes> {
fn resolve(&self, handle: EffectTargetHandle<H>) -> Option<EffectTargetRecord<H>>;
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct EffectTargetRecord<H: HostTypes> {
pub target_cardinality: u64,
#[doc(hidden)]
pub _phantom: core::marker::PhantomData<H>,
}
pub struct ResolvedEffectTarget<'r, R: EffectTargetResolver<H>, H: HostTypes> {
handle: EffectTargetHandle<H>,
resolver: &'r R,
record: Option<EffectTargetRecord<H>>,
}
impl<'r, R: EffectTargetResolver<H>, H: HostTypes> ResolvedEffectTarget<'r, R, H> {
#[inline]
pub fn new(handle: EffectTargetHandle<H>, resolver: &'r R) -> Self {
let record = resolver.resolve(handle);
Self {
handle,
resolver,
record,
}
}
#[inline]
#[must_use]
pub const fn handle(&self) -> EffectTargetHandle<H> {
self.handle
}
#[inline]
#[must_use]
pub const fn resolver(&self) -> &'r R {
self.resolver
}
#[inline]
#[must_use]
pub const fn record(&self) -> Option<&EffectTargetRecord<H>> {
self.record.as_ref()
}
}
impl<'r, R: EffectTargetResolver<H>, H: HostTypes> EffectTarget<H>
for ResolvedEffectTarget<'r, R, H>
{
type SiteIndex = crate::bridge::partition::NullSiteIndex<H>;
fn target_sites(&self) -> &[Self::SiteIndex] {
&[]
}
fn target_cardinality(&self) -> u64 {
match &self.record {
Some(r) => r.target_cardinality,
None => 0,
}
}
}