// File: iZhangHui[P]CppPrimer/CH10_GenericAlgorithms/examples/absInt.cc
// Function: main
int main() {
	vector<int> vi;
	int i;
	while (cin >> i)
		vi.push_back(i);
	// pass a lambda to for_each to print each element in vi
	for_each(vi.begin(), vi.end(), [](int i) { cout << i << " "; });
	cout << endl;

	vector<int> orig = vi; // save original data in vi

	// replace negative values by their absolute value
	transform(vi.begin(), vi.end(), vi.begin(),
	          [](int i) { return i < 0 ? -i : i; });
	// print the elements now in vi
	for_each(vi.begin(), vi.end(), [](int i) { cout << i << " "; });
	cout << endl;

	vi = orig;  // start afresh
	// use a lambda with a specified return type to transform vi
	transform(vi.begin(), vi.end(), vi.begin(),
	          [](int i) -> int 
	          { if (i < 0) return -i; else return i; });
	// print the elements now in vi
	for_each(vi.begin(), vi.end(), [](int i) { cout << i << " "; });
	cout << endl;

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movl $0x0, -0x4(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x1850
movq 0x5d2e(%rip), %rdi      # 0x6fe0
leaq -0x24(%rbp), %rsi
callq 0x1070
movq %rax, -0xf0(%rbp)
jmp 0x12c4
movq -0xf0(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x10e0
movb %al, -0xf1(%rbp)
jmp 0x12e2
movb -0xf1(%rbp), %al
testb $0x1, %al
jne 0x12ee
jmp 0x1310
leaq -0x20(%rbp), %rdi
leaq -0x24(%rbp), %rsi
callq 0x1870
jmp 0x12fd
jmp 0x12ab
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x1522
leaq -0x20(%rbp), %rdi
movq %rdi, -0x100(%rbp)
callq 0x18e0
movq -0x100(%rbp), %rdi
movq %rax, -0x40(%rbp)
callq 0x1910
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
movq -0x48(%rbp), %rsi
callq 0x1540
jmp 0x1343
movq 0x5c86(%rip), %rdi      # 0x6fd0
movq 0x5c6f(%rip), %rsi      # 0x6fc0
callq 0x10d0
jmp 0x1358
leaq -0x68(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x1940
jmp 0x1367
leaq -0x20(%rbp), %rdi
movq %rdi, -0x110(%rbp)
callq 0x18e0
movq -0x110(%rbp), %rdi
movq %rax, -0x70(%rbp)
callq 0x1910
movq -0x110(%rbp), %rdi
movq %rax, -0x78(%rbp)
callq 0x18e0
movq %rax, -0x80(%rbp)
movq -0x70(%rbp), %rdi
movq -0x78(%rbp), %rsi
movq -0x80(%rbp), %rdx
callq 0x1590
movq %rax, -0x108(%rbp)
jmp 0x13b5
movq -0x108(%rbp), %rax
movq %rax, -0x90(%rbp)
leaq -0x20(%rbp), %rdi
movq %rdi, -0x118(%rbp)
callq 0x18e0
movq -0x118(%rbp), %rdi
movq %rax, -0x98(%rbp)
callq 0x1910
movq %rax, -0xa0(%rbp)
movq -0x98(%rbp), %rdi
movq -0xa0(%rbp), %rsi
callq 0x1610
jmp 0x1402
movq 0x5bc7(%rip), %rdi      # 0x6fd0
movq 0x5bb0(%rip), %rsi      # 0x6fc0
callq 0x10d0
jmp 0x1417
leaq -0x20(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x1a30
jmp 0x1426
leaq -0x20(%rbp), %rdi
movq %rdi, -0x128(%rbp)
callq 0x18e0
movq -0x128(%rbp), %rdi
movq %rax, -0xb0(%rbp)
callq 0x1910
movq -0x128(%rbp), %rdi
movq %rax, -0xb8(%rbp)
callq 0x18e0
movq %rax, -0xc0(%rbp)
movq -0xb0(%rbp), %rdi
movq -0xb8(%rbp), %rsi
movq -0xc0(%rbp), %rdx
callq 0x1660
movq %rax, -0x120(%rbp)
jmp 0x1486
movq -0x120(%rbp), %rax
movq %rax, -0xd0(%rbp)
leaq -0x20(%rbp), %rdi
movq %rdi, -0x130(%rbp)
callq 0x18e0
movq -0x130(%rbp), %rdi
movq %rax, -0xd8(%rbp)
callq 0x1910
movq %rax, -0xe0(%rbp)
movq -0xd8(%rbp), %rdi
movq -0xe0(%rbp), %rsi
callq 0x16e0
jmp 0x14d3
movq 0x5af6(%rip), %rdi      # 0x6fd0
movq 0x5adf(%rip), %rsi      # 0x6fc0
callq 0x10d0
jmp 0x14e8
movl $0x0, -0x4(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x1c80
leaq -0x20(%rbp), %rdi
callq 0x1c80
movl -0x4(%rbp), %eax
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x1c80
leaq -0x20(%rbp), %rdi
callq 0x1c80
movq -0x30(%rbp), %rdi
callq 0x1140
nopw %cs:(%rax,%rax)