1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! Traits for `opaque_typedef_macros`.
#![warn(missing_docs)]

/// An error type that indicates the error should never happen.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Infallible {}

/// Common functions for opaque typedef-ed sized types.
pub trait OpaqueTypedef: Sized {
    /// Inner type.
    type Inner;
    /// Validation error type.
    type Error: ::std::fmt::Debug;

    /// Creates a new value from the inner value without validation.
    unsafe fn from_inner_unchecked(inner: Self::Inner) -> Self;
    /// Tries to create a new value from the inner value with validation.
    fn try_from_inner(inner: Self::Inner) -> Result<Self, Self::Error>;
    /// Creates a new value from the inner value with validation.
    ///
    /// # Panics
    ///
    /// Panics if the validation failed.
    fn from_inner(inner: Self::Inner) -> Self {
        Self::try_from_inner(inner).unwrap()
    }
    /// Takes and returns the inner value with its ownership.
    fn into_inner(self) -> Self::Inner;
    /// Returns the reference to the inner value.
    fn as_inner(&self) -> &Self::Inner;
    /// Returns the mutable reference to the inner value.
    unsafe fn as_inner_mut(&mut self) -> &mut Self::Inner;
}

/// Common functions for opaque typedef-ed unsized types.
pub trait OpaqueTypedefUnsized {
    /// Inner type.
    type Inner: ?Sized;
    /// Validation error type.
    type Error: ::std::fmt::Debug;

    /// Creates a reference from the inner reference without validation.
    unsafe fn from_inner_unchecked(inner: &Self::Inner) -> &Self;
    /// Creates a mutable reference from the inner mutable reference without
    /// validation.
    unsafe fn from_inner_unchecked_mut(inner: &mut Self::Inner) -> &mut Self;
    /// Tries to create a reference from the inner reference with validation.
    fn try_from_inner(inner: &Self::Inner) -> Result<&Self, Self::Error>;
    /// Creates a reference from the inner reference with validation.
    ///
    /// # Panics
    ///
    /// Panics if the validation failed.
    fn from_inner(inner: &Self::Inner) -> &Self {
        Self::try_from_inner(inner).unwrap()
    }
    /// Tries to create a mutable reference from the inner mutable reference
    /// with validation.
    fn try_from_inner_mut(inner: &mut Self::Inner) -> Result<&mut Self, Self::Error>;
    /// Creates a mutable reference from the inner mutable reference with
    /// validation.
    ///
    /// # Panics
    ///
    /// Panics if the validation failed.
    fn from_inner_mut(inner: &mut Self::Inner) -> &mut Self {
        Self::try_from_inner_mut(inner).unwrap()
    }
    /// Returns the inner reference.
    fn as_inner(&self) -> &Self::Inner;
    /// Returns the inner mutable reference.
    unsafe fn as_inner_mut(&mut self) -> &mut Self::Inner;
}