Skip to content

TimeSeries implements core::iter::ExactSizeIterator but doesn't provide upper bound on size_hint #131

Closed
@d3v-null

Description

@d3v-null

Hello!
Big fan of this library by the way, love your work.

I wanted to see if I could get the length of a TimeSeries without collecting into a Vec, but when I call .len() I get the error below.

thread 'main' panicked at 'assertion failed: `(left == right)`
  left: `None`,
 right: `Some(0)`', /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/iter/traits/exact_size.rs:108:9
stack backtrace:
   0: rust_begin_unwind
             at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:584:5
   1: core::panicking::panic_fmt
             at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/panicking.rs:143:14
   2: core::panicking::assert_failed_inner
   3: core::panicking::assert_failed
             at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/panicking.rs:182:5
   4: core::iter::traits::exact_size::ExactSizeIterator::len
             at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/iter/traits/exact_size.rs:108:9
   5: hifitimetest::main
             at ./src/bin/hifitimetest.rs:9:10
   6: core::ops::function::FnOnce::call_once
             at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/ops/function.rs:227:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

This seems to be because ExactSizeIterator is expecting an upper bound on size_hint, which I found to always be None.

If there's no intention of providing .len(), and TimeSeries impls ExactSizeIterator for some other reason, then that's understandable, but it's just not clear from the docco.

Here's some code to demo what I mean.

use hifitime::{Duration, Epoch, TimeSeries, Unit::Microsecond};

fn main() {
    let start = Epoch::from_gregorian_str("2022-07-14T02:56:11.228271007 UTC").unwrap();
    let step = Duration::from_f64(0.5, Microsecond);
    let steps = 100_000_000_000_000;
    let end = start + steps * step;
    let times = TimeSeries::exclusive(start, end, step);
    dbg!(times.size_hint());
    assert_eq!(times.len(), steps as usize);
}

my cargo.toml:

[package]
...
edition = "2021"
rust-version = "1.60"

[dependencies]
hifitime = "3.2.0"

I get

[src/bin/hifitimetest.rs:8] times.size_hint() = (
    0,
    None,
)

and then the error above.

Not a big deal since you can do .count(), it just consumes the iterator and takes a surprisingly long time.

fn main() {
    let start = Epoch::from_gregorian_str("2022-07-14T02:56:11.228271007 UTC").unwrap();
    let step = Duration::from_f64(0.5, Microsecond);
    let steps = 1_000_000_000;
    let end = start + 1_000_000_000 * step;
    let times = TimeSeries::exclusive(start, end, step);

    let timer_start = Epoch::now().unwrap();
    dbg!(times.size_hint());
    assert_eq!(times.count(), steps as usize);
    let timer_end = Epoch::now().unwrap();
    eprintln!("took {}seconds", (timer_end - timer_start).in_seconds());
}
[src/bin/hifitimetest.rs:11] times.size_hint() = (
    0,
    None,
)
took 65.855730688seconds

version info

➜ cargo -Vv
cargo 1.61.0 (a028ae4 2022-04-29)
release: 1.61.0
commit-hash: a028ae42fc1376571de836be702e840ca8e060c2
commit-date: 2022-04-29
host: x86_64-unknown-linux-gnu
libgit2: 1.4.2 (sys:0.14.2 vendored)
libcurl: 7.80.0-DEV (sys:0.4.51+curl-7.80.0 vendored ssl:OpenSSL/1.1.1m)
os: Arch Linux [64-bit]

➜ cargo tree --package hifitime
hifitime v3.2.0
├── libm v0.2.2
├── regex v1.6.0
│   ├── aho-corasick v0.7.18
│   │   └── memchr v2.5.0
│   ├── memchr v2.5.0
│   └── regex-syntax v0.6.27
├── serde v1.0.139
└── serde_derive v1.0.139 (proc-macro)
    ├── proc-macro2 v1.0.40
    │   └── unicode-ident v1.0.1
    ├── quote v1.0.20
    │   └── proc-macro2 v1.0.40 (*)
    └── syn v1.0.98
        ├── proc-macro2 v1.0.40 (*)
        ├── quote v1.0.20 (*)
        └── unicode-ident v1.0.1

Thanks!

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions