diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2438d88..779b7de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,6 +12,26 @@ jobs: - run: ./examples/run_examples.sh - run: ./examples/example_crates/run_example_crates.sh + multi-targets-no-std: + name: multi-targets no_std + runs-on: ubuntu-latest + strategy: + matrix: + target: + - x86_64-unknown-linux-gnu + - x86_64-unknown-none + - aarch64-unknown-linux-gnu + - aarch64-unknown-none-softfloat + - riscv64gc-unknown-none-elf + - riscv64imac-unknown-none-elf + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + components: rustc, cargo + - run: cargo build --target ${{ matrix.target }} --no-default-features + rustfmt-check: name: rustfmt check runs-on: ubuntu-latest diff --git a/Cargo.toml b/Cargo.toml index 83fa417..56467e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ exclude = ["examples"] authors = [ "aarkegz " ] license = "MIT" edition = "2021" -version = "1.1.0" +version = "1.2.0" repository = "https://github.com/GeminiLab/enumerable/" include = [ "README.md", @@ -33,4 +33,4 @@ std = ["enumerable_derive/std"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -enumerable_derive = { path = "enumerable_derive", version = "=1.1.0" } +enumerable_derive = { path = "enumerable_derive", version = "=1.2.0" } diff --git a/examples/example_crates/no_std/Cargo.toml b/examples/example_crates/no_std/Cargo.toml index 3611bc2..2b9acaa 100644 --- a/examples/example_crates/no_std/Cargo.toml +++ b/examples/example_crates/no_std/Cargo.toml @@ -9,3 +9,8 @@ version = "0.1.0" [dependencies] enumerable = { path = "../../../", default-features = false } + +[profile] +dev.panic = "abort" +release.panic = "abort" + diff --git a/examples/example_crates/no_std/src/main.rs b/examples/example_crates/no_std/src/main.rs index 534d6c8..54e6861 100644 --- a/examples/example_crates/no_std/src/main.rs +++ b/examples/example_crates/no_std/src/main.rs @@ -1,6 +1,6 @@ //! This example tests the `Enumerable` derive macro in a `no_std` environment. - -#![no_std] +//! +//! This example itself is not `no_std`, but it uses the `enumerable` crate with `default-features = false`. use enumerable::Enumerable; diff --git a/src/impl_built_in.rs b/src/impl_built_in.rs index bd50cab..1bfcb46 100644 --- a/src/impl_built_in.rs +++ b/src/impl_built_in.rs @@ -111,6 +111,26 @@ where self.inner.next().map(Some) } } + + /// Implements the standard library's `Iterator::size_hint` method. + /// + /// This method returns the lower and upper bound of the iterator. For `OptionEnumerator`, + /// the bounds are adjusted to account for the `None` variant: + /// - If `self.first` is `true`, the lower bound is incremented by 1, and the upper bound + /// is incremented by 1 (if it exists), to include the `None` variant. + /// - Otherwise, the bounds are directly derived from the inner enumerator. + fn size_hint(&self) -> (usize, Option) { + let (lower, upper) = self.inner.size_hint(); + + if self.first { + ( + lower.saturating_add(1), + upper.and_then(|u| u.checked_add(1)), + ) + } else { + (lower, upper) + } + } } /// This is an implementation of the `Enumerable` trait for `Option` where `T` is `Enumerable`. diff --git a/src/lib.rs b/src/lib.rs index 160619d..154b3e8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(not(feature = "std"), no_std)] #![doc = include_str!("./CRATE_DOC.md")] /// `Enumerable` is a trait for types that can have their possible values enumerated. diff --git a/src/test/mod.rs b/src/test/mod.rs index 297bb8f..63093ef 100644 --- a/src/test/mod.rs +++ b/src/test/mod.rs @@ -16,7 +16,7 @@ mod primitive { #[test] fn test_option_bool() { - assert_enumerator_eq(vec![None, Some(false), Some(true)]); + assert_enumerator_eq_with_size_hint(vec![None, Some(false), Some(true)]); } #[test]