Trait MirroredClone

Source
pub trait MirroredClone<S: Speed>: Sized {
    // Required method
    fn mirrored_clone(&self) -> Self;
}
Expand description

Get clones that share all semantically-important mutable state.

The goal is that mutating one mirrored clone affects every clone. Different mirrored clones should, from their public interfaces, act identically, with some exceptions like memory addresses.

This can be achieved via reference counting (e.g., Rc or Arc), or by simply not having any mutable state to share at all (e.g. a zero-sized type like (), or a reference to a type without internal mutability, like &'static str).

Per-clone mutable data is permissible, so long as the effects of mutating that data do not cause mirrored clones to behave differently in a potentially-observable way.

§Exceptions

  • A type implementing MirroredClone may specify that certain methods or accesses are not subject to these guarantees.
  • Debug should be assumed to be an exception. Intentionally worsening the life of someone debugging your type is not a goal.
  • Memory addresses which are different per-clone, but are not mutated by that clone (except when a user moves the value). Trivially, mirrored clones do not have the same address, and some of their data may be inlined into the type. If any reference to that data is exposed, a user would likely be able to determine what data is inlined into the type and what is inlined. That’s already visible in the source code, anyway. Unless some semantically-important function of the type depends on the address of it or its data, it’s unimportant.
  • TLDR of above bullet: users should not assume that references returned from different mirrored clones refer to the same value, only that those values behave the same.

Required Methods§

Source

fn mirrored_clone(&self) -> Self

Get a clone that shares all semantically-important mutable state with its source.

The goal is that mutating one mirrored clone affects every clone. Different mirrored clones should, from their public interfaces, act identically, with some exceptions like memory addresses.

Read MirroredClone for more.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl MirroredClone<NearInstant> for Infallible

Source§

fn mirrored_clone(&self) -> Self

Source§

impl MirroredClone<NearInstant> for ()

Source§

fn mirrored_clone(&self) -> Self

Source§

impl MirroredClone<NearInstant> for PhantomPinned

Source§

fn mirrored_clone(&self) -> Self

Source§

impl MirroredClone<NearInstant> for RangeFull

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R> MirroredClone<NearInstant> for fn() -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1> MirroredClone<NearInstant> for fn(T1) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2> MirroredClone<NearInstant> for fn(T1, T2) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3> MirroredClone<NearInstant> for fn(T1, T2, T3) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4> MirroredClone<NearInstant> for fn(T1, T2, T3, T4) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7, T8) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> MirroredClone<NearInstant> for fn(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: MirroredClone<S>> MirroredClone<S> for Option<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: MirroredClone<S>, E: MirroredClone<S>> MirroredClone<S> for Result<T, E>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Rc<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Weak<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Arc<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Weak<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Pin<Rc<T>>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Pin<Weak<T>>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Pin<Arc<T>>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<S: Speed, T: ?Sized> MirroredClone<S> for Pin<Weak<T>>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1,)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>, T8: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7, T8)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>, T8: MirroredClone<AnySpeed>, T9: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>, T8: MirroredClone<AnySpeed>, T9: MirroredClone<AnySpeed>, T10: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>, T8: MirroredClone<AnySpeed>, T9: MirroredClone<AnySpeed>, T10: MirroredClone<AnySpeed>, T11: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<AnySpeed>, T2: MirroredClone<AnySpeed>, T3: MirroredClone<AnySpeed>, T4: MirroredClone<AnySpeed>, T5: MirroredClone<AnySpeed>, T6: MirroredClone<AnySpeed>, T7: MirroredClone<AnySpeed>, T8: MirroredClone<AnySpeed>, T9: MirroredClone<AnySpeed>, T10: MirroredClone<AnySpeed>, T11: MirroredClone<AnySpeed>, T12: MirroredClone<AnySpeed>> MirroredClone<AnySpeed> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1,)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>, T8: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7, T8)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>, T8: MirroredClone<ConstantTime>, T9: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>, T8: MirroredClone<ConstantTime>, T9: MirroredClone<ConstantTime>, T10: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>, T8: MirroredClone<ConstantTime>, T9: MirroredClone<ConstantTime>, T10: MirroredClone<ConstantTime>, T11: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<ConstantTime>, T2: MirroredClone<ConstantTime>, T3: MirroredClone<ConstantTime>, T4: MirroredClone<ConstantTime>, T5: MirroredClone<ConstantTime>, T6: MirroredClone<ConstantTime>, T7: MirroredClone<ConstantTime>, T8: MirroredClone<ConstantTime>, T9: MirroredClone<ConstantTime>, T10: MirroredClone<ConstantTime>, T11: MirroredClone<ConstantTime>, T12: MirroredClone<ConstantTime>> MirroredClone<ConstantTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1,)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>, T8: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7, T8)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>, T8: MirroredClone<LogTime>, T9: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>, T8: MirroredClone<LogTime>, T9: MirroredClone<LogTime>, T10: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>, T8: MirroredClone<LogTime>, T9: MirroredClone<LogTime>, T10: MirroredClone<LogTime>, T11: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T1: MirroredClone<LogTime>, T2: MirroredClone<LogTime>, T3: MirroredClone<LogTime>, T4: MirroredClone<LogTime>, T5: MirroredClone<LogTime>, T6: MirroredClone<LogTime>, T7: MirroredClone<LogTime>, T8: MirroredClone<LogTime>, T9: MirroredClone<LogTime>, T10: MirroredClone<LogTime>, T11: MirroredClone<LogTime>, T12: MirroredClone<LogTime>> MirroredClone<LogTime> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T> MirroredClone<NearInstant> for Empty<T>

Source§

fn mirrored_clone(&self) -> Self

Source§

impl<T: ?Sized> MirroredClone<NearInstant> for PhantomData<T>

Source§

fn mirrored_clone(&self) -> Self

Implementors§