@@ -4,3 +4,75 @@ pub use core2::io::*;
4
4
#[ cfg( feature = "std" ) ]
5
5
/// Re-export of either `core2::io` or `std::io`, depending on the `std` feature flag.
6
6
pub use std:: io:: * ;
7
+
8
+ /// Emulation of std::io::Cursor
9
+ #[ derive( Clone , Debug , Default , Eq , PartialEq ) ]
10
+ pub struct Cursor < T > {
11
+ inner : T ,
12
+ pos : u64 ,
13
+ }
14
+
15
+ impl < T > Cursor < T > {
16
+ /// Creates a `Cursor` by wrapping `inner`.
17
+ #[ inline]
18
+ pub fn new ( inner : T ) -> Cursor < T > {
19
+ Cursor { pos : 0 , inner }
20
+ }
21
+
22
+ /// Returns the position read up to thus far.
23
+ #[ inline]
24
+ pub fn position ( & self ) -> u64 {
25
+ self . pos
26
+ }
27
+
28
+ /// Returns the inner buffer.
29
+ ///
30
+ /// This is the whole wrapped buffer, including the bytes already read.
31
+ #[ inline]
32
+ pub fn into_inner ( self ) -> T {
33
+ self . inner
34
+ }
35
+
36
+ /// Gets a reference to the underlying value in this cursor.
37
+ pub fn get_ref ( & self ) -> & T {
38
+ & self . inner
39
+ }
40
+
41
+ /// Gets a mutable reference to the underlying value in this cursor.
42
+ ///
43
+ /// Care should be taken to avoid modifying the internal I/O state of the
44
+ /// underlying value as it may corrupt this cursor's position.
45
+ pub fn get_mut ( & mut self ) -> & mut T {
46
+ & mut self . inner
47
+ }
48
+
49
+ /// Sets the position of this cursor.
50
+ pub fn set_position ( & mut self , pos : u64 ) {
51
+ self . pos = pos;
52
+ }
53
+ }
54
+
55
+ impl < T : AsRef < [ u8 ] > > Read for Cursor < T > {
56
+ fn read ( & mut self , buf : & mut [ u8 ] ) -> Result < usize > {
57
+ let n = Read :: read ( & mut self . fill_buf ( ) ?, buf) ?;
58
+ self . pos += n as u64 ;
59
+ Ok ( n)
60
+ }
61
+
62
+ fn read_exact ( & mut self , buf : & mut [ u8 ] ) -> Result < ( ) > {
63
+ let n = buf. len ( ) ;
64
+ Read :: read_exact ( & mut self . fill_buf ( ) ?, buf) ?;
65
+ self . pos += n as u64 ;
66
+ Ok ( ( ) )
67
+ }
68
+ }
69
+
70
+ impl < T : AsRef < [ u8 ] > > BufRead for Cursor < T > {
71
+ fn fill_buf ( & mut self ) -> Result < & [ u8 ] > {
72
+ let amt = core:: cmp:: min ( self . pos , self . inner . as_ref ( ) . len ( ) as u64 ) ;
73
+ Ok ( & self . inner . as_ref ( ) [ ( amt as usize ) ..] )
74
+ }
75
+ fn consume ( & mut self , amt : usize ) {
76
+ self . pos += amt as u64 ;
77
+ }
78
+ }
0 commit comments