@@ -510,6 +510,85 @@ impl WriteAt for io::Sink {
510510 }
511511}
512512
513+ /// The `Size` trait allows for getting the size of a stream.
514+ pub trait Size {
515+ /// Returns the size of the stream.
516+ fn size ( & self ) -> io:: Result < u64 > ;
517+ }
518+
519+ impl Size for [ u8 ] {
520+ #[ inline]
521+ fn size ( & self ) -> io:: Result < u64 > {
522+ Ok ( self . len ( ) as u64 )
523+ }
524+ }
525+
526+ impl < const N : usize > Size for [ u8 ; N ] {
527+ #[ inline]
528+ fn size ( & self ) -> io:: Result < u64 > {
529+ Ok ( self . len ( ) as u64 )
530+ }
531+ }
532+
533+ impl Size for Vec < u8 > {
534+ #[ inline]
535+ fn size ( & self ) -> io:: Result < u64 > {
536+ Ok ( self . len ( ) as u64 )
537+ }
538+ }
539+
540+ impl Size for std:: borrow:: Cow < ' _ , [ u8 ] > {
541+ #[ inline]
542+ fn size ( & self ) -> io:: Result < u64 > {
543+ Ok ( self . len ( ) as u64 )
544+ }
545+ }
546+
547+ impl < T > Size for io:: Cursor < T >
548+ where
549+ T : AsRef < [ u8 ] > ,
550+ {
551+ #[ inline]
552+ fn size ( & self ) -> io:: Result < u64 > {
553+ Ok ( self . get_ref ( ) . as_ref ( ) . len ( ) as u64 )
554+ }
555+ }
556+
557+ impl < T : Size + ?Sized > Size for & ' _ T {
558+ #[ inline]
559+ fn size ( & self ) -> io:: Result < u64 > {
560+ ( * * self ) . size ( )
561+ }
562+ }
563+
564+ impl < T : Size + ?Sized > Size for Box < T > {
565+ #[ inline]
566+ fn size ( & self ) -> io:: Result < u64 > {
567+ ( * * self ) . size ( )
568+ }
569+ }
570+
571+ impl < T : Size + ?Sized > Size for std:: sync:: Arc < T > {
572+ #[ inline]
573+ fn size ( & self ) -> io:: Result < u64 > {
574+ ( * * self ) . size ( )
575+ }
576+ }
577+
578+ impl < T : Size + ?Sized > Size for std:: rc:: Rc < T > {
579+ #[ inline]
580+ fn size ( & self ) -> io:: Result < u64 > {
581+ ( * * self ) . size ( )
582+ }
583+ }
584+
585+ impl Size for io:: Empty {
586+ #[ inline]
587+ fn size ( & self ) -> io:: Result < u64 > {
588+ Ok ( 0 )
589+ }
590+ }
591+
513592#[ cold]
514593fn fill_buffer_error ( ) -> io:: Error {
515594 io:: Error :: new ( io:: ErrorKind :: UnexpectedEof , "failed to fill whole buffer" )
0 commit comments