mirror of https://github.com/rust-lang/rust
52 lines
865 B
Rust
52 lines
865 B
Rust
//@ 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");
|
|
}
|