arcis 0.14.1

A standard library of types and functions for writing MPC circuits with the Arcis framework.
Documentation
//! Default trait accepted by the arcis interpreter.
//!
//! This trait is a documentation-only handle: it exists so rustdoc renders a
//! page with an auto-generated implementors list showing which types the
//! arcis interpreter recognizes the trait on.
//!
//! It is never imported by user code. Inside `#[encrypted]` code the
//! interpreter dispatches `T::default()` directly; you do not need to bring
//! this trait into scope.

/// `Default` semantics accepted by the arcis interpreter.
///
/// # Implementing
///
/// Unlike most traits accepted by the interpreter, `Default` is both
/// **derivable** and **manually implementable** inside `#[encrypted]` code.
/// Both
///
/// ```ignore
/// #[derive(Default)]
/// struct Foo { x: u32, y: bool }
/// ```
///
/// and a hand-written
///
/// ```ignore
/// impl Default for Foo {
///     fn default() -> Self { Foo { x: 7, y: true } }
/// }
/// ```
///
/// are accepted. For enums, the variant the derive picks is the one marked
/// with `#[default]`.
///
/// # Calling
///
/// Inside `#[encrypted]` code, the supported forms are:
///
/// * `T::default()`.
/// * `<T as Default>::default()`.
///
/// The unqualified trait form `Default::default()` is not accepted: the
/// interpreter does not perform return-type type inference, so it cannot
/// figure out which `T` you mean.
///
/// # Implementors
///
/// The impl list below shows the types the interpreter recognizes as having
/// a `Default`. User types with `#[derive(Default)]` or a hand-written
/// `impl Default for ...` are accepted at use sites but do not appear in this
/// list (their impls live in user code, not in arcis).
pub trait Default {}

// ---- Primitives ----

impl Default for crate::std::boolean::bool {}

impl Default for crate::std::integer::u8 {}
impl Default for crate::std::integer::u16 {}
impl Default for crate::std::integer::u32 {}
impl Default for crate::std::integer::u64 {}
impl Default for crate::std::integer::u128 {}
impl Default for crate::std::integer::usize {}

impl Default for crate::std::integer::i8 {}
impl Default for crate::std::integer::i16 {}
impl Default for crate::std::integer::i32 {}
impl Default for crate::std::integer::i64 {}
impl Default for crate::std::integer::i128 {}
impl Default for crate::std::integer::isize {}

impl Default for crate::std::float::f32 {}
impl Default for crate::std::float::f64 {}

// ---- Composite ----

impl Default for () {}

impl<T: Default, const N: usize> Default for [T; N] {}

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

// ---- Slice reference ----
//
// `<&[T]>::default()` and `<&mut [T]>::default()` return a reference to an
// empty array. The interpreter treats `&T` and `&mut T` identically (Rust's
// borrow checker still enforces the distinction in the user's source).

impl<T> Default for &[T] {}
impl<T> Default for &mut [T] {}

// ---- Wrappers ----

impl<T: Default + ?Sized> Default for crate::std::boxed::Box<T> {}
impl<T: Default> Default for crate::std::cell::Cell<T> {}

// ---- Ranges ----
//
// Only `RangeFull` has a `Default`, matching std — the bounded range types
// have no meaningful default since there's no natural start/end.

impl Default for crate::std::ops::RangeFull {}