Skip to content

Commit 26be797

Browse files
committed
v0.6.5 Fixes and IO extensions
- Fix stream being private - Add tokio for IO extensions
1 parent 653adda commit 26be797

File tree

5 files changed

+295
-4
lines changed

5 files changed

+295
-4
lines changed

Cargo.lock

Lines changed: 214 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "hyper_byte"
3-
version = "0.6.0"
3+
version = "0.6.5"
44
license = "MIT"
55
authors = ["EasternGamer"]
66
edition = "2024"
@@ -21,9 +21,12 @@ debug = true
2121

2222
[dependencies]
2323
half = { version = "2.6.0", optional = true }
24+
tokio = { version = "1.46.1", features = ["io-util"], optional = true }
2425

2526
[features]
2627
half = ["dep:half"]
28+
tokio = ["dep:tokio"]
2729

2830
[dev-dependencies]
29-
half = "2.6.0"
31+
half = "2.6.0"
32+
tokio = { version = "1.46.1", features = ["io-util"] }

src/extensions/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod tcp_extensions;

src/extensions/tcp_extensions.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use crate::writers::traits::ByteWriter;
2+
#[cfg(feature = "tokio")]
3+
use tokio::io::AsyncReadExt;
4+
5+
use std::io::Read;
6+
use std::mem::MaybeUninit;
7+
8+
// Taken from nightly, to avoid nightly requirements
9+
#[inline(always)]
10+
const unsafe fn assume_init_mut<T>(array: &mut [MaybeUninit<T>]) -> &mut [T] {
11+
// SAFETY: similar to safety notes for `slice_get_ref`, but we have a
12+
// mutable reference which is also guaranteed to be valid for writes.
13+
unsafe { &mut *(array as *mut [MaybeUninit<T>] as *mut [T]) }
14+
}
15+
16+
17+
pub trait HyperReadExactExt {
18+
fn read_into_exact<T: ByteWriter>(
19+
&mut self,
20+
buffer: &mut T,
21+
amount: usize,
22+
) -> Result<(), std::io::Error>;
23+
}
24+
25+
impl<R: Read> HyperReadExactExt for R {
26+
fn read_into_exact<T: ByteWriter>(
27+
&mut self,
28+
buffer: &mut T,
29+
amount: usize,
30+
) -> Result<(), std::io::Error> {
31+
let inner = buffer.as_mut_vec();
32+
inner.reserve(amount);
33+
34+
let old_length = inner.len();
35+
let reading_slice = unsafe { assume_init_mut(&mut inner.spare_capacity_mut()[..amount]) };
36+
37+
self.read_exact(reading_slice)?;
38+
39+
let new_length = amount + old_length;
40+
unsafe { inner.set_len(new_length) }
41+
Ok(())
42+
}
43+
}
44+
45+
#[cfg(feature = "tokio")]
46+
pub trait AsyncHyperReadExactExt {
47+
async fn read_into_exact<T: ByteWriter>(
48+
&mut self,
49+
buffer: &mut T,
50+
amount: usize,
51+
) -> Result<usize, std::io::Error>;
52+
}
53+
54+
#[cfg(feature = "tokio")]
55+
impl<R: AsyncReadExt + Unpin> AsyncHyperReadExactExt for R {
56+
async fn read_into_exact<T: ByteWriter>(
57+
&mut self,
58+
buffer: &mut T,
59+
amount: usize,
60+
) -> Result<usize, std::io::Error> {
61+
let inner = buffer.as_mut_vec();
62+
inner.reserve(amount);
63+
64+
let length = inner.len();
65+
let reading_slice = unsafe { assume_init_mut(&mut inner.spare_capacity_mut()[..amount]) };
66+
67+
let size_read = self.read_exact(reading_slice).await?;
68+
69+
let new_length = length + size_read;
70+
unsafe { inner.set_len(new_length) };
71+
Ok(size_read)
72+
}
73+
}

src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ pub mod reader;
22
pub mod readers;
33
pub mod writer;
44
pub mod writers;
5-
mod hyper_stream;
5+
pub mod hyper_stream;
6+
pub mod extensions;
67

78
#[cfg(feature = "half")]
89
use half::f16;

0 commit comments

Comments
 (0)