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