| //@ compile-flags: -Zinline-mir |
| |
| use std::fmt::Display; |
| |
| fn main() { |
| permutations(&['a', 'b', 'c']); |
| } |
| |
| #[inline(always)] |
| fn permutations<T: Copy + Display>(xs: &[T]) { |
| let mut ys = xs.to_owned(); |
| permutate(&mut ys, 0); |
| } |
| |
| fn permutate<T: Copy + Display>(xs: &mut [T], k: usize) { |
| let n = length(xs); |
| if k == n { |
| display(xs); |
| } else if k < n { |
| for i in k..n { |
| swap(xs, i, k); |
| permutate(xs, k + 1); |
| swap(xs, i, k); |
| } |
| } else { |
| error(); |
| } |
| } |
| |
| fn length<T>(xs: &[T]) -> usize { |
| xs.len() |
| } |
| |
| #[inline] |
| fn swap<T: Copy>(xs: &mut [T], i: usize, j: usize) { |
| let t = xs[i]; |
| xs[i] = xs[j]; |
| xs[j] = t; |
| } |
| |
| fn display<T: Display>(xs: &[T]) { |
| for x in xs { |
| print!("{}", x); |
| } |
| println!(); |
| } |
| |
| #[inline(always)] |
| fn error() { |
| panic!("error"); |
| } |