Trait sgx_tstd::convert::AsRef

1.0.0 · source ·
pub trait AsRef<T>where
    T: ?Sized,{
    // Required method
    fn as_ref(&self) -> &T;
}
Expand description

Used to do a cheap reference-to-reference conversion.

This trait is similar to AsMut which is used for converting between mutable references. If you need to do a costly conversion it is better to implement From with type &T or write a custom function.

Relation to Borrow

AsRef has the same signature as Borrow, but Borrow is different in a few aspects:

  • Unlike AsRef, Borrow has a blanket impl for any T, and can be used to accept either a reference or a value. (See also note on AsRef’s reflexibility below.)
  • Borrow also requires that Hash, Eq and Ord for a borrowed value are equivalent to those of the owned value. For this reason, if you want to borrow only a single field of a struct you can implement AsRef, but not Borrow.

Note: This trait must not fail. If the conversion can fail, use a dedicated method which returns an Option<T> or a Result<T, E>.

Generic Implementations

AsRef auto-dereferences if the inner type is a reference or a mutable reference (e.g.: foo.as_ref() will work the same if foo has type &mut Foo or &&mut Foo).

Note that due to historic reasons, the above currently does not hold generally for all dereferenceable types, e.g. foo.as_ref() will not work the same as Box::new(foo).as_ref(). Instead, many smart pointers provide an as_ref implementation which simply returns a reference to the pointed-to value (but do not perform a cheap reference-to-reference conversion for that value). However, AsRef::as_ref should not be used for the sole purpose of dereferencing; instead Deref coercion’ can be used:

let x = Box::new(5i32);
// Avoid this:
// let y: &i32 = x.as_ref();
// Better just write:
let y: &i32 = &x;

Types which implement Deref should consider implementing AsRef<T> as follows:

impl<T> AsRef<T> for SomeType
where
    T: ?Sized,
    <SomeType as Deref>::Target: AsRef<T>,
{
    fn as_ref(&self) -> &T {
        self.deref().as_ref()
    }
}

Reflexivity

Ideally, AsRef would be reflexive, i.e. there would be an impl<T: ?Sized> AsRef<T> for T with as_ref simply returning its argument unchanged. Such a blanket implementation is currently not provided due to technical restrictions of Rust’s type system (it would be overlapping with another existing blanket implementation for &T where T: AsRef<U> which allows AsRef to auto-dereference, see “Generic Implementations” above).

A trivial implementation of AsRef<T> for T must be added explicitly for a particular type T where needed or desired. Note, however, that not all types from std contain such an implementation, and those cannot be added by external code due to orphan rules.

Examples

By using trait bounds we can accept arguments of different types as long as they can be converted to the specified type T.

For example: By creating a generic function that takes an AsRef<str> we express that we want to accept all references that can be converted to &str as an argument. Since both String and &str implement AsRef<str> we can accept both as input argument.

fn is_hello<T: AsRef<str>>(s: T) {
   assert_eq!("hello", s.as_ref());
}

let s = "hello";
is_hello(s);

let s = "hello".to_string();
is_hello(s);

Required Methods§

source

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.

Implementors§

source§

impl AsRef<str> for str

source§

impl AsRef<str> for String

1.7.0 · source§

impl AsRef<CStr> for CStr

1.7.0 · source§

impl AsRef<CStr> for CString

source§

impl AsRef<OsStr> for Component<'_>

source§

impl AsRef<OsStr> for str

source§

impl AsRef<OsStr> for OsStr

source§

impl AsRef<OsStr> for OsString

source§

impl AsRef<OsStr> for Components<'_>

source§

impl AsRef<OsStr> for sgx_tstd::path::Iter<'_>

source§

impl AsRef<OsStr> for Path

source§

impl AsRef<OsStr> for PathBuf

source§

impl AsRef<OsStr> for String

source§

impl AsRef<Path> for Cow<'_, OsStr>

source§

impl AsRef<Path> for Component<'_>

source§

impl AsRef<Path> for str

source§

impl AsRef<Path> for OsStr

source§

impl AsRef<Path> for OsString

source§

impl AsRef<Path> for Components<'_>

source§

impl AsRef<Path> for sgx_tstd::path::Iter<'_>

source§

impl AsRef<Path> for Path

source§

impl AsRef<Path> for PathBuf

source§

impl AsRef<Path> for String

source§

impl AsRef<Align128<[u8; 64]>> for AlignReportData

source§

impl AsRef<Align256<[u8; 256]>> for AlignReport2Mac

source§

impl AsRef<Align512<[u8; 432]>> for AlignReport

source§

impl AsRef<Align512<[u8; 512]>> for AlignKeyRequest

source§

impl AsRef<Align512<[u8; 512]>> for AlignTargetInfo

source§

impl AsRef<[u8; 4]> for PceInfo

source§

impl AsRef<[u8; 4]> for TeeReportType

source§

impl AsRef<[u8; 8]> for TeeAttributes

source§

impl AsRef<[u8; 12]> for UpdateInfoBit

source§

impl AsRef<[u8; 16]> for AlignKey128bit

source§

impl AsRef<[u8; 16]> for AlignMac128bit

source§

impl AsRef<[u8; 16]> for QlQe3Id

source§

impl AsRef<[u8; 16]> for QuoteNonce

source§

impl AsRef<[u8; 16]> for Spid

source§

impl AsRef<[u8; 16]> for TeeCpuSvn

source§

impl AsRef<[u8; 16]> for Attributes

source§

impl AsRef<[u8; 16]> for CpuSvn

source§

impl AsRef<[u8; 16]> for SwitchlessWokerStats

source§

impl AsRef<[u8; 16]> for TeeTcbSvn

source§

impl AsRef<[u8; 20]> for Sha1Hash

source§

impl AsRef<[u8; 32]> for AlignEc256PrivateKey

source§

impl AsRef<[u8; 32]> for AlignEc256SharedKey

source§

impl AsRef<[u8; 32]> for AlignKey256bit

source§

impl AsRef<[u8; 32]> for AlignMac256bit

source§

impl AsRef<[u8; 32]> for Ec256PrivateKey

source§

impl AsRef<[u8; 32]> for Ec256SharedKey

source§

impl AsRef<[u8; 32]> for Sha256Hash

source§

impl AsRef<[u8; 32]> for Sm3Hash

source§

impl AsRef<[u8; 32]> for BaseName

source§

impl AsRef<[u8; 32]> for KeyId

source§

impl AsRef<[u8; 32]> for Measurement

source§

impl AsRef<[u8; 48]> for Sha384Hash

source§

impl AsRef<[u8; 48]> for QuoteHeader

source§

impl AsRef<[u8; 48]> for TeeMeasurement

source§

impl AsRef<[u8; 48]> for Quote4Header

source§

impl AsRef<[u8; 64]> for Ec256PublicKey

source§

impl AsRef<[u8; 64]> for Ec256Signature

source§

impl AsRef<[u8; 64]> for CDcapRaMsg1

source§

impl AsRef<[u8; 64]> for TeeReportData

source§

impl AsRef<[u8; 64]> for ConfigId

source§

impl AsRef<[u8; 64]> for ReportData

source§

impl AsRef<[u8; 66]> for KssConfig

source§

impl AsRef<[u8; 68]> for CRaMsg1

source§

impl AsRef<[u8; 101]> for PlatformInfo

source§

impl AsRef<[u8; 104]> for EnclaveIdentity

source§

impl AsRef<[u8; 148]> for CDcapURaMsg2

source§

impl AsRef<[u8; 158]> for QlAttKeyId

source§

impl AsRef<[u8; 176]> for QlQvSupplemental

source§

impl AsRef<[u8; 239]> for TeeTcbInfo

source§

impl AsRef<[u8; 256]> for Rsa2048Signature

source§

impl AsRef<[u8; 256]> for CDhSession

source§

impl AsRef<[u8; 256]> for PsSecPropDesc

source§

impl AsRef<[u8; 256]> for AttKeyId

source§

impl AsRef<[u8; 256]> for AttKeyIdExt

source§

impl AsRef<[u8; 256]> for Report2Mac

source§

impl AsRef<[u8; 260]> for Rsa2048PubKey

source§

impl AsRef<[u8; 260]> for CEnclaveIdentity

source§

impl AsRef<[u8; 384]> for Rsa3072Signature

source§

impl AsRef<[u8; 384]> for ReportBody

source§

impl AsRef<[u8; 388]> for Rsa3072PubKey

source§

impl AsRef<[u8; 404]> for QlPPIDRsa3072EncryptedCertInfo

source§

impl AsRef<[u8; 432]> for Report

source§

impl AsRef<[u8; 512]> for Rsa2048PrivKey

source§

impl AsRef<[u8; 512]> for CDhMsg2

source§

impl AsRef<[u8; 512]> for KeyRequest

source§

impl AsRef<[u8; 512]> for TargetInfo

source§

impl AsRef<[u8; 512]> for TeeInfo

source§

impl AsRef<[u8; 514]> for QlQveCollateralParam

source§

impl AsRef<[u8; 516]> for Rsa2048Key

source§

impl AsRef<[u8; 576]> for CDhMsg1

source§

impl AsRef<[u8; 584]> for Report2Body

source§

impl AsRef<[u8; 768]> for Rsa3072PrivKey

source§

impl AsRef<[u8; 772]> for Rsa3072Key

source§

impl AsRef<[u8; 960]> for QlQeReportInfo

source§

impl AsRef<[u8; 960]> for QeReportInfo

source§

impl AsRef<[u8; 1024]> for Report2

source§

impl AsRef<[u8; 1156]> for Rsa2048Param

source§

impl AsRef<[u8; 1732]> for Rsa3072Param

source§

impl AsRef<[u8]> for str

source§

impl AsRef<[u8]> for HeapBuffer

source§

impl AsRef<[u8]> for OcBuffer

source§

impl AsRef<[u8]> for CDhMsg3

source§

impl AsRef<[u8]> for CRaMsg2

source§

impl AsRef<[u8]> for Quote

source§

impl AsRef<[u8]> for CSealedData

source§

impl AsRef<[u8]> for String

1.55.0 · source§

impl<'a> AsRef<str> for sgx_tstd::string::Drain<'a>

1.55.0 · source§

impl<'a> AsRef<[u8]> for sgx_tstd::string::Drain<'a>

1.46.0 · source§

impl<'a, T, A> AsRef<[T]> for sgx_tstd::vec::Drain<'a, T, A>where A: Allocator,

source§

impl<T> AsRef<[T]> for [T]

1.13.0 · source§

impl<T> AsRef<[T]> for sgx_tstd::slice::Iter<'_, T>

1.53.0 · source§

impl<T> AsRef<[T]> for IterMut<'_, T>

source§

impl<T> AsRef<T> for Cow<'_, T>where T: ToOwned + ?Sized,

source§

impl<T> AsRef<T> for AlignBox<T>

1.46.0 · source§

impl<T, A> AsRef<[T]> for IntoIter<T, A>where A: Allocator,

source§

impl<T, A> AsRef<[T]> for Vec<T, A>where A: Allocator,

source§

impl<T, A> AsRef<Vec<T, A>> for Vec<T, A>where A: Allocator,

1.5.0 · source§

impl<T, A> AsRef<T> for Box<T, A>where A: Allocator, T: ?Sized,

1.5.0 · source§

impl<T, A> AsRef<T> for Rc<T, A>where A: Allocator, T: ?Sized,

1.5.0 · source§

impl<T, A> AsRef<T> for Arc<T, A>where A: Allocator, T: ?Sized,

source§

impl<T, U> AsRef<U> for &Twhere T: AsRef<U> + ?Sized, U: ?Sized,

source§

impl<T, U> AsRef<U> for &mut Twhere T: AsRef<U> + ?Sized, U: ?Sized,

source§

impl<T, const N: usize> AsRef<[T; N]> for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement,

source§

impl<T, const N: usize> AsRef<[T]> for [T; N]

source§

impl<T, const N: usize> AsRef<[T]> for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement,