• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2023 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 use std::future::Future;
15 use std::io;
16 use std::pin::Pin;
17 use std::task::{Context, Poll};
18 
19 use crate::io::AsyncSeek;
20 
21 /// A future for seeking the io.
22 ///
23 /// Returned by [`crate::io::AsyncSeekExt::seek`]
24 pub struct SeekTask<'a, T: ?Sized> {
25     seek: &'a mut T,
26     pos: Option<io::SeekFrom>,
27 }
28 
29 impl<'a, T: ?Sized> SeekTask<'a, T> {
new(seek: &'a mut T, pos: io::SeekFrom) -> SeekTask<'a, T>30     pub(crate) fn new(seek: &'a mut T, pos: io::SeekFrom) -> SeekTask<'a, T> {
31         SeekTask {
32             seek,
33             pos: Some(pos),
34         }
35     }
36 }
37 
38 impl<T> Future for SeekTask<'_, T>
39 where
40     T: AsyncSeek + Unpin + ?Sized,
41 {
42     type Output = io::Result<u64>;
43 
poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>44     fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
45         let pos = self.pos.take().unwrap();
46         let ret = Pin::new(&mut self.seek).poll_seek(cx, pos);
47         self.pos = Some(pos);
48         ret
49     }
50 }
51