// File: iZhangHui[P]CppPrimer/CH16_TemplatesAndGenericProgramming/exercises/ex16_12_13_main.cc
// Function: main
int main(int argc, char const *argv[])
{
	Blob<int> blob{1, 2, 3};
	blob.push_back(4);

	// for (auto item : blob) {
	// 	std::cout << item << " "
	// }
	// std::cout << std::endl;
	for (size_t i = 0; i != blob.size(); ++i) {
		std::cout << blob[i] << " ";
	}
	std::cout << std::endl;

	// int ret = blob.back();
	int& ret = blob.back();
	ret = 5;

	for (size_t i = 0; i != blob.size(); ++i) {
		std::cout << blob[i] << " ";
	}
	std::cout << std::endl;


	Blob<std::string> b1; // empty Blob
	std::cout << b1.size() << std::endl;
	{  // new scope
		Blob<std::string> b2 = {"a", "an", "the"};
		b1 = b2;  // b1 and b2 share the same elements
		b2.push_back("about");
		std::cout << b1.size() << " " << b2.size() << std::endl;
	} // b2 is destroyed, but the elements it points to must not be destroyed
	std::cout << b1.size() << std::endl;
	for(auto p = b1.begin(); p != b1.end(); ++p)
		std::cout << *p << std::endl;

	for(auto item : b1)
		std::cout << item << std::endl;

	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x300, %rsp            # imm = 0x300
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl $0x1, -0x3c(%rbp)
movl $0x2, -0x38(%rbp)
movl $0x3, -0x34(%rbp)
leaq -0x3c(%rbp), %rax
movq %rax, -0x30(%rbp)
movq $0x3, -0x28(%rbp)
movq -0x30(%rbp), %rsi
movq -0x28(%rbp), %rdx
leaq -0x20(%rbp), %rdi
movq %rdi, -0x1c0(%rbp)
callq 0x2c60
movq -0x1c0(%rbp), %rdi
movl $0x4, -0x40(%rbp)
leaq -0x40(%rbp), %rsi
callq 0x2c90
jmp 0x23cf
movq $0x0, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x1d0(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x2cc0
movq %rax, -0x1c8(%rbp)
jmp 0x23f4
movq -0x1d0(%rbp), %rax
movq -0x1c8(%rbp), %rcx
cmpq %rcx, %rax
je 0x2474
movq -0x58(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0x2cf0
movq %rax, -0x1d8(%rbp)
jmp 0x241d
movq -0x1d8(%rbp), %rax
movl (%rax), %esi
movq 0xab93(%rip), %rdi      # 0xcfc0
callq 0x21f0
movq %rax, -0x1e0(%rbp)
jmp 0x243b
movq -0x1e0(%rbp), %rdi
leaq 0x5bbb(%rip), %rsi      # 0x8004
callq 0x2120
jmp 0x2450
jmp 0x2452
movq -0x58(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x58(%rbp)
jmp 0x23d7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2c4e
movq 0xab45(%rip), %rdi      # 0xcfc0
movq 0xab1e(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x2489
leaq -0x20(%rbp), %rdi
callq 0x2db0
movq %rax, -0x1e8(%rbp)
jmp 0x249b
movq -0x1e8(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movl $0x5, (%rax)
movq $0x0, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x1f8(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x2cc0
movq %rax, -0x1f0(%rbp)
jmp 0x24d5
movq -0x1f8(%rbp), %rax
movq -0x1f0(%rbp), %rcx
cmpq %rcx, %rax
je 0x2544
movq -0x68(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0x2cf0
movq %rax, -0x200(%rbp)
jmp 0x24fe
movq -0x200(%rbp), %rax
movl (%rax), %esi
movq 0xaab2(%rip), %rdi      # 0xcfc0
callq 0x21f0
movq %rax, -0x208(%rbp)
jmp 0x251c
movq -0x208(%rbp), %rdi
leaq 0x5ada(%rip), %rsi      # 0x8004
callq 0x2120
jmp 0x2531
jmp 0x2533
movq -0x68(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x68(%rbp)
jmp 0x24b8
movq 0xaa75(%rip), %rdi      # 0xcfc0
movq 0xaa4e(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x2559
leaq -0x78(%rbp), %rdi
callq 0x2e60
jmp 0x2564
leaq -0x78(%rbp), %rdi
callq 0x2e80
movq %rax, -0x210(%rbp)
jmp 0x2576
movq -0x210(%rbp), %rsi
movq 0xaa3c(%rip), %rdi      # 0xcfc0
callq 0x2030
movq %rax, -0x218(%rbp)
jmp 0x2592
movq -0x218(%rbp), %rdi
movq 0xaa00(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x25a7
movb $0x1, -0x104(%rbp)
leaq -0xf8(%rbp), %rax
movq %rax, -0x228(%rbp)
movq %rax, -0x100(%rbp)
leaq -0x101(%rbp), %rdi
movq %rdi, -0x220(%rbp)
callq 0x2210
movq -0x228(%rbp), %rdi
movq -0x220(%rbp), %rdx
leaq 0x5a1b(%rip), %rsi      # 0x8006
callq 0x2170
jmp 0x25f2
leaq -0xd8(%rbp), %rax
movq %rax, -0x238(%rbp)
movq %rax, -0x100(%rbp)
leaq -0x102(%rbp), %rdi
movq %rdi, -0x230(%rbp)
callq 0x2210
movq -0x238(%rbp), %rdi
movq -0x230(%rbp), %rdx
leaq 0x59d9(%rip), %rsi      # 0x8008
callq 0x2170
jmp 0x2636
leaq -0xb8(%rbp), %rax
movq %rax, -0x248(%rbp)
movq %rax, -0x100(%rbp)
leaq -0x103(%rbp), %rdi
movq %rdi, -0x240(%rbp)
callq 0x2210
movq -0x248(%rbp), %rdi
movq -0x240(%rbp), %rdx
leaq 0x5998(%rip), %rsi      # 0x800b
callq 0x2170
jmp 0x267a
movb $0x0, -0x104(%rbp)
leaq -0xf8(%rbp), %rax
movq %rax, -0x98(%rbp)
movq $0x3, -0x90(%rbp)
movq -0x98(%rbp), %rsi
movq -0x90(%rbp), %rdx
leaq -0x88(%rbp), %rdi
callq 0x2eb0
jmp 0x26b6
leaq -0xf8(%rbp), %rax
movq %rax, -0x258(%rbp)
addq $0x60, %rax
movq %rax, -0x250(%rbp)
movq -0x250(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x260(%rbp)
callq 0x20d0
movq -0x258(%rbp), %rcx
movq -0x260(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x250(%rbp)
jne 0x26cf
leaq -0x103(%rbp), %rdi
callq 0x2160
leaq -0x102(%rbp), %rdi
callq 0x2160
leaq -0x101(%rbp), %rdi
callq 0x2160
leaq -0x78(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x2ee0
leaq -0x129(%rbp), %rdi
movq %rdi, -0x268(%rbp)
callq 0x2210
movq -0x268(%rbp), %rdx
leaq 0x58ba(%rip), %rsi      # 0x800f
leaq -0x128(%rbp), %rdi
callq 0x2170
jmp 0x2763
leaq -0x88(%rbp), %rdi
leaq -0x128(%rbp), %rsi
callq 0x2f10
jmp 0x2778
leaq -0x128(%rbp), %rdi
callq 0x20d0
leaq -0x129(%rbp), %rdi
callq 0x2160
leaq -0x78(%rbp), %rdi
callq 0x2e80
movq %rax, -0x270(%rbp)
jmp 0x27a2
movq -0x270(%rbp), %rsi
movq 0xa810(%rip), %rdi      # 0xcfc0
callq 0x2030
movq %rax, -0x278(%rbp)
jmp 0x27be
movq -0x278(%rbp), %rdi
leaq 0x5838(%rip), %rsi      # 0x8004
callq 0x2120
movq %rax, -0x280(%rbp)
jmp 0x27da
leaq -0x88(%rbp), %rdi
callq 0x2e80
movq %rax, -0x288(%rbp)
jmp 0x27ef
movq -0x288(%rbp), %rsi
movq -0x280(%rbp), %rdi
callq 0x2030
movq %rax, -0x290(%rbp)
jmp 0x280b
movq -0x290(%rbp), %rdi
movq 0xa787(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x2820
leaq -0x88(%rbp), %rdi
callq 0x2f40
leaq -0x78(%rbp), %rdi
callq 0x2e80
movq %rax, -0x298(%rbp)
jmp 0x283e
movq -0x298(%rbp), %rsi
movq 0xa774(%rip), %rdi      # 0xcfc0
callq 0x2030
movq %rax, -0x2a0(%rbp)
jmp 0x285a
movq -0x2a0(%rbp), %rdi
movq 0xa738(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x286f
leaq -0x148(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x2f60
jmp 0x2881
jmp 0x2883
leaq -0x160(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x2fc0
jmp 0x2895
leaq -0x148(%rbp), %rdi
leaq -0x160(%rbp), %rsi
callq 0x2f90
movb %al, -0x2a1(%rbp)
jmp 0x28b0
leaq -0x160(%rbp), %rdi
callq 0x3010
movb -0x2a1(%rbp), %al
testb $0x1, %al
jne 0x2a6b
leaq -0x148(%rbp), %rdi
callq 0x3010
jmp 0x2ad7
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2c45
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2989
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x297d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2971
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0xf8(%rbp), %rax
movq %rax, -0x2b8(%rbp)
addq $0x60, %rax
movq %rax, -0x2b0(%rbp)
movq -0x2b0(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x2c0(%rbp)
callq 0x20d0
movq -0x2b8(%rbp), %rcx
movq -0x2c0(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x2b0(%rbp)
jne 0x293e
jmp 0x2971
leaq -0x103(%rbp), %rdi
callq 0x2160
leaq -0x102(%rbp), %rdi
callq 0x2160
leaq -0x101(%rbp), %rdi
callq 0x2160
testb $0x1, -0x104(%rbp)
jne 0x29a0
jmp 0x29ed
movq -0x100(%rbp), %rax
leaq -0xf8(%rbp), %rcx
cmpq %rax, %rcx
movq %rax, -0x2c8(%rbp)
je 0x29eb
movq -0x2c8(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x2d0(%rbp)
callq 0x20d0
movq -0x2d0(%rbp), %rax
leaq -0xf8(%rbp), %rcx
cmpq %rcx, %rax
movq %rax, -0x2c8(%rbp)
jne 0x29ba
jmp 0x29ed
jmp 0x2c45
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2a18
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x20d0
leaq -0x129(%rbp), %rdi
callq 0x2160
jmp 0x2a32
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x2f40
jmp 0x2c45
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2ac6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x160(%rbp), %rdi
callq 0x3010
jmp 0x2ac6
leaq -0x148(%rbp), %rdi
callq 0x3030
movq %rax, -0x2d8(%rbp)
jmp 0x2a80
movq -0x2d8(%rbp), %rsi
movq 0xa532(%rip), %rdi      # 0xcfc0
callq 0x2110
movq %rax, -0x2e0(%rbp)
jmp 0x2a9c
movq -0x2e0(%rbp), %rdi
movq 0xa4f6(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x2ab1
jmp 0x2ab3
leaq -0x148(%rbp), %rdi
callq 0x3100
jmp 0x2ac1
jmp 0x2883
leaq -0x148(%rbp), %rdi
callq 0x3010
jmp 0x2c45
leaq -0x78(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x168(%rbp), %rsi
leaq -0x180(%rbp), %rdi
callq 0x2f60
jmp 0x2af7
movq -0x168(%rbp), %rsi
leaq -0x198(%rbp), %rdi
callq 0x2fc0
jmp 0x2b0c
jmp 0x2b0e
leaq -0x180(%rbp), %rdi
leaq -0x198(%rbp), %rsi
callq 0x2f90
movb %al, -0x2e1(%rbp)
jmp 0x2b29
movb -0x2e1(%rbp), %al
testb $0x1, %al
jne 0x2b74
jmp 0x2b35
leaq -0x198(%rbp), %rdi
callq 0x3010
leaq -0x180(%rbp), %rdi
callq 0x3010
jmp 0x2c20
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2c12
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
jmp 0x2c06
leaq -0x180(%rbp), %rdi
callq 0x3030
movq %rax, -0x2f0(%rbp)
jmp 0x2b89
movq -0x2f0(%rbp), %rsi
leaq -0x1b8(%rbp), %rdi
callq 0x2080
jmp 0x2b9e
movq 0xa41b(%rip), %rdi      # 0xcfc0
leaq -0x1b8(%rbp), %rsi
callq 0x2110
movq %rax, -0x2f8(%rbp)
jmp 0x2bba
movq -0x2f8(%rbp), %rdi
movq 0xa3d8(%rip), %rsi      # 0xcfa0
callq 0x2150
jmp 0x2bcf
leaq -0x1b8(%rbp), %rdi
callq 0x20d0
leaq -0x180(%rbp), %rdi
callq 0x3100
jmp 0x2be9
jmp 0x2b0e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x48(%rbp)
movl %eax, -0x4c(%rbp)
leaq -0x1b8(%rbp), %rdi
callq 0x20d0
leaq -0x198(%rbp), %rdi
callq 0x3010
leaq -0x180(%rbp), %rdi
callq 0x3010
jmp 0x2c45
movl $0x0, -0x4(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x2f40
leaq -0x20(%rbp), %rdi
callq 0x31c0
movl -0x4(%rbp), %eax
addq $0x300, %rsp            # imm = 0x300
popq %rbp
retq
leaq -0x78(%rbp), %rdi
callq 0x2f40
leaq -0x20(%rbp), %rdi
callq 0x31c0
movq -0x48(%rbp), %rdi
callq 0x2200