Skip to content

Commit ae663fd

Browse files
committed
get()
1 parent 2447a16 commit ae663fd

1 file changed

Lines changed: 28 additions & 0 deletions

File tree

libs/doubling/src/lib.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,15 @@ where
110110
}
111111
}
112112

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+
113122
/// 状態`start`から`step`回の遷移、初期値`init`から始めて`f`で畳みこんだ結果を返します。
114123
pub fn fold<A, F>(&self, start: usize, step: usize, init: A, mut f: F) -> A
115124
where
@@ -188,6 +197,25 @@ mod tests {
188197
);
189198
}
190199

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+
191219
impl Value for String {
192220
fn op(&self, other: &Self) -> Self {
193221
format!("{}{}", self, other)

0 commit comments

Comments
 (0)