Skip to content

Commit a6c91e1

Browse files
committed
deku: Lift bits feature dependency on alloc
Allow selection of bits feature in no-alloc environments. Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
1 parent e130bad commit a6c91e1

30 files changed

Lines changed: 81 additions & 49 deletions

Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ default = ["std", "bits", "descriptive-errors"]
2424
std = ["deku_derive/std", "bitvec?/std", "alloc", "no_std_io/std"]
2525
alloc = ["bitvec?/alloc", "deku_derive/alloc", "no_std_io/alloc" ]
2626
logging = ["deku_derive/logging", "log"]
27-
bits = ["dep:bitvec", "deku_derive/bits", "alloc" ]
27+
bits = ["dep:bitvec", "deku_derive/bits" ]
2828
descriptive-errors = ["alloc"]
2929

3030
[dependencies]
@@ -60,27 +60,27 @@ manual-unwrap-or-default = "allow"
6060

6161
[[example]]
6262
name = "custom_reader_and_writer"
63-
required-features = ["bits"]
63+
required-features = ["alloc", "bits"]
6464

6565
[[example]]
6666
name = "deku_input"
6767
required-features = ["std"]
6868

6969
[[example]]
7070
name = "enums_catch_all"
71-
required-features = ["bits"]
71+
required-features = ["alloc", "bits"]
7272

7373
[[example]]
7474
name = "enums"
7575
required-features = ["std"]
7676

7777
[[example]]
7878
name = "example"
79-
required-features = ["bits"]
79+
required-features = ["alloc", "bits"]
8080

8181
[[example]]
8282
name = "ipv4"
83-
required-features = ["bits"]
83+
required-features = ["alloc", "bits"]
8484

8585
[[example]]
8686
name = "80211"

deku-derive/src/macros/deku_write.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
9999

100100
// Implement `DekuContainerWrite` for types that don't need a context
101101
if input.ctx.is_none() || (input.ctx.is_some() && input.ctx_default.is_some()) {
102-
#[cfg(feature = "bits")]
102+
#[cfg(all(feature = "alloc", feature = "bits"))]
103103
tokens.extend(quote! {
104104
#[automatically_derived]
105105
impl #imp core::convert::TryFrom<#ident> for ::#crate_::bitvec::BitVec<u8, ::#crate_::bitvec::Msb0> #wher {
@@ -357,7 +357,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
357357

358358
// Implement `DekuContainerWrite` for types that don't need a context
359359
if input.ctx.is_none() || (input.ctx.is_some() && input.ctx_default.is_some()) {
360-
#[cfg(feature = "bits")]
360+
#[cfg(all(feature = "alloc", feature = "bits"))]
361361
tokens.extend(quote! {
362362
#[automatically_derived]
363363
impl #imp core::convert::TryFrom<#ident> for ::#crate_::bitvec::BitVec<u8, ::#crate_::bitvec::Msb0> #wher {

src/attributes.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ pub struct BigEndian {
230230
t: u8,
231231
}
232232
233-
# #[cfg(feature = "bits")]
233+
# #[cfg(all(feature = "alloc", feature = "bits"))]
234234
# fn main() {
235235
let data = vec![0x10, 0x81];
236236
let big_endian = BigEndian::try_from(data.as_ref()).unwrap();
@@ -245,7 +245,7 @@ let bytes = big_endian.to_bytes().unwrap();
245245
assert_eq!(bytes, data);
246246
# }
247247
#
248-
# #[cfg(not(feature = "bits"))]
248+
# #[cfg(not(all(feature = "alloc", feature = "bits")))]
249249
# fn main() {}
250250
````
251251
### Field Example
@@ -261,7 +261,7 @@ pub struct LsbField {
261261
t: u8,
262262
}
263263
264-
# #[cfg(feature = "bits")]
264+
# #[cfg(all(feature = "alloc", feature = "bits"))]
265265
# fn main() {
266266
let data = vec![0x40, 0x40];
267267
let more_first = LsbField::try_from(data.as_ref()).unwrap();
@@ -270,7 +270,7 @@ let bytes = more_first.to_bytes().unwrap();
270270
assert_eq!(bytes, data);
271271
# }
272272
#
273-
# #[cfg(not(feature = "bits"))]
273+
# #[cfg(not(all(feature = "alloc", feature = "bits")))]
274274
# fn main() {}
275275
```
276276
@@ -1570,7 +1570,7 @@ Specify custom reader or writer tokens for reading a field or variant
15701570
Example:
15711571
```rust
15721572
use core::convert::{TryInto, TryFrom};
1573-
# #[cfg(feature = "bits")]
1573+
# #[cfg(all(feature = "alloc", feature = "bits"))]
15741574
use deku::bitvec::{BitSlice, BitVec, Msb0};
15751575
use deku::prelude::*;
15761576

src/impls/cstring.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ where
6767
}
6868

6969
#[cfg(test)]
70+
#[cfg(all(feature = "alloc", feature = "descriptive-errors"))]
7071
mod tests {
71-
#[cfg(feature = "alloc")]
7272
use alloc::vec;
7373
use no_std_io::io::Cursor;
7474
use rstest::rstest;
@@ -77,7 +77,6 @@ mod tests {
7777

7878
use super::*;
7979

80-
#[cfg(feature = "alloc")]
8180
#[rstest(input, len, expected, expected_rest,
8281
case(
8382
b"test\0",

src/impls/hashmap.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,17 +241,16 @@ impl<K: DekuWriter<Ctx>, V: DekuWriter<Ctx>, S, Ctx: Copy> DekuWriter<Ctx> for H
241241
}
242242
}
243243

244+
#[cfg(all(feature = "bits", feature = "descriptive-errors"))]
244245
#[cfg(test)]
245246
mod tests {
246247
use no_std_io::io::Cursor;
247248
use rstest::rstest;
248249
use rustc_hash::FxHashMap;
249250

250-
#[cfg(feature = "bits")]
251251
use crate::reader::Reader;
252252

253253
use super::*;
254-
#[cfg(feature = "bits")]
255254
use bitvec::prelude::*;
256255

257256
// Macro to create a deterministic HashMap for tests
@@ -271,7 +270,6 @@ mod tests {
271270
};
272271
);
273272

274-
#[cfg(feature = "bits")]
275273
#[rstest(input, endian, bit_size, limit, expected, expected_rest_bits, expected_rest_bytes,
276274
case::count_0([0xAA].as_ref(), Endian::Little, Some(8), 0.into(), FxHashMap::default(), bits![u8, Msb0;], &[0xaa]),
277275
case::count_1([0x01, 0xAA, 0x02, 0xBB].as_ref(), Endian::Little, Some(8), 1.into(), fxhashmap!{0x01 => 0xAA}, bits![u8, Msb0;], &[0x02, 0xbb]),

src/impls/hashset.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ mod tests {
225225

226226
use super::*;
227227

228-
#[cfg(feature = "bits")]
228+
#[cfg(all(feature = "bits", feature = "descriptive-errors"))]
229229
#[rstest(input, endian, bit_size, limit, expected, expected_rest_bits, expected_rest_bytes,
230230
case::count_0([0xAA].as_ref(), Endian::Little, Some(8), 0.into(), FxHashSet::default(), bits![u8, Msb0;], &[0xaa]),
231231
case::count_1([0xAA, 0xBB].as_ref(), Endian::Little, Some(8), 1.into(), vec![0xAA].into_iter().collect(), bits![u8, Msb0;], &[0xbb]),

src/impls/nonzero.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@ macro_rules! ImplDekuTraitsCtx {
3939
macro_rules! ImplDekuTraits {
4040
($typ:ty, $readtype:ty) => {
4141
ImplDekuTraitsCtx!($typ, $readtype, (), ());
42-
#[cfg(feature = "bits")]
42+
#[cfg(all(feature = "bits", feature = "alloc"))]
4343
ImplDekuTraitsCtx!($typ, $readtype, (endian, bitsize), (Endian, BitSize));
4444
ImplDekuTraitsCtx!($typ, $readtype, (endian, bytesize), (Endian, ByteSize));
45-
#[cfg(feature = "bits")]
45+
#[cfg(all(feature = "bits", feature = "alloc"))]
4646
ImplDekuTraitsCtx!(
4747
$typ,
4848
$readtype,

src/impls/primitive.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -444,12 +444,12 @@ macro_rules! ImplDekuReadBytes {
444444
<$typ>::from_be_bytes(buf.try_into().unwrap())
445445
}
446446
}
447-
#[cfg(feature = "bits")]
447+
#[cfg(all(feature = "bits", feature = "alloc"))]
448448
ReaderRet::Bits(Some(bits)) => {
449449
let a = <$typ>::read(&bits, (endian, size, order))?;
450450
a.1
451451
}
452-
#[cfg(feature = "bits")]
452+
#[cfg(all(feature = "bits", feature = "alloc"))]
453453
ReaderRet::Bits(None) => {
454454
return Err(deku_error!(DekuError::Parse, "no bits read from reader"));
455455
}
@@ -602,12 +602,12 @@ macro_rules! ImplDekuReadSignExtend {
602602
<$typ>::from_be_bytes(buf.try_into().unwrap())
603603
}
604604
}
605-
#[cfg(feature = "bits")]
605+
#[cfg(all(feature = "bits", feature = "alloc"))]
606606
ReaderRet::Bits(Some(bits)) => {
607607
let a = <$typ>::read(&bits, (endian, size, order))?;
608608
a.1
609609
}
610-
#[cfg(feature = "bits")]
610+
#[cfg(all(feature = "bits", feature = "alloc"))]
611611
ReaderRet::Bits(None) => {
612612
return Err(deku_error!(DekuError::Parse, "no bits read from reader"));
613613
}
@@ -1370,7 +1370,7 @@ mod tests {
13701370
native_endian!(-0.006_f64)
13711371
);
13721372

1373-
#[cfg(feature = "bits")]
1373+
#[cfg(all(feature = "bits", feature = "descriptive-errors"))]
13741374
#[rstest(input, endian, bit_size, expected, expected_rest_bits, expected_rest_bytes,
13751375
case::normal([0xDD, 0xCC, 0xBB, 0xAA].as_ref(), Endian::Little, Some(32), 0xAABB_CCDD, bits![u8, Msb0;], &[]),
13761376
case::normal([0xDD, 0xCC, 0xBB, 0xAA].as_ref(), Endian::Big, Some(32), 0xDDCC_BBAA, bits![u8, Msb0;], &[]),
@@ -1412,6 +1412,7 @@ mod tests {
14121412
assert_eq!(expected_rest_bytes, buf);
14131413
}
14141414

1415+
#[cfg(feature = "descriptive-errors")]
14151416
#[rstest(input, endian, byte_size, expected, expected_rest_bytes,
14161417
case::normal_be([0xDD, 0xCC, 0xBB, 0xAA].as_ref(), Endian::Big, Some(4), 0xDDCC_BBAA, &[]),
14171418
case::normal_le([0xDD, 0xCC, 0xBB, 0xAA].as_ref(), Endian::Little, Some(4), 0xAABB_CCDD, &[]),
@@ -1448,7 +1449,7 @@ mod tests {
14481449
assert_eq!(expected_rest_bytes, buf);
14491450
}
14501451

1451-
#[cfg(feature = "bits")]
1452+
#[cfg(all(feature = "bits", feature = "descriptive-errors"))]
14521453
#[rstest(input, endian, bit_size, expected, expected_leftover,
14531454
case::normal_le(0xDDCC_BBAA, Endian::Little, None, vec![0xAA, 0xBB, 0xCC, 0xDD], vec![]),
14541455
case::normal_be(0xDDCC_BBAA, Endian::Big, None, vec![0xDD, 0xCC, 0xBB, 0xAA], vec![]),
@@ -1476,6 +1477,7 @@ mod tests {
14761477
assert_eq!(expected, writer.inner.into_inner());
14771478
}
14781479

1480+
#[cfg(feature = "descriptive-errors")]
14791481
#[rstest(input, endian, byte_size, expected,
14801482
case::normal_le(0xDDCC_BBAA, Endian::Little, None, vec![0xAA, 0xBB, 0xCC, 0xDD]),
14811483
case::normal_be(0xDDCC_BBAA, Endian::Big, None, vec![0xDD, 0xCC, 0xBB, 0xAA]),

src/impls/vec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ mod tests {
250250
assert_eq!(expected_rest_bytes, buf);
251251
}
252252

253-
#[cfg(feature = "bits")]
253+
#[cfg(all(feature = "bits", feature = "descriptive-errors"))]
254254
#[rstest(input, endian, bit_size, limit, expected, expected_rest_bits, expected_rest_bytes,
255255
case::count_0([0xAA].as_ref(), Endian::Little, Some(8), 0.into(), vec![], bits![u8, Msb0;], &[0xaa]),
256256
case::count_1([0xAA, 0xBB].as_ref(), Endian::Little, Some(8), 1.into(), vec![0xAA], bits![u8, Msb0;], &[0xbb]),

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ but we could also use [from_reader](DekuContainerRead::from_reader).
3535
```rust
3636
use deku::prelude::*;
3737
38-
# #[cfg(feature = "bits")]
38+
# #[cfg(all(feature = "alloc", feature = "bits"))]
3939
#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
4040
#[deku(endian = "big")]
4141
struct DekuTest {
@@ -46,7 +46,7 @@ struct DekuTest {
4646
field_c: u16,
4747
}
4848
49-
# #[cfg(feature = "bits")]
49+
# #[cfg(all(feature = "alloc", feature = "bits"))]
5050
# fn main() {
5151
let data: Vec<u8> = vec![0b0110_1001, 0xBE, 0xEF];
5252
let (_rest, mut val) = DekuTest::from_bytes((data.as_ref(), 0)).unwrap();
@@ -62,7 +62,7 @@ let data_out = val.to_bytes().unwrap();
6262
assert_eq!(vec![0b0110_1001, 0xC0, 0xFE], data_out);
6363
# }
6464
#
65-
# #[cfg(not(feature = "bits"))]
65+
# #[cfg(not(all(feature = "alloc", feature = "bits")))]
6666
# fn main() {}
6767
```
6868
@@ -709,7 +709,7 @@ pub trait DekuContainerWrite: DekuWriter<()> {
709709
/// assert_eq!(deku::bitvec::bitvec![1, 1, 1, 1, 0, 0, 0, 1, 1], bits);
710710
/// ```
711711
#[inline(always)]
712-
#[cfg(feature = "bits")]
712+
#[cfg(all(feature = "bits", feature = "alloc"))]
713713
fn to_bits(&self) -> Result<bitvec::BitVec<u8, bitvec::Msb0>, DekuError> {
714714
let mut out_buf = Vec::new();
715715
let mut cursor = no_std_io::Cursor::new(&mut out_buf);

0 commit comments

Comments
 (0)