Skip to content

Commit 8a9668c

Browse files
Assorted updates
1 parent 413c5dc commit 8a9668c

File tree

4 files changed

+86
-43
lines changed

4 files changed

+86
-43
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ repository = "https://github.com/slightlyoutofphase/staticstep"
55
documentation = "https://docs.rs/staticstep/"
66
license = "MIT OR Apache-2.0"
77
readme = "README.md"
8-
version = "0.2.0"
8+
version = "0.2.1"
99
keywords = ["iterator", "iterators", "step", "range", "ranges"]
1010
categories = ["data-structures", "algorithms"]
1111
edition = "2018"

benches/step_by_comparison.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,79 +8,79 @@ use staticstep::*;
88

99
#[bench]
1010
fn inc_by_exclusive(b: &mut Bencher) {
11-
let mut j = 0;
11+
let mut j = 0usize;
1212
b.iter(|| {
13-
for i in (0..32768).inc_by::<16>() {
13+
for i in (0usize..32768usize).inc_by::<16usize>() {
1414
j += black_box(i);
1515
}
1616
});
1717
}
1818

1919
#[bench]
2020
fn inc_by_inclusive(b: &mut Bencher) {
21-
let mut j = 0;
21+
let mut j = 0usize;
2222
b.iter(|| {
23-
for i in (0..=32768).inc_by::<16>() {
23+
for i in (0usize..=32768usize).inc_by::<16usize>() {
2424
j += black_box(i);
2525
}
2626
});
2727
}
2828

2929
#[bench]
3030
fn dec_by_exclusive(b: &mut Bencher) {
31-
let mut j = 0;
31+
let mut j = 0usize;
3232
b.iter(|| {
33-
for i in (32768..0).dec_by::<16>() {
33+
for i in (32768usize..0usize).dec_by::<16usize>() {
3434
j += black_box(i);
3535
}
3636
});
3737
}
3838

3939
#[bench]
4040
fn dec_by_inclusive(b: &mut Bencher) {
41-
let mut j = 0;
41+
let mut j = 0usize;
4242
b.iter(|| {
43-
for i in (32768..=0).dec_by::<16>() {
43+
for i in (32768usize..=0usize).dec_by::<16usize>() {
4444
j += black_box(i);
4545
}
4646
});
4747
}
4848

4949
#[bench]
5050
fn step_by_inc_exclusive(b: &mut Bencher) {
51-
let mut j = 0;
51+
let mut j = 0usize;
5252
b.iter(|| {
53-
for i in (0..32768).step_by(16) {
53+
for i in (0usize..32768usize).step_by(16usize) {
5454
j += black_box(i);
5555
}
5656
});
5757
}
5858

5959
#[bench]
6060
fn step_by_inc_inclusive(b: &mut Bencher) {
61-
let mut j = 0;
61+
let mut j = 0usize;
6262
b.iter(|| {
63-
for i in (0..=32768).step_by(16) {
63+
for i in (0usize..=32768usize).step_by(16usize) {
6464
j += black_box(i);
6565
}
6666
});
6767
}
6868

6969
#[bench]
7070
fn step_by_dec_exclusive(b: &mut Bencher) {
71-
let mut j = 0;
71+
let mut j = 0usize;
7272
b.iter(|| {
73-
for i in (16..32784).step_by(16).rev() {
73+
for i in (16usize..32784usize).step_by(16usize).rev() {
7474
j += black_box(i);
7575
}
7676
});
7777
}
7878

7979
#[bench]
8080
fn step_by_dec_inclusive(b: &mut Bencher) {
81-
let mut j = 0;
81+
let mut j = 0usize;
8282
b.iter(|| {
83-
for i in (0..=32768).rev().step_by(16) {
83+
for i in (0usize..=32768usize).rev().step_by(16usize) {
8484
j += black_box(i);
8585
}
8686
});

src/lib.rs

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ impl<T: Copy + Default + Step, const STEP: usize> IncBy<T, STEP> {
4141
impl<T: Copy + Default + Step, const STEP: usize> DecBy<T, STEP> {
4242
#[inline(always)]
4343
fn new<R: RangeBounds<T>>(bounds: R) -> DecBy<T, STEP> {
44-
let start = match bounds.start_bound() {
45-
Included(&idx) => idx,
46-
Excluded(&idx) => idx,
47-
Unbounded => Default::default(),
48-
};
49-
let end = match bounds.end_bound() {
44+
let start = match bounds.end_bound() {
5045
Included(&idx) => idx,
5146
Excluded(&idx) => Step::forward(idx, 1),
47+
Unbounded => Step::forward(Default::default(), 1),
48+
};
49+
let end = match bounds.start_bound() {
50+
Included(&idx) => Step::forward(idx, STEP),
51+
Excluded(&idx) => Step::forward(idx, STEP + 1),
5252
Unbounded => Default::default(),
5353
};
5454
DecBy { start, end }
@@ -60,14 +60,10 @@ impl<T: Copy + Default + Step, const STEP: usize> Iterator for IncBy<T, STEP> {
6060

6161
#[inline(always)]
6262
fn next(&mut self) -> Option<T> {
63-
if let Some(remaining) = Step::backward_checked(self.end, STEP) {
64-
if remaining >= self.start {
65-
let res = Some(self.start);
66-
self.start = Step::forward(self.start, STEP);
67-
res
68-
} else {
69-
None
70-
}
63+
if self.start <= Step::backward(self.end, STEP) {
64+
let res = Some(self.start);
65+
self.start = Step::forward(self.start, STEP);
66+
res
7167
} else {
7268
None
7369
}
@@ -79,14 +75,9 @@ impl<T: Copy + Default + Step, const STEP: usize> Iterator for DecBy<T, STEP> {
7975

8076
#[inline(always)]
8177
fn next(&mut self) -> Option<T> {
82-
if let Some(remaining) = Step::backward_checked(self.start, STEP) {
83-
if self.start >= self.end {
84-
let res = Some(self.start);
85-
self.start = remaining;
86-
res
87-
} else {
88-
None
89-
}
78+
if Step::forward(self.start, STEP) <= self.end {
79+
self.end = Step::backward(self.end, STEP);
80+
Some(self.end)
9081
} else {
9182
None
9283
}

tests/test_staticstep.rs

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ fn inc_by_exclusive() {
1010
assert_eq!(r.next(), None);
1111
}
1212

13+
#[test]
14+
fn inc_by_exclusive_unbound_start() {
15+
let mut r = (..64).inc_by::<16>();
16+
assert_eq!(r.next(), Some(0));
17+
assert_eq!(r.next(), Some(16));
18+
assert_eq!(r.next(), Some(32));
19+
assert_eq!(r.next(), Some(48));
20+
assert_eq!(r.next(), None);
21+
}
22+
1323
#[test]
1424
fn inc_by_inclusive() {
1525
let mut r = (0..=64).inc_by::<16>();
@@ -22,8 +32,40 @@ fn inc_by_inclusive() {
2232
}
2333

2434
#[test]
25-
fn dec_by_exclusive() {
26-
let mut r = (64usize..0usize).dec_by::<16usize>();
35+
fn inc_by_inclusive_unbound_start() {
36+
let mut r = (..=64).inc_by::<16>();
37+
assert_eq!(r.next(), Some(0));
38+
assert_eq!(r.next(), Some(16));
39+
assert_eq!(r.next(), Some(32));
40+
assert_eq!(r.next(), Some(48));
41+
assert_eq!(r.next(), Some(64));
42+
assert_eq!(r.next(), None);
43+
}
44+
45+
#[test]
46+
fn dec_by_exclusive_usize() {
47+
let mut r = (64usize..0usize).dec_by::<16>();
48+
assert_eq!(r.next(), Some(64));
49+
assert_eq!(r.next(), Some(48));
50+
assert_eq!(r.next(), Some(32));
51+
assert_eq!(r.next(), Some(16));
52+
assert_eq!(r.next(), None);
53+
}
54+
55+
#[test]
56+
fn dec_by_inclusive_usize() {
57+
let mut r = (64usize..=0usize).dec_by::<16>();
58+
assert_eq!(r.next(), Some(64));
59+
assert_eq!(r.next(), Some(48));
60+
assert_eq!(r.next(), Some(32));
61+
assert_eq!(r.next(), Some(16));
62+
assert_eq!(r.next(), Some(0));
63+
assert_eq!(r.next(), None);
64+
}
65+
66+
#[test]
67+
fn dec_by_exclusive_isize() {
68+
let mut r = (64isize..0isize).dec_by::<16>();
2769
assert_eq!(r.next(), Some(64));
2870
assert_eq!(r.next(), Some(48));
2971
assert_eq!(r.next(), Some(32));
@@ -32,8 +74,8 @@ fn dec_by_exclusive() {
3274
}
3375

3476
#[test]
35-
fn dec_by_inclusive() {
36-
let mut r = (64..=0).dec_by::<16>();
77+
fn dec_by_inclusive_isize() {
78+
let mut r = (64isize..=0isize).dec_by::<16>();
3779
assert_eq!(r.next(), Some(64));
3880
assert_eq!(r.next(), Some(48));
3981
assert_eq!(r.next(), Some(32));
@@ -42,6 +84,16 @@ fn dec_by_inclusive() {
4284
assert_eq!(r.next(), None);
4385
}
4486

87+
#[test]
88+
fn dec_by_exclusive_unbound_end() {
89+
let mut r = (64isize..).dec_by::<16>();
90+
assert_eq!(r.next(), Some(64));
91+
assert_eq!(r.next(), Some(48));
92+
assert_eq!(r.next(), Some(32));
93+
assert_eq!(r.next(), Some(16));
94+
assert_eq!(r.next(), None);
95+
}
96+
4597
#[test]
4698
fn inc_by_exclusive_wrong() {
4799
let mut r = (64..0).inc_by::<16>();

0 commit comments

Comments
 (0)