// File: oknenavin[P]cxon/test/../src/cxon/lang/cbor/common/sink.hxx
// Function: bool cxon::cbor::imp::sink_reader_<cxon::CBOR<cxon::cbor::format_traits>, cxon::cbor::sink<void> const>::read<unsigned char const*, cxon::context<cxon::CBOR<cxon::cbor::format_traits>>, cxon::CBOR<cxon::cbor::format_traits>>(cxon::cbor::sink<void> const&, unsigned char const*&, unsigned char const*, cxon::context<cxon::CBOR<cxon::cbor::format_traits>>&)
static bool read(S& s, II& i, II e, Cx& cx) {
                    auto t = std::back_inserter(s);
                    auto const b = bio::peek(i, e);
                    unsigned const mjr = b & Y::mjr;
                    unsigned const mnr = b & Y::mnr;
                    switch (mjr) {
                        case Y::pint: case Y::nint: case Y::tag: case Y::svn: {
                            II const o = i;
                            switch (mnr) {
                                case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
                                case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F:
                                case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
                                    return  (bio::get(t, i, e));
                                case 0x18: case 0x19: case 0x1A: case 0x1B:
                                    return  (bio::get(t, i, e, 1 + (1 << (mnr - 0x18)))) ||
                                            (bio::rewind(i, o), cx/cbor::read_error::unexpected)
                                    ;
                                case 0x1C: case 0x1D: case 0x1E: case 0x1F:
                                    return  (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                default:                                            // LCOV_EXCL_LINE
                                    return  CXON_ASSERT(0, "unexpected"), false;    // LCOV_EXCL_LINE
                            }
                        }
                        case Y::bstr: case Y::tstr: {
                            II const o = i;
                            switch (mnr) {
                                case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
                                case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F:
                                case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
                                    return  (bio::get(t, i, e, 1 + mnr)) ||
                                            (bio::rewind(i, o), cx/cbor::read_error::unexpected)
                                    ;
                                case 0x18: case 0x19: case 0x1A: case 0x1B: {
                                    std::size_t n;
                                    return  (
                                                bio::get(t, i, e) &&
                                                bio::get(n, 1U << (mnr - 0x18), i, e) &&
                                                bio::poke(t, n, 1U << (mnr - 0x18)) &&
                                                bio::get(t, i, e, n)
                                            )   ||
                                            (   bio::rewind(i, o), cx/cbor::read_error::unexpected
                                            )
                                    ;
                                }
                                case 0x1F:
                                    do      (bio::get(t, i, e)); // should not fail
                                    while   (bio::peek(i, e) != Y::brk);
                                    return  (bio::get(t, i, e) || (bio::rewind(i, o), cx/cbor::read_error::unexpected));
                                case 0x1C: case 0x1D: case 0x1E:
                                    return  (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                default:                                            // LCOV_EXCL_LINE
                                    return  CXON_ASSERT(0, "unexpected"), false;    // LCOV_EXCL_LINE
                            }
                        }
                        case Y::arr: case Y::map: {
                            II const o = i;
                            switch (mnr) {
                                case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:
                                case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F:
                                case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
                                    bio::get(t, i, e); // should not fail
                                    for (unsigned j = 0; j != mnr; ++j)
                                        if (!read_element(s, mjr, i, e, cx))
                                            return (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                    return  true;
                                case 0x18: case 0x19: case 0x1A: case 0x1B: {
                                    std::size_t n;
                                    if (!bio::get(t, i, e) || !bio::get(n, 1U << (mnr - 0x18), i, e) || !bio::poke(t, n, 1U << (mnr - 0x18)))
                                        return (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                    for (unsigned j = 0; j != n; ++j)
                                        if (!read_element(s, mjr, i, e, cx))
                                            return (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                    return  true;
                                }
                                case 0x1F:
                                    bio::get(t, i, e); // should not fail
                                    while (bio::peek(i, e) != Y::brk)
                                        if (!read_element(s, mjr, i, e, cx))
                                            return (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                    return  (bio::get(t, i, e) || (bio::rewind(i, o), cx/cbor::read_error::unexpected));
                                case 0x1C: case 0x1D: case 0x1E:
                                    return  (bio::rewind(i, o), cx/cbor::read_error::unexpected);
                                default:                                            // LCOV_EXCL_LINE
                                    return  CXON_ASSERT(0, "unexpected"), false;    // LCOV_EXCL_LINE
                            }
                        }
                        default:                                        // LCOV_EXCL_LINE
                            return CXON_ASSERT(0, "unexpected"), false; // LCOV_EXCL_LINE
                    }
                }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rdi
callq 0x18f970
movq %rax, -0x30(%rbp)
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movl $0xff, %edx
callq 0x2c880
movb %al, -0x31(%rbp)
movzbl -0x31(%rbp), %eax
andl $-0x20, %eax
movl %eax, -0x38(%rbp)
movzbl -0x31(%rbp), %eax
andl $0x1f, %eax
movl %eax, -0x3c(%rbp)
movl -0x38(%rbp), %eax
movl %eax, -0xd4(%rbp)
testl %eax, %eax
je 0x18f347
jmp 0x18f2d0
movl -0xd4(%rbp), %eax
subl $0x20, %eax
je 0x18f347
jmp 0x18f2dd
movl -0xd4(%rbp), %eax
subl $0x40, %eax
je 0x18f446
jmp 0x18f2ee
movl -0xd4(%rbp), %eax
subl $0x60, %eax
je 0x18f446
jmp 0x18f2ff
movl -0xd4(%rbp), %eax
subl $0x80, %eax
je 0x18f669
jmp 0x18f312
movl -0xd4(%rbp), %eax
subl $0xa0, %eax
je 0x18f669
jmp 0x18f325
movl -0xd4(%rbp), %eax
subl $0xc0, %eax
je 0x18f347
jmp 0x18f334
movl -0xd4(%rbp), %eax
subl $0xe0, %eax
jne 0x18f958
jmp 0x18f347
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movl -0x3c(%rbp), %eax
movl %eax, -0xd8(%rbp)
subl $0x18, %eax
jb 0x18f389
jmp 0x18f362
movl -0xd8(%rbp), %eax
addl $-0x18, %eax
subl $0x4, %eax
jb 0x18f3ac
jmp 0x18f372
movl -0xd8(%rbp), %eax
addl $-0x1c, %eax
subl $0x4, %eax
jb 0x18f418
jmp 0x18f43d
movq -0x30(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x50(%rbp), %rdi
callq 0x18f9a0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movq -0x30(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movl -0x3c(%rbp), %ecx
subl $0x18, %ecx
movl $0x1, %eax
shll %cl, %eax
addl $0x1, %eax
movslq %eax, %rcx
movq -0x58(%rbp), %rdi
callq 0x18fa10
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0xd9(%rbp)
jne 0x18f408
movq -0x18(%rbp), %rdi
movq -0x48(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
movb %al, -0xd9(%rbp)
movb -0xd9(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movq -0x18(%rbp), %rdi
movq -0x48(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movb $0x0, -0x1(%rbp)
jmp 0x18f95c
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x60(%rbp)
movl -0x3c(%rbp), %eax
movq %rax, -0xe8(%rbp)
subq $0x1f, %rax
ja 0x18f660
movq -0xe8(%rbp), %rax
leaq 0xa6bf1(%rip), %rcx     # 0x236064
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x30(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, %eax
movl %eax, %ecx
movq -0x68(%rbp), %rdi
callq 0x18fa10
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0xe9(%rbp)
jne 0x18f4cf
movq -0x18(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
movb %al, -0xe9(%rbp)
movb -0xe9(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movq -0x30(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x78(%rbp), %rdi
callq 0x18f9a0
testb $0x1, %al
jne 0x18f4fe
jmp 0x18f56e
movl -0x3c(%rbp), %ecx
subl $0x18, %ecx
movl $0x1, %esi
shll %cl, %esi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
leaq -0x70(%rbp), %rdi
callq 0x2c910
testb $0x1, %al
jne 0x18f522
jmp 0x18f56e
movq -0x70(%rbp), %rsi
movl -0x3c(%rbp), %ecx
subl $0x18, %ecx
movl $0x1, %edx
shll %cl, %edx
leaq -0x30(%rbp), %rdi
callq 0x18fa50
testb $0x1, %al
jne 0x18f542
jmp 0x18f56e
movq -0x30(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x70(%rbp), %rcx
movq -0x80(%rbp), %rdi
callq 0x18fa10
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0xea(%rbp)
jne 0x18f58f
movq -0x18(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
movb %al, -0xea(%rbp)
movb -0xea(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
jmp 0x18f5a1
movq -0x30(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x88(%rbp), %rdi
callq 0x18f9a0
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movl $0xff, %edx
callq 0x2c880
movzbl %al, %eax
cmpl $0xff, %eax
jne 0x18f5a1
movq -0x30(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x90(%rbp), %rdi
callq 0x18f9a0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0xeb(%rbp)
jne 0x18f62b
movq -0x18(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
movb %al, -0xeb(%rbp)
movb -0xeb(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movq -0x18(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movb $0x0, -0x1(%rbp)
jmp 0x18f95c
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x98(%rbp)
movl -0x3c(%rbp), %eax
movq %rax, -0xf8(%rbp)
subq $0x1f, %rax
ja 0x18f952
movq -0xf8(%rbp), %rax
leaq 0xa694b(%rip), %rcx     # 0x235fe4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x30(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0xa0(%rbp), %rdi
callq 0x18f9a0
movl $0x0, -0xa4(%rbp)
movl -0xa4(%rbp), %eax
cmpl -0x3c(%rbp), %eax
je 0x18f730
movq -0x10(%rbp), %rdi
movl -0x38(%rbp), %eax
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movzbl %al, %esi
callq 0x18fa80
testb $0x1, %al
jne 0x18f71d
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
jmp 0x18f71f
movl -0xa4(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xa4(%rbp)
jmp 0x18f6cb
movb $0x1, -0x1(%rbp)
jmp 0x18f95c
movq -0x30(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0xb8(%rbp), %rdi
callq 0x18f9a0
testb $0x1, %al
jne 0x18f75e
jmp 0x18f7a6
movl -0x3c(%rbp), %ecx
subl $0x18, %ecx
movl $0x1, %esi
shll %cl, %esi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
leaq -0xb0(%rbp), %rdi
callq 0x2c910
testb $0x1, %al
jne 0x18f785
jmp 0x18f7a6
movq -0xb0(%rbp), %rsi
movl -0x3c(%rbp), %ecx
subl $0x18, %ecx
movl $0x1, %edx
shll %cl, %edx
leaq -0x30(%rbp), %rdi
callq 0x18fa50
testb $0x1, %al
jne 0x18f7ce
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movl $0x0, -0xbc(%rbp)
movl -0xbc(%rbp), %eax
cmpq -0xb0(%rbp), %rax
je 0x18f841
movq -0x10(%rbp), %rdi
movl -0x38(%rbp), %eax
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movzbl %al, %esi
callq 0x18fa80
testb $0x1, %al
jne 0x18f82e
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
jmp 0x18f830
movl -0xbc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xbc(%rbp)
jmp 0x18f7d8
movb $0x1, -0x1(%rbp)
jmp 0x18f95c
movq -0x30(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0xc8(%rbp), %rdi
callq 0x18f9a0
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movl $0xff, %edx
callq 0x2c880
movzbl %al, %eax
cmpl $0xff, %eax
je 0x18f8ce
movq -0x10(%rbp), %rdi
movl -0x38(%rbp), %eax
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %r8
movzbl %al, %esi
callq 0x18fa80
testb $0x1, %al
jne 0x18f8cc
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
jmp 0x18f869
movq -0x30(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0xd0(%rbp), %rdi
callq 0x18f9a0
movb %al, %cl
movb $0x1, %al
testb $0x1, %cl
movb %al, -0xf9(%rbp)
jne 0x18f920
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
movb %al, -0xf9(%rbp)
movb -0xf9(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movq -0x18(%rbp), %rdi
movq -0x98(%rbp), %rsi
callq 0x2c9c0
movq -0x28(%rbp), %rdi
movl $0x1, %esi
callq 0x2c9e0
andb $0x1, %al
movb %al, -0x1(%rbp)
jmp 0x18f95c
movb $0x0, -0x1(%rbp)
jmp 0x18f95c
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nopw (%rax,%rax)