Skip to content

Commit 4f487b0

Browse files
authored
Merge pull request #200 from ia7ck/re-doubling
[doubling] get
2 parents cb98c23 + ae663fd commit 4f487b0

1 file changed

Lines changed: 32 additions & 6 deletions

File tree

libs/doubling/src/lib.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,9 @@ where
7777
where
7878
F: Fn(usize) -> Transition<V>,
7979
{
80-
let log2_max_steps = if max_steps == 0 {
81-
0
82-
} else {
83-
max_steps.ilog2() as usize
84-
};
80+
assert!(max_steps > 0);
81+
82+
let log2_max_steps = max_steps.ilog2() as usize;
8583

8684
let mut transitions = Vec::with_capacity(n_state * (log2_max_steps + 1));
8785
for i in 0..n_state {
@@ -112,6 +110,15 @@ where
112110
}
113111
}
114112

113+
/// 状態`start`から長さ`pow(2, k)`の遷移を返します。
114+
pub fn get(&self, start: usize, k: usize) -> &Transition<V> {
115+
assert!(start < self.n_state);
116+
assert!(k <= self.log2_max_steps);
117+
118+
let offset = self.n_state * k;
119+
&self.transitions[offset + start]
120+
}
121+
115122
/// 状態`start`から`step`回の遷移、初期値`init`から始めて`f`で畳みこんだ結果を返します。
116123
pub fn fold<A, F>(&self, start: usize, step: usize, init: A, mut f: F) -> A
117124
where
@@ -190,6 +197,25 @@ mod tests {
190197
);
191198
}
192199

200+
#[test]
201+
fn test_get() {
202+
let n = 3;
203+
let to = vec![1, 2, 0];
204+
let doubling = Doubling::new(n, 100, |i| Transition::new(to[i], Sum(1)));
205+
206+
let t = doubling.get(0, 0);
207+
assert_eq!(t.value, Sum(1));
208+
209+
let t = doubling.get(0, 1);
210+
assert_eq!(t.value, Sum(2));
211+
212+
let t = doubling.get(0, 2);
213+
assert_eq!(t.value, Sum(4));
214+
215+
let t = doubling.get(0, 3);
216+
assert_eq!(t.value, Sum(8));
217+
}
218+
193219
impl Value for String {
194220
fn op(&self, other: &Self) -> Self {
195221
format!("{}{}", self, other)
@@ -199,7 +225,7 @@ mod tests {
199225
proptest! {
200226
#[test]
201227
fn test_fold_associativity(
202-
(n_state, max_steps, nexts, values, start, step1, step2) in (1_usize..=10, 0_usize..=100)
228+
(n_state, max_steps, nexts, values, start, step1, step2) in (1_usize..=10, 1_usize..=100)
203229
.prop_flat_map(|(n_state, max_steps)| {
204230
(
205231
Just(n_state),

0 commit comments

Comments
 (0)