     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

    use libc::c_int;
    use std::marker::PhantomData;

    /// A slot in a type's "extra data" structure.
    ///
    /// It is parameterized over the type containing the extra data as well as the
    /// type of the data in the slot.
    pub struct Index<T, U>(c_int, PhantomData<(T, U)>);

    impl<T, U> Copy for Index<T, U> {}

    impl<T, U> Clone for Index<T, U> {
        fn clone(&self) -> Index<T, U> {
            *self
        }
    }

    impl<T, U> Index<T, U> {
        /// Creates an `Index` from a raw integer index.
        ///
        /// # Safety
        ///
        /// The caller must ensure that the index correctly maps to a `U` value stored in a `T`.
        pub unsafe fn from_raw(idx: c_int) -> Index<T, U> {
            Index(idx, PhantomData)
        }

        #[allow(clippy::trivially_copy_pass_by_ref)]
        pub fn as_raw(&self) -> c_int {
            self.0
        }
    }