Flattening a vector of tuples

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
*/