// File: iZhangHui[P]CppPrimer/CH16_TemplatesAndGenericProgramming/exercises/ex16_24_main.cc
// Function: main
int main(int argc, char const *argv[])
{
	Blob<string> b1; // empty Blob
	cout << b1.size() << endl;
	{  // new scope
		Blob<string> b2 = {"a", "an", "the"};
		b1 = b2;  // b1 and b2 share the same elements
		b2.push_back("about");
		cout << b1.size() << " " << b2.size() << endl;
	} // b2 is destroyed, but the elements it points to must not be destroyed
	cout << b1.size() << endl;

	for(auto p = b1.begin(); p != b1.end(); ++p)
		cout << *p << endl;

	vector<string> vs = {"hello", "c++", "primer"};
	Blob<string> bs(begin(vs), end(vs));
	for (auto item : bs)
		cout << item << endl;

	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x3b0, %rsp            # imm = 0x3B0
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x20(%rbp), %rdi
movq %rdi, -0x238(%rbp)
callq 0x2db0
movq -0x238(%rbp), %rdi
callq 0x2dd0
movq %rax, -0x230(%rbp)
jmp 0x237e
movq -0x230(%rbp), %rsi
movq 0x8c34(%rip), %rdi      # 0xafc0
callq 0x2030
movq %rax, -0x240(%rbp)
jmp 0x239a
movq -0x240(%rbp), %rdi
movq 0x8bf8(%rip), %rsi      # 0xafa0
callq 0x2150
jmp 0x23af
movb $0x1, -0xbc(%rbp)
leaq -0xb0(%rbp), %rax
movq %rax, -0x250(%rbp)
movq %rax, -0xb8(%rbp)
leaq -0xb9(%rbp), %rdi
movq %rdi, -0x248(%rbp)
callq 0x21f0
movq -0x250(%rbp), %rdi
movq -0x248(%rbp), %rdx
leaq 0x4c11(%rip), %rsi      # 0x7004
callq 0x2170
jmp 0x23fa
leaq -0x90(%rbp), %rax
movq %rax, -0x260(%rbp)
movq %rax, -0xb8(%rbp)
leaq -0xba(%rbp), %rdi
movq %rdi, -0x258(%rbp)
callq 0x21f0
movq -0x260(%rbp), %rdi
movq -0x258(%rbp), %rdx
leaq 0x4bcf(%rip), %rsi      # 0x7006
callq 0x2170
jmp 0x243e
leaq -0x70(%rbp), %rax
movq %rax, -0x270(%rbp)
movq %rax, -0xb8(%rbp)
leaq -0xbb(%rbp), %rdi
movq %rdi, -0x268(%rbp)
callq 0x21f0
movq -0x270(%rbp), %rdi
movq -0x268(%rbp), %rdx
leaq 0x4b91(%rip), %rsi      # 0x7009
callq 0x2170
jmp 0x247f
movb $0x0, -0xbc(%rbp)
leaq -0xb0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq $0x3, -0x48(%rbp)
movq -0x50(%rbp), %rsi
movq -0x48(%rbp), %rdx
leaq -0x40(%rbp), %rdi
callq 0x2e00
jmp 0x24ac
leaq -0xb0(%rbp), %rax
movq %rax, -0x280(%rbp)
addq $0x60, %rax
movq %rax, -0x278(%rbp)
movq -0x278(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x288(%rbp)
callq 0x20d0
movq -0x280(%rbp), %rcx
movq -0x288(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x278(%rbp)
jne 0x24c5
leaq -0xbb(%rbp), %rdi
callq 0x2160
leaq -0xba(%rbp), %rdi
callq 0x2160
leaq -0xb9(%rbp), %rdi
callq 0x2160
leaq -0x20(%rbp), %rdi
leaq -0x40(%rbp), %rsi
callq 0x2e30
leaq -0xe1(%rbp), %rdi
movq %rdi, -0x290(%rbp)
callq 0x21f0
movq -0x290(%rbp), %rdx
leaq 0x4ac5(%rip), %rsi      # 0x700d
leaq -0xe0(%rbp), %rdi
callq 0x2170
jmp 0x2556
leaq -0x40(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
callq 0x2e60
jmp 0x2568
leaq -0xe0(%rbp), %rdi
callq 0x20d0
leaq -0xe1(%rbp), %rdi
callq 0x2160
leaq -0x20(%rbp), %rdi
callq 0x2dd0
movq %rax, -0x298(%rbp)
jmp 0x2592
movq -0x298(%rbp), %rsi
movq 0x8a20(%rip), %rdi      # 0xafc0
callq 0x2030
movq %rax, -0x2a0(%rbp)
jmp 0x25ae
movq -0x2a0(%rbp), %rdi
leaq 0x4a57(%rip), %rsi      # 0x7013
callq 0x2120
movq %rax, -0x2a8(%rbp)
jmp 0x25ca
leaq -0x40(%rbp), %rdi
callq 0x2dd0
movq %rax, -0x2b0(%rbp)
jmp 0x25dc
movq -0x2b0(%rbp), %rsi
movq -0x2a8(%rbp), %rdi
callq 0x2030
movq %rax, -0x2b8(%rbp)
jmp 0x25f8
movq -0x2b8(%rbp), %rdi
movq 0x899a(%rip), %rsi      # 0xafa0
callq 0x2150
jmp 0x260d
leaq -0x40(%rbp), %rdi
callq 0x2e90
leaq -0x20(%rbp), %rdi
callq 0x2dd0
movq %rax, -0x2c0(%rbp)
jmp 0x2628
movq -0x2c0(%rbp), %rsi
movq 0x898a(%rip), %rdi      # 0xafc0
callq 0x2030
movq %rax, -0x2c8(%rbp)
jmp 0x2644
movq -0x2c8(%rbp), %rdi
movq 0x894e(%rip), %rsi      # 0xafa0
callq 0x2150
jmp 0x2659
leaq -0x100(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x2eb0
jmp 0x266b
jmp 0x266d
leaq -0x118(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x2f10
jmp 0x267f
leaq -0x100(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0x2ee0
movb %al, -0x2c9(%rbp)
jmp 0x269a
leaq -0x118(%rbp), %rdi
callq 0x2f80
movb -0x2c9(%rbp), %al
testb $0x1, %al
jne 0x2852
leaq -0x100(%rbp), %rdi
callq 0x2f80
jmp 0x28be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2d93
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2773
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2767
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x275b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0xb0(%rbp), %rax
movq %rax, -0x2e0(%rbp)
addq $0x60, %rax
movq %rax, -0x2d8(%rbp)
movq -0x2d8(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x2e8(%rbp)
callq 0x20d0
movq -0x2e0(%rbp), %rcx
movq -0x2e8(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x2d8(%rbp)
jne 0x2728
jmp 0x275b
leaq -0xbb(%rbp), %rdi
callq 0x2160
leaq -0xba(%rbp), %rdi
callq 0x2160
leaq -0xb9(%rbp), %rdi
callq 0x2160
testb $0x1, -0xbc(%rbp)
jne 0x278a
jmp 0x27d7
movq -0xb8(%rbp), %rax
leaq -0xb0(%rbp), %rcx
cmpq %rax, %rcx
movq %rax, -0x2f0(%rbp)
je 0x27d5
movq -0x2f0(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x2f8(%rbp)
callq 0x20d0
movq -0x2f8(%rbp), %rax
leaq -0xb0(%rbp), %rcx
cmpq %rcx, %rax
movq %rax, -0x2f0(%rbp)
jne 0x27a4
jmp 0x27d7
jmp 0x2d93
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2802
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x20d0
leaq -0xe1(%rbp), %rdi
callq 0x2160
jmp 0x281c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x2e90
jmp 0x2d93
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x28ad
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x2f80
jmp 0x28ad
leaq -0x100(%rbp), %rdi
callq 0x2fa0
movq %rax, -0x300(%rbp)
jmp 0x2867
movq -0x300(%rbp), %rsi
movq 0x874b(%rip), %rdi      # 0xafc0
callq 0x2110
movq %rax, -0x308(%rbp)
jmp 0x2883
movq -0x308(%rbp), %rdi
movq 0x870f(%rip), %rsi      # 0xafa0
callq 0x2150
jmp 0x2898
jmp 0x289a
leaq -0x100(%rbp), %rdi
callq 0x3070
jmp 0x28a8
jmp 0x266d
leaq -0x100(%rbp), %rdi
callq 0x2f80
jmp 0x2d93
movb $0x1, -0x1ac(%rbp)
leaq -0x1a0(%rbp), %rax
movq %rax, -0x318(%rbp)
movq %rax, -0x1a8(%rbp)
leaq -0x1a9(%rbp), %rdi
movq %rdi, -0x310(%rbp)
callq 0x21f0
movq -0x318(%rbp), %rdi
movq -0x310(%rbp), %rdx
leaq 0x4713(%rip), %rsi      # 0x7015
callq 0x2170
jmp 0x2909
leaq -0x180(%rbp), %rax
movq %rax, -0x328(%rbp)
movq %rax, -0x1a8(%rbp)
leaq -0x1aa(%rbp), %rdi
movq %rdi, -0x320(%rbp)
callq 0x21f0
movq -0x328(%rbp), %rdi
movq -0x320(%rbp), %rdx
leaq 0x46d5(%rip), %rsi      # 0x701b
callq 0x2170
jmp 0x294d
leaq -0x160(%rbp), %rax
movq %rax, -0x338(%rbp)
movq %rax, -0x1a8(%rbp)
leaq -0x1ab(%rbp), %rdi
movq %rdi, -0x330(%rbp)
callq 0x21f0
movq -0x338(%rbp), %rdi
movq -0x330(%rbp), %rdx
leaq 0x4695(%rip), %rsi      # 0x701f
callq 0x2170
jmp 0x2991
movb $0x0, -0x1ac(%rbp)
leaq -0x1a0(%rbp), %rax
movq %rax, -0x140(%rbp)
movq $0x3, -0x138(%rbp)
leaq -0x1ad(%rbp), %rdi
movq %rdi, -0x340(%rbp)
callq 0x3130
movq -0x340(%rbp), %rcx
movq -0x140(%rbp), %rsi
movq -0x138(%rbp), %rdx
leaq -0x130(%rbp), %rdi
callq 0x3150
jmp 0x29e7
leaq -0x1ad(%rbp), %rdi
callq 0x31d0
leaq -0x1a0(%rbp), %rax
movq %rax, -0x350(%rbp)
addq $0x60, %rax
movq %rax, -0x348(%rbp)
movq -0x348(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x358(%rbp)
callq 0x20d0
movq -0x350(%rbp), %rcx
movq -0x358(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x348(%rbp)
jne 0x2a0c
leaq -0x1ab(%rbp), %rdi
callq 0x2160
leaq -0x1aa(%rbp), %rdi
callq 0x2160
leaq -0x1a9(%rbp), %rdi
callq 0x2160
leaq -0x130(%rbp), %rdi
callq 0x31f0
movq %rax, -0x360(%rbp)
jmp 0x2a76
movq -0x360(%rbp), %rax
movq %rax, -0x1c8(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x3220
movq %rax, -0x368(%rbp)
jmp 0x2a99
movq -0x368(%rbp), %rax
movq %rax, -0x1d0(%rbp)
movq -0x1c8(%rbp), %rsi
movq -0x1d0(%rbp), %rdx
leaq -0x1c0(%rbp), %rdi
callq 0x3250
jmp 0x2ac3
leaq -0x1c0(%rbp), %rax
movq %rax, -0x1d8(%rbp)
movq -0x1d8(%rbp), %rsi
leaq -0x1f0(%rbp), %rdi
callq 0x2eb0
jmp 0x2ae6
movq -0x1d8(%rbp), %rsi
leaq -0x208(%rbp), %rdi
callq 0x2f10
jmp 0x2afb
jmp 0x2afd
leaq -0x1f0(%rbp), %rdi
leaq -0x208(%rbp), %rsi
callq 0x2ee0
movb %al, -0x369(%rbp)
jmp 0x2b18
movb -0x369(%rbp), %al
testb $0x1, %al
jne 0x2c9b
jmp 0x2b28
leaq -0x208(%rbp), %rdi
callq 0x2f80
leaq -0x1f0(%rbp), %rdi
callq 0x2f80
jmp 0x2d47
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2bee
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2be2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2bd6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x1ad(%rbp), %rdi
callq 0x31d0
leaq -0x1a0(%rbp), %rax
movq %rax, -0x380(%rbp)
addq $0x60, %rax
movq %rax, -0x378(%rbp)
movq -0x378(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x388(%rbp)
callq 0x20d0
movq -0x380(%rbp), %rcx
movq -0x388(%rbp), %rax
cmpq %rcx, %rax
movq %rax, -0x378(%rbp)
jne 0x2ba3
jmp 0x2bd6
leaq -0x1ab(%rbp), %rdi
callq 0x2160
leaq -0x1aa(%rbp), %rdi
callq 0x2160
leaq -0x1a9(%rbp), %rdi
callq 0x2160
testb $0x1, -0x1ac(%rbp)
jne 0x2c05
jmp 0x2c52
movq -0x1a8(%rbp), %rax
leaq -0x1a0(%rbp), %rcx
cmpq %rax, %rcx
movq %rax, -0x390(%rbp)
je 0x2c50
movq -0x390(%rbp), %rdi
addq $-0x20, %rdi
movq %rdi, -0x398(%rbp)
callq 0x20d0
movq -0x398(%rbp), %rax
leaq -0x1a0(%rbp), %rcx
cmpq %rcx, %rax
movq %rax, -0x390(%rbp)
jne 0x2c1f
jmp 0x2c52
jmp 0x2d93
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2d87
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2d7b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2d39
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
jmp 0x2d2d
leaq -0x1f0(%rbp), %rdi
callq 0x2fa0
movq %rax, -0x3a0(%rbp)
jmp 0x2cb0
movq -0x3a0(%rbp), %rsi
leaq -0x228(%rbp), %rdi
callq 0x2080
jmp 0x2cc5
movq 0x82f4(%rip), %rdi      # 0xafc0
leaq -0x228(%rbp), %rsi
callq 0x2110
movq %rax, -0x3a8(%rbp)
jmp 0x2ce1
movq -0x3a8(%rbp), %rdi
movq 0x82b1(%rip), %rsi      # 0xafa0
callq 0x2150
jmp 0x2cf6
leaq -0x228(%rbp), %rdi
callq 0x20d0
leaq -0x1f0(%rbp), %rdi
callq 0x3070
jmp 0x2d10
jmp 0x2afd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x228(%rbp), %rdi
callq 0x20d0
leaq -0x208(%rbp), %rdi
callq 0x2f80
leaq -0x1f0(%rbp), %rdi
callq 0x2f80
jmp 0x2d7b
movl $0x0, -0x4(%rbp)
leaq -0x1c0(%rbp), %rdi
callq 0x2e90
leaq -0x130(%rbp), %rdi
callq 0x3280
leaq -0x20(%rbp), %rdi
callq 0x2e90
movl -0x4(%rbp), %eax
addq $0x3b0, %rsp            # imm = 0x3B0
popq %rbp
retq
leaq -0x1c0(%rbp), %rdi
callq 0x2e90
leaq -0x130(%rbp), %rdi
callq 0x3280
leaq -0x20(%rbp), %rdi
callq 0x2e90
movq -0x28(%rbp), %rdi
callq 0x21e0
nopw %cs:(%rax,%rax)
nop