// File: ridiculousfish[P]docopt_fish/docopt_fish.cpp
// Function: docopt_fish::docopt_impl::populate_from_annotated_options()
void populate_from_annotated_options() {
        // We're going to construct a list of variable arguments, that are not
        // associated with an option
        // Populate impl->shortcut_options and free_variables.
        rstring_list_t free_variables;
        for (const annotated_option_t &dopt : this->annotated_options) {
            const rstring_t option_name(dopt.option);
            const rstring_t value_name(dopt.value_name);
            
            if (dopt.type == annotated_option_t::value_only) {
                // No option, just a free variable
                assert(! dopt.value_name.empty());
                free_variables.push_back(value_name);
            } else {
                // Create an option
                assert(! dopt.option.empty());
                auto name_type = static_cast<option_t::name_type_t>(dopt.type - 1);
                this->shortcut_options.emplace_back(name_type, option_name,
                                                    value_name, dopt.flags);
            }

            // Save metadata
            base_metadata_t<rstring_t> md;
            md.command = rstring_t(dopt.metadata.command);
            md.condition = rstring_t(dopt.metadata.condition);
            md.description = rstring_t(dopt.metadata.description);
            md.tag = dopt.metadata.tag;

            if (!option_name.empty()) {
                this->names_to_metadata[option_name] = md;
            }
            if (!value_name.empty()) {
                this->names_to_metadata[value_name] = md;
            }
        }

        bool has_option = !this->shortcut_options.empty();

        // Build a usage
        this->usages.push_back(usage_t::build_from_variables(free_variables, has_option));
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x180, %rsp            # imm = 0x180
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x168(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x1ba90
movq -0x168(%rbp), %rax
addq $0x38, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0x230d0
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rdi
callq 0x23100
movq %rax, -0x38(%rbp)
leaq -0x30(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x23130
testb $0x1, %al
jne 0xe952
jmp 0xebe5
leaq -0x30(%rbp), %rdi
callq 0x23170
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rsi
addq $0x8, %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x58(%rbp), %rdi
movq $-0x1, %rcx
callq 0xc430
jmp 0xe97d
movq -0x40(%rbp), %rsi
addq $0x28, %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x80(%rbp), %rdi
movq $-0x1, %rcx
callq 0xc430
jmp 0xe99b
movq -0x40(%rbp), %rax
cmpl $0x0, (%rax)
jne 0xe9fc
movq -0x40(%rbp), %rdi
addq $0x28, %rdi
callq 0x83d0
xorb $-0x1, %al
testb $0x1, %al
jne 0xe9b9
jmp 0xe9bb
jmp 0xe9eb
leaq 0x3d436(%rip), %rdi     # 0x4bdf8
leaq 0x3c6bf(%rip), %rsi     # 0x4b088
movl $0x3b4, %edx            # imm = 0x3B4
leaq 0x3d43d(%rip), %rcx     # 0x4be12
callq 0x81e0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
jmp 0xec75
leaq -0x20(%rbp), %rdi
leaq -0x80(%rbp), %rsi
callq 0x1bcf0
jmp 0xe9fa
jmp 0xea6b
movq -0x40(%rbp), %rdi
addq $0x8, %rdi
callq 0x83d0
xorb $-0x1, %al
testb $0x1, %al
jne 0xea11
jmp 0xea13
jmp 0xea32
leaq 0x3d439(%rip), %rdi     # 0x4be53
leaq 0x3c667(%rip), %rsi     # 0x4b088
movl $0x3b8, %edx            # imm = 0x3B8
leaq 0x3d3e5(%rip), %rcx     # 0x4be12
callq 0x81e0
movq -0x168(%rbp), %rdi
movq -0x40(%rbp), %rax
movl (%rax), %eax
decl %eax
movl %eax, -0x84(%rbp)
addq $0x50, %rdi
movq -0x40(%rbp), %r8
addq $0x48, %r8
leaq -0x84(%rbp), %rsi
leaq -0x58(%rbp), %rdx
leaq -0x80(%rbp), %rcx
callq 0x23190
jmp 0xea69
jmp 0xea6b
leaq -0xe0(%rbp), %rdi
callq 0x18a80
jmp 0xea79
movq -0x40(%rbp), %rsi
addq $0x50, %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0xf8(%rbp), %rdi
movq $-0x1, %rcx
callq 0xc430
jmp 0xea9a
movq -0xe8(%rbp), %rax
movq %rax, -0xd0(%rbp)
movups -0xf8(%rbp), %xmm0
movaps %xmm0, -0xe0(%rbp)
movq -0x40(%rbp), %rsi
addq $0x70, %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x110(%rbp), %rdi
movq $-0x1, %rcx
callq 0xc430
jmp 0xead7
movq -0x100(%rbp), %rax
movq %rax, -0xb8(%rbp)
movups -0x110(%rbp), %xmm0
movups %xmm0, -0xc8(%rbp)
movq -0x40(%rbp), %rsi
addq $0x90, %rsi
xorl %eax, %eax
movl %eax, %edx
leaq -0x128(%rbp), %rdi
movq $-0x1, %rcx
callq 0xc430
jmp 0xeb17
movq -0x128(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0x120(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x118(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x40(%rbp), %rax
movl 0xb0(%rax), %eax
movl %eax, -0x98(%rbp)
leaq -0x58(%rbp), %rdi
callq 0xbe30
testb $0x1, %al
jne 0xeb93
movq -0x168(%rbp), %rdi
subq $-0x80, %rdi
leaq -0x58(%rbp), %rsi
callq 0x1bc10
movq %rax, -0x170(%rbp)
jmp 0xeb7b
movq -0x170(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
movl $0x4c, %edx
callq 0x8270
leaq -0x80(%rbp), %rdi
callq 0xbe30
testb $0x1, %al
jne 0xebd5
movq -0x168(%rbp), %rdi
subq $-0x80, %rdi
leaq -0x80(%rbp), %rsi
callq 0x1bc10
movq %rax, -0x178(%rbp)
jmp 0xebbd
movq -0x178(%rbp), %rdi
leaq -0xe0(%rbp), %rsi
movl $0x4c, %edx
callq 0x8270
jmp 0xebd7
leaq -0x30(%rbp), %rdi
callq 0x23230
jmp 0xe93c
movq -0x168(%rbp), %rdi
addq $0x50, %rdi
callq 0x23250
movb %al, %cl
movq -0x168(%rbp), %rax
xorb $0x1, %cl
movb %cl, -0x129(%rbp)
movq %rax, -0x180(%rbp)
movzbl -0x129(%rbp), %edx
andl $0x1, %edx
leaq -0x160(%rbp), %rdi
leaq -0x20(%rbp), %rsi
callq 0x26e30
jmp 0xec2a
movq -0x180(%rbp), %rdi
leaq -0x160(%rbp), %rsi
callq 0x1bf50
jmp 0xec3f
leaq -0x160(%rbp), %rdi
callq 0x1bf80
leaq -0x20(%rbp), %rdi
callq 0x1bfc0
addq $0x180, %rsp            # imm = 0x180
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x60(%rbp)
movl %eax, -0x64(%rbp)
leaq -0x160(%rbp), %rdi
callq 0x1bf80
leaq -0x20(%rbp), %rdi
callq 0x1bfc0
movq -0x60(%rbp), %rdi
callq 0x85d0
nopw (%rax,%rax)