If you want a lazy operation:
#![allow(private_no_mangle_fns)]
#![feature(conservative_impl_trait)]
#[no_mangle]
#[inline(never)]
fn flatten7<'a>(data: &'a [(i32, i32)]) -> impl Iterator<Item=i32> + 'a {
use std::iter::once;
data
.iter()
.flat_map(|&(a, b)| once(a).chain(once(b)))
}
#[no_mangle]
#[inline(never)]
fn flatten8(data: &[(i32, i32)]) -> &[i32] {
use std::mem::transmute;
use std::slice::from_raw_parts;
unsafe {
transmute( from_raw_parts(data.as_ptr(), data.len() * 2) )
}
}
fn main() {
let a1 = [(1,2), (3,4), (5,6)];
let a2 = [(1,2), (3,4)];
println!("{:?}", flatten7(&a1).collect::<Vec<_>>());
println!("{:?}", flatten7(&a2).collect::<Vec<_>>());
println!("{:?}", flatten8(&a1));
println!("{:?}", flatten8(&a2));
}
/*
flatten8:
leaq (%rsi,%rsi), %rdx
movq %rdi, %rax
retq
*/