Skip to content

Commit b75d6f1

Browse files
authored
Merge pull request #567 from reitermarkus/fix-bytes-feature
Fix `bytes` feature.
2 parents 021a544 + fe124c0 commit b75d6f1

File tree

3 files changed

+91
-70
lines changed

3 files changed

+91
-70
lines changed

.github/workflows/build.yml

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99

1010
env:
1111
CARGO_TERM_COLOR: always
12-
RUSTFLAGS: '-D warnings'
12+
RUSTFLAGS: "-D warnings"
1313

1414
jobs:
1515
# Run MIRI tests on nightly
@@ -163,18 +163,25 @@ jobs:
163163

164164
- name: cargo check
165165
run: |
166-
cargo check --target=${{ matrix.target }}
167-
cargo check --target=${{ matrix.target }} --features="portable-atomic-critical-section"
168-
cargo check --target=${{ matrix.target }} --features="ufmt serde defmt mpmc_large alloc"
166+
cargo check --target="${target}"
167+
cargo check --target="${target}" --features="alloc"
168+
169+
# Needs native atomics, since `bytes` doesn't support `portable-atomic`.
170+
if [ "${target}" != "riscv32imc-unknown-none-elf" ] && [ "${target}" != "thumbv6m-none-eabi" ]; then
171+
cargo check --target="${target}" --features="bytes"
172+
fi
173+
174+
cargo check --target="${target}" --features="defmt"
175+
cargo check --target="${target}" --features="mpmc_large"
176+
cargo check --target="${target}" --features="portable-atomic-critical-section"
177+
cargo check --target="${target}" --features="serde"
178+
cargo check --target="${target}" --features="ufmt"
179+
env:
180+
target: ${{ matrix.target }}
169181

170182
doc:
171183
name: doc
172184
runs-on: ubuntu-latest
173-
strategy:
174-
matrix:
175-
target:
176-
- x86_64-unknown-linux-gnu
177-
- thumbv7m-none-eabi
178185
steps:
179186
- name: Checkout
180187
uses: actions/checkout@v4
@@ -201,14 +208,40 @@ jobs:
201208
${{ runner.OS }}-build-${{ hashFiles('**/Cargo.lock') }}
202209
${{ runner.OS }}-build-
203210
204-
- name: Install nightly Rust with target (${{ matrix.target }})
211+
- name: Get metadata
212+
id: metadata
213+
run: |
214+
set -euo pipefail
215+
216+
docsrs_metadata="$(cargo metadata --format-version 1 | jq '.packages[] | select(.name == "heapless") | .metadata.docs.rs')"
217+
features=($(jq --raw-output '.features[]' <<< "${docsrs_metadata}"))
218+
rustdocflags=(-D warnings --cfg docsrs $(jq --raw-output '.["rustdoc-args"][]' <<< "${docsrs_metadata}"))
219+
targets=($(jq --raw-output '.targets[]' <<< "${docsrs_metadata}"))
220+
221+
echo "features=${features[*]}" >> "${GITHUB_OUTPUT}"
222+
echo "rustdocflags=${rustdocflags[*]}" >> "${GITHUB_OUTPUT}"
223+
echo "targets=${targets[*]}" >> "${GITHUB_OUTPUT}"
224+
225+
- name: Install nightly Rust with targets (${{ steps.metadata.outputs.targets }})
205226
uses: dtolnay/rust-toolchain@nightly
206227
with:
207-
targets: ${{ matrix.target }}
228+
targets: ${{ steps.metadata.outputs.targets }}
208229

209230
- name: cargo rustdoc
210-
env: {"RUSTDOCFLAGS": "-D warnings --cfg docsrs"}
211-
run: cargo rustdoc --target=${{ matrix.target }} --features="ufmt serde defmt mpmc_large portable-atomic-critical-section alloc"
231+
run: |
232+
set -euo pipefail
233+
234+
targets=(${targets})
235+
236+
for target in "${targets[@]}"; do
237+
set -x
238+
cargo rustdoc --target "${target}" --features "${features}"
239+
set +x
240+
done
241+
env:
242+
features: ${{ steps.metadata.outputs.features }}
243+
RUSTDOCFLAGS: ${{ steps.metadata.outputs.rustdocflags }}
244+
targets: ${{ steps.metadata.outputs.targets }}
212245

213246
# Run cpass tests
214247
testcpass:
@@ -255,7 +288,7 @@ jobs:
255288
targets: ${{ matrix.target }}
256289

257290
- name: cargo test
258-
run: cargo test --test cpass --target=${{ matrix.target }} --features=serde ${{ matrix.buildtype }}
291+
run: cargo test --test cpass --target=${{ matrix.target }} ${{ matrix.buildtype }}
259292

260293
# Run test suite for UI
261294
testtsan:

CHANGELOG.md

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- `bytes::BufMut` is now implemented on `VecInner`.
13+
14+
### Fixed
15+
16+
- CI now uses flags specified in `Cargo.toml` for `rustdoc` tests.
17+
18+
### Removed
19+
20+
- Removed invalid `bytes::Buf` implementation.
21+
1022
## [v0.9.0] - 2025-04-28
1123

1224
### Added
@@ -90,13 +102,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
90102
- The `IndexMapValues` type is now inside the `index_map` module and has been renamed to `Values`.
91103
- The `IndexMapValuesMut` type is now inside the `index_map` module and has been renamed to `ValuesMut`.
92104
- The `histbuf` module has been renamed to `history_buf`.
93-
- The `HistoryBuffer` type has been renamed to `HistoryBuf`.
94-
- The `HistoryBufferView` type has been renamed to `HistoryBufView`.
95-
- The `OwnedHistBufStorage` type has been renamed to `OwnedHistoryBufStorage`.
96-
- The `ViewHistBufStorage` type has been renamed to `ViewHistoryBufStorage`.
97-
- The `MpMcQueue` type has been renamed to `Queue`.
98-
- The `MpMcQueueView` type has been renamed to `QueueView`.
99-
- The `MpMcQueueInner` type has been renamed to `QueueInner`.
105+
- The `HistoryBuffer` type has been renamed to `HistoryBuf`.
106+
- The `HistoryBufferView` type has been renamed to `HistoryBufView`.
107+
- The `OwnedHistBufStorage` type has been renamed to `OwnedHistoryBufStorage`.
108+
- The `ViewHistBufStorage` type has been renamed to `ViewHistoryBufStorage`.
109+
- The `MpMcQueue` type has been renamed to `Queue`.
110+
- The `MpMcQueueView` type has been renamed to `QueueView`.
111+
- The `MpMcQueueInner` type has been renamed to `QueueInner`.
100112
- Remove `Q*` type aliases for `MpMcQueue`, and rename it to just `Queue`
101113
- Changed `Queue::split` to be `const`.
102114

src/bytes.rs

Lines changed: 25 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,22 @@
1-
//! Bytes implementations for heapless types
1+
//! Implementations of `bytes` traits for `heapless` types.
22
3-
use crate::Vec;
4-
use bytes::{buf::UninitSlice, Buf, BufMut};
3+
use crate::{
4+
len_type::LenType,
5+
vec::{VecInner, VecStorage},
6+
};
7+
use bytes::{buf::UninitSlice, BufMut};
58

6-
unsafe impl<const N: usize> Buf for Vec<u8, N> {
7-
#[inline]
8-
fn remaining(&self) -> usize {
9-
self.len()
10-
}
11-
12-
#[inline]
13-
fn chunk(&mut self) -> &[u8] {
14-
self.as_slice()
15-
}
16-
17-
#[inline]
18-
unsafe fn advance(&mut self, cnt: usize) {
19-
assert!(
20-
cnt <= self.remaining(),
21-
"cannot advance past `remaining`: {:?} <= {:?}",
22-
cnt,
23-
self.remaining(),
24-
);
25-
unsafe {
26-
// SAFETY: We've checked that `cnt` <= `self.remaining()` and we know that
27-
// `self.remaining()` <= `self.cap`.
28-
self.advance_unchecked(cnt);
29-
}
30-
}
31-
}
32-
33-
unsafe impl<const N: usize> BufMut for Vec<u8, N> {
9+
unsafe impl<S: VecStorage<u8> + ?Sized, LenT: LenType> BufMut for VecInner<u8, LenT, S> {
3410
#[inline]
3511
fn remaining_mut(&self) -> usize {
36-
N - self.len()
12+
self.capacity() - self.len()
3713
}
3814

3915
#[inline]
4016
unsafe fn advance_mut(&mut self, cnt: usize) {
4117
let len = self.len();
4218
let pos = len + cnt;
43-
if pos >= N {
19+
if pos >= self.capacity() {
4420
panic!("Advance out of range");
4521
}
4622
self.set_len(pos);
@@ -50,56 +26,56 @@ unsafe impl<const N: usize> BufMut for Vec<u8, N> {
5026
fn chunk_mut(&mut self) -> &mut UninitSlice {
5127
let len = self.len();
5228
let ptr = self.as_mut_ptr();
53-
unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, N)[len..] }
29+
unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, self.capacity())[len..] }
5430
}
5531
}
5632

5733
#[cfg(test)]
5834
mod tests {
59-
use crate::Vec;
35+
use crate::{Vec, VecView};
6036
use bytes::BufMut;
6137

6238
#[test]
6339
#[should_panic]
64-
fn buf_advance_out_of_bounds() {
40+
fn buf_mut_advance_mut_out_of_bounds() {
6541
let mut vec: Vec<u8, 8> = Vec::new();
66-
vec.advance(9)
42+
unsafe { vec.advance_mut(9) };
6743
}
6844

6945
#[test]
70-
fn buf_remaining() {
46+
fn buf_mut_remaining_mut() {
7147
let mut vec: Vec<u8, 8> = Vec::new();
72-
assert_eq!(vec.remaining(), 8);
48+
assert_eq!(vec.remaining_mut(), 8);
7349
vec.push(42).unwrap();
74-
assert_eq!(vec.remaining(), 7);
50+
assert_eq!(vec.remaining_mut(), 7);
7551
}
7652

7753
#[test]
78-
fn buf_chunk() {
54+
fn buf_mut_chunk_mut() {
7955
let mut vec: Vec<u8, 8> = Vec::new();
80-
assert_eq!(vec.chunk().len(), 8);
56+
assert_eq!(vec.chunk_mut().len(), 8);
8157
unsafe { vec.advance_mut(1) };
82-
assert_eq!(vec.chunk().len(), 7);
58+
assert_eq!(vec.chunk_mut().len(), 7);
8359
}
8460

8561
#[test]
8662
#[should_panic]
87-
fn buf_mut_advance_mut_out_of_bounds() {
88-
let mut vec: Vec<u8, 8> = Vec::new();
63+
fn buf_mut_advance_mut_out_of_bounds_view() {
64+
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
8965
unsafe { vec.advance_mut(9) };
9066
}
9167

9268
#[test]
93-
fn buf_mut_remaining_mut() {
94-
let mut vec: Vec<u8, 8> = Vec::new();
69+
fn buf_mut_remaining_mut_view() {
70+
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
9571
assert_eq!(vec.remaining_mut(), 8);
9672
vec.push(42).unwrap();
9773
assert_eq!(vec.remaining_mut(), 7);
9874
}
9975

10076
#[test]
101-
fn buf_mut_chunk_mut() {
102-
let mut vec: Vec<u8, 8> = Vec::new();
77+
fn buf_mut_chunk_mut_view() {
78+
let vec: &mut VecView<u8, u8> = &mut Vec::<u8, 8>::new();
10379
assert_eq!(vec.chunk_mut().len(), 8);
10480
unsafe { vec.advance_mut(1) };
10581
assert_eq!(vec.chunk_mut().len(), 7);

0 commit comments

Comments
 (0)