blob: a1005a0aad64692169619ef6b649cda9e408f82c [file] [log] [blame]
Matthias Benkardf3a3b302019-02-28 12:13:56 +01001// Generic Programming
2
3#![allow(dead_code)]
4#![allow(unused_imports)]
5
6use rust_tutorial::*;
7
8/// Run this to see the disassembly of `compute_sum_of_squares_{1,2}`:
9///
10/// ```bash
11/// cargo objdump --bin tut2 --release -- -d | awk -v RS= '/^tut2::compute_sum_of_squares/'
12/// ```
13
14#[inline(never)]
15fn compute_sum_of_squares_i32(zero: i32, xs: &Vec<i32>) -> i32 {
16 xs[1..].iter()
17 .map(|x| x * x)
18 .fold(zero, |acc, x| acc + x)
19}
20
21#[inline(never)]
22fn compute_sum_of_squares<T>(zero: T, xs: &Vec<T>) -> T
23where
24 T: std::ops::Mul<Output=T> + std::ops::Add<Output=T> + Copy
25{
26 xs[1..].iter()
27 .map(|x| *x * *x)
28 .fold(zero, |acc, x| acc + x)
29}
30
31fn main() {
32 let numbers = vec![1, 2, 3, 4, 5];
33
34 let sum_of_squares_i32 = compute_sum_of_squares_i32(0, &numbers);
35 let sum_of_squares_t = compute_sum_of_squares(0, &numbers);
36
37 println!("sum i32 = {}", sum_of_squares_i32);
38 println!("sum T = {}", sum_of_squares_t);
39}