// File: chen3feng[P]error-handling/result.cpp
// Function: GetIntFromFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
Result<int> GetIntFromFile(const std::string& filename) {
    // 下面每一步的都依赖上一步操作的结果。
    // TRY 遇到错误就会自动从当前函数返回，否则提取出真正的返回值。
    // 和错误码比，错误不能被无意中忽略；
    // 和异常比，代码更显式看出可能会出错，也一样能自动传播错误，但是代价较低，可控。
    auto&& f = TRY(OpenFile(filename));
    auto&& s = TRY(f.Read());
    auto&& n = TRY(ParseInt(s));
    return n;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1c0, %rsp            # imm = 0x1C0
movq %rdi, -0x168(%rbp)
movq %rdi, %rax
movq %rax, -0x160(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x70(%rbp), %rdi
movq %rdi, -0x158(%rbp)
callq 0x2630
movq -0x158(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0x3780
movb %al, -0x14d(%rbp)
jmp 0x28c4
movb -0x14d(%rbp), %al
testb $0x1, %al
jne 0x295f
jmp 0x28d4
movq -0x40(%rbp), %rdi
callq 0x37b0
movq %rax, -0x170(%rbp)
jmp 0x28e6
movq -0x170(%rbp), %rsi
leaq -0x90(%rbp), %rdi
movq %rdi, -0x178(%rbp)
callq 0x37d0
movq -0x168(%rbp), %rdi
movq -0x178(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x3800
jmp 0x2919
leaq -0x90(%rbp), %rdi
callq 0x3700
movl $0x1, -0x94(%rbp)
jmp 0x298d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2a56
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x90(%rbp), %rdi
callq 0x3700
jmp 0x2a56
movq -0x40(%rbp), %rdi
callq 0x3870
movq %rax, -0x180(%rbp)
jmp 0x2971
movq -0x180(%rbp), %rsi
leaq -0x38(%rbp), %rdi
callq 0x3880
jmp 0x2983
movl $0x0, -0x94(%rbp)
leaq -0x70(%rbp), %rdi
callq 0x38b0
movl -0x94(%rbp), %eax
testl %eax, %eax
je 0x29a7
jmp 0x29a2
jmp 0x2cbb
leaq -0x38(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rsi
leaq -0xf8(%rbp), %rdi
callq 0x3900
jmp 0x29c1
leaq -0xf8(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0xc8(%rbp), %rdi
callq 0x3980
movb %al, -0x181(%rbp)
jmp 0x29e3
movb -0x181(%rbp), %al
testb $0x1, %al
jne 0x2aa3
jmp 0x29f3
movq -0xc8(%rbp), %rdi
callq 0x39b0
movq %rax, -0x190(%rbp)
jmp 0x2a08
movq -0x190(%rbp), %rsi
leaq -0x108(%rbp), %rdi
movq %rdi, -0x198(%rbp)
callq 0x37d0
movq -0x168(%rbp), %rdi
movq -0x198(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x3800
jmp 0x2a3b
leaq -0x108(%rbp), %rdi
callq 0x3700
movl $0x1, -0x94(%rbp)
jmp 0x2ad7
leaq -0x70(%rbp), %rdi
callq 0x38b0
jmp 0x2ccb
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2cb0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2ba8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x3700
jmp 0x2ba8
movq -0xc8(%rbp), %rdi
callq 0x39d0
movq %rax, -0x1a0(%rbp)
jmp 0x2ab8
movq -0x1a0(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
callq 0x20b0
jmp 0x2acd
movl $0x0, -0x94(%rbp)
leaq -0xf8(%rbp), %rdi
callq 0x39e0
movl -0x94(%rbp), %eax
testl %eax, %eax
jne 0x2ca5
jmp 0x2af3
leaq -0xc0(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rsi
leaq -0x138(%rbp), %rdi
callq 0x2750
jmp 0x2b16
leaq -0x138(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x120(%rbp), %rdi
callq 0x3a30
movb %al, -0x1a1(%rbp)
jmp 0x2b38
movb -0x1a1(%rbp), %al
testb $0x1, %al
jne 0x2bf8
jmp 0x2b48
movq -0x120(%rbp), %rdi
callq 0x3a60
movq %rax, -0x1b0(%rbp)
jmp 0x2b5d
movq -0x1b0(%rbp), %rsi
leaq -0x148(%rbp), %rdi
movq %rdi, -0x1b8(%rbp)
callq 0x37d0
movq -0x168(%rbp), %rdi
movq -0x1b8(%rbp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x3800
jmp 0x2b90
leaq -0x148(%rbp), %rdi
callq 0x3700
movl $0x1, -0x94(%rbp)
jmp 0x2c26
leaq -0xf8(%rbp), %rdi
callq 0x39e0
jmp 0x2cb0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2c97
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
jmp 0x2c7b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x78(%rbp)
movl %eax, -0x7c(%rbp)
leaq -0x148(%rbp), %rdi
callq 0x3700
jmp 0x2c7b
movq -0x120(%rbp), %rdi
callq 0x3a80
movq %rax, -0x1c0(%rbp)
jmp 0x2c0d
movq -0x1c0(%rbp), %rax
movl (%rax), %eax
movl %eax, -0x14c(%rbp)
movl $0x0, -0x94(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x3a90
movl -0x94(%rbp), %eax
testl %eax, %eax
jne 0x2c89
jmp 0x2c3e
movq -0x168(%rbp), %rdi
movl -0x14c(%rbp), %eax
movl %eax, -0x114(%rbp)
leaq -0x114(%rbp), %rax
movq %rax, -0x110(%rbp)
movq -0x110(%rbp), %rax
movl (%rax), %esi
callq 0x3ae0
jmp 0x2c6f
movl $0x1, -0x94(%rbp)
jmp 0x2c89
leaq -0x138(%rbp), %rdi
callq 0x3a90
jmp 0x2c97
leaq -0xc0(%rbp), %rdi
callq 0x20e0
jmp 0x2ca5
leaq -0xc0(%rbp), %rdi
callq 0x20e0
jmp 0x2cb0
leaq -0x38(%rbp), %rdi
callq 0x3670
jmp 0x2cbb
leaq -0x38(%rbp), %rdi
callq 0x3670
jmp 0x2ccb
movq -0x160(%rbp), %rax
addq $0x1c0, %rsp            # imm = 0x1C0
popq %rbp
retq
movq -0x78(%rbp), %rdi
callq 0x2270
nopw %cs:(%rax,%rax)