Skip to main content

LightClone

Trait LightClone 

Source
pub trait LightClone: Clone {
    // Provided methods
    fn light_clone(&self) -> Self { ... }
    fn lc(&self) -> Self { ... }
}
Expand description

Marker trait for types that are O(1) to clone.

LightClone is a marker trait that asserts a type’s Clone implementation is cheap. Cloning involves only:

  • Atomic refcount increments (Arc)
  • Non-atomic refcount increments (Rc)
  • Bitwise copy (Copy types)
  • Persistent data structure cloning (im, imbl, rpds)

This trait is similar to Facebook’s Dupe crate but provides a .light_clone() method that delegates to clone().

§Usage

Prefer .light_clone() over .clone() when you want to make the cheap clone explicit:

use light_clone::LightClone;

let x: i32 = 42;
let y = x.light_clone();  // Explicit: this is a light clone
assert_eq!(x, y);

A shorthand .lc() method is also available:

use light_clone::LightClone;

let x: i32 = 42;
let y = x.lc();  // Shorthand for light_clone()
assert_eq!(x, y);

§Derive Macro

Use #[derive(Clone, LightClone)] on structs to get compile-time enforcement that all fields are cheap to clone. The derive macro requires Clone to be implemented separately (either via derive or manual impl) and generates a LightClone impl with bounds that ensure all fields implement LightClone:

use light_clone::LightClone;
use std::sync::Arc;

#[derive(Clone, LightClone)]
struct Person {
    id: i64,
    name: Arc<str>,
}

The compile-time enforcement comes from the generated bounds - if any field doesn’t implement LightClone, compilation will fail.

Provided Methods§

Source

fn light_clone(&self) -> Self

Returns a light clone of the value.

This operation is guaranteed to be O(1), involving only:

  • Atomic or non-atomic refcount increments
  • Bitwise copies for Copy types

The default implementation simply calls clone(), which is correct for all LightClone types since their Clone is guaranteed to be O(1).

Source

fn lc(&self) -> Self

Shorthand for light_clone().

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 LightClone for bool

Source§

impl LightClone for char

Source§

impl LightClone for f32

Source§

impl LightClone for f64

Source§

impl LightClone for i8

Source§

impl LightClone for i16

Source§

impl LightClone for i32

Source§

impl LightClone for i64

Source§

impl LightClone for i128

Source§

impl LightClone for isize

Source§

impl LightClone for u8

Source§

impl LightClone for u16

Source§

impl LightClone for u32

Source§

impl LightClone for u64

Source§

impl LightClone for u128

Source§

impl LightClone for ()

Source§

impl LightClone for usize

Source§

impl LightClone for TypeId

Source§

impl LightClone for PhantomPinned

Source§

impl LightClone for Ipv4Addr

Source§

impl LightClone for Ipv6Addr

Source§

impl LightClone for SocketAddrV4

Source§

impl LightClone for SocketAddrV6

Source§

impl LightClone for Duration

Source§

impl LightClone for ThreadId

Source§

impl LightClone for Instant

Source§

impl LightClone for SystemTime

Source§

impl LightClone for NonZeroI8

Source§

impl LightClone for NonZeroI16

Source§

impl LightClone for NonZeroI32

Source§

impl LightClone for NonZeroI64

Source§

impl LightClone for NonZeroI128

Source§

impl LightClone for NonZeroIsize

Source§

impl LightClone for NonZeroU8

Source§

impl LightClone for NonZeroU16

Source§

impl LightClone for NonZeroU32

Source§

impl LightClone for NonZeroU64

Source§

impl LightClone for NonZeroU128

Source§

impl LightClone for NonZeroUsize

Source§

impl<A: LightClone> LightClone for (A,)

Source§

impl<A: LightClone, B: LightClone> LightClone for (A, B)

Source§

impl<A: LightClone, B: LightClone, C: LightClone> LightClone for (A, B, C)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone> LightClone for (A, B, C, D)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone> LightClone for (A, B, C, D, E)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone> LightClone for (A, B, C, D, E, F)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone> LightClone for (A, B, C, D, E, F, G)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone, H: LightClone> LightClone for (A, B, C, D, E, F, G, H)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone, H: LightClone, I: LightClone> LightClone for (A, B, C, D, E, F, G, H, I)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone, H: LightClone, I: LightClone, J: LightClone> LightClone for (A, B, C, D, E, F, G, H, I, J)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone, H: LightClone, I: LightClone, J: LightClone, K: LightClone> LightClone for (A, B, C, D, E, F, G, H, I, J, K)

Source§

impl<A: LightClone, B: LightClone, C: LightClone, D: LightClone, E: LightClone, F: LightClone, G: LightClone, H: LightClone, I: LightClone, J: LightClone, K: LightClone, L: LightClone> LightClone for (A, B, C, D, E, F, G, H, I, J, K, L)

Source§

impl<Ret> LightClone for fn() -> Ret

Source§

impl<Ret, A> LightClone for fn(A) -> Ret

Source§

impl<Ret, A, B> LightClone for fn(A, B) -> Ret

Source§

impl<Ret, A, B, C> LightClone for fn(A, B, C) -> Ret

Source§

impl<Ret, A, B, C, D> LightClone for fn(A, B, C, D) -> Ret

Source§

impl<Ret, A, B, C, D, E> LightClone for fn(A, B, C, D, E) -> Ret

Source§

impl<Ret, A, B, C, D, E, F> LightClone for fn(A, B, C, D, E, F) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G> LightClone for fn(A, B, C, D, E, F, G) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G, H> LightClone for fn(A, B, C, D, E, F, G, H) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G, H, I> LightClone for fn(A, B, C, D, E, F, G, H, I) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G, H, I, J> LightClone for fn(A, B, C, D, E, F, G, H, I, J) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G, H, I, J, K> LightClone for fn(A, B, C, D, E, F, G, H, I, J, K) -> Ret

Source§

impl<Ret, A, B, C, D, E, F, G, H, I, J, K, L> LightClone for fn(A, B, C, D, E, F, G, H, I, J, K, L) -> Ret

Source§

impl<T> LightClone for PhantomData<T>

Source§

impl<T: LightClone + Copy> LightClone for Cell<T>

Source§

impl<T: LightClone + Copy, const N: usize> LightClone for [T; N]

Source§

impl<T: LightClone> LightClone for Bound<T>

Source§

impl<T: LightClone> LightClone for Option<T>

Source§

impl<T: LightClone> LightClone for Poll<T>

Source§

impl<T: LightClone> LightClone for ManuallyDrop<T>

Source§

impl<T: LightClone> LightClone for Pin<T>

Source§

impl<T: LightClone, E: Clone> LightClone for Result<T, E>

Source§

impl<T: ?Sized> LightClone for *const T

Source§

impl<T: ?Sized> LightClone for *mut T

Source§

impl<T: ?Sized> LightClone for &T

Source§

impl<T: ?Sized> LightClone for Rc<T>

Source§

impl<T: ?Sized> LightClone for Weak<T>

Source§

impl<T: ?Sized> LightClone for Arc<T>

Source§

impl<T: ?Sized> LightClone for Weak<T>

Source§

impl<T: ?Sized> LightClone for NonNull<T>

Implementors§