// File: dsharlet[P]array/test/shape.cpp
// Function: void nda::test_number_theory<nda::shape<nda::dim<-9l, -9l, -9l>, nda::dim<-9l, -9l, -9l>>>(nda::shape<nda::dim<-9l, -9l, -9l>, nda::dim<-9l, -9l, -9l>>)
void test_number_theory(Shape s) {
  s.resolve();

  std::vector<int> addresses(static_cast<size_t>(s.flat_extent()), 0);
  for_each_index(s, [&](const typename Shape::index_type& i) {
    addresses[static_cast<size_t>(s[i] - s.flat_min())] += 1;
  });
  bool is_compact = std::all_of(addresses.begin(), addresses.end(), [](int c) { return c >= 1; });
  bool is_one_to_one =
      std::all_of(addresses.begin(), addresses.end(), [](int c) { return c <= 1; });

  ASSERT_EQ(s.is_compact(), is_compact);
  ASSERT_EQ(s.is_one_to_one(), is_one_to_one);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x4f0, %rsp            # imm = 0x4F0
movq %rdi, -0x408(%rbp)
movq %rdi, -0x8(%rbp)
callq 0x1a1a0
movq -0x408(%rbp), %rdi
callq 0x1a1c0
movq %rax, -0x400(%rbp)
movl $0x0, -0x24(%rbp)
leaq -0x25(%rbp), %rdi
movq %rdi, -0x3f8(%rbp)
callq 0x10e30
movq -0x400(%rbp), %rsi
movq -0x3f8(%rbp), %rcx
leaq -0x20(%rbp), %rdi
leaq -0x24(%rbp), %rdx
callq 0x1bd7f0
jmp 0x18c5d2
leaq -0x25(%rbp), %rdi
callq 0x10e50
movq -0x408(%rbp), %rdi
leaq -0x20(%rbp), %rax
movq %rax, -0x48(%rbp)
movq %rdi, -0x40(%rbp)
leaq -0x48(%rbp), %rsi
callq 0x189bd0
jmp 0x18c5f9
leaq -0x20(%rbp), %rdi
movq %rdi, -0x418(%rbp)
callq 0x1bd8c0
movq -0x418(%rbp), %rdi
movq %rax, -0x58(%rbp)
callq 0x1bd8f0
movq %rax, -0x60(%rbp)
movq -0x58(%rbp), %rdi
movq -0x60(%rbp), %rsi
callq 0x1bd870
movb %al, -0x409(%rbp)
jmp 0x18c632
movb -0x409(%rbp), %al
andb $0x1, %al
movb %al, -0x49(%rbp)
leaq -0x20(%rbp), %rdi
movq %rdi, -0x428(%rbp)
callq 0x1bd8c0
movq -0x428(%rbp), %rdi
movq %rax, -0x70(%rbp)
callq 0x1bd8f0
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rdi
movq -0x78(%rbp), %rsi
callq 0x1bd920
movb %al, -0x419(%rbp)
jmp 0x18c676
movq -0x408(%rbp), %rdi
movb -0x419(%rbp), %al
andb $0x1, %al
movb %al, -0x62(%rbp)
callq 0x195140
movb %al, -0x429(%rbp)
jmp 0x18c695
movb -0x429(%rbp), %al
movzbl %al, %eax
andl $0x1, %eax
movzbl -0x49(%rbp), %ecx
andl $0x1, %ecx
subl %ecx, %eax
sete %al
movb %al, -0x439(%rbp)
leaq -0x231(%rbp), %rdi
movq %rdi, -0x438(%rbp)
callq 0x33b0
movq -0x438(%rbp), %rdx
leaq 0x70667(%rip), %rsi     # 0x1fcd3b
leaq -0x230(%rbp), %rdi
callq 0x10a90
jmp 0x18c6e2
movb -0x439(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x210(%rbp), %rdi
leaq -0x230(%rbp), %rdx
callq 0x10f80
jmp 0x18c703
leaq 0x500db(%rip), %rsi     # 0x1dc7e5
leaq -0x210(%rbp), %rdi
callq 0x34320
movq %rax, -0x448(%rbp)
jmp 0x18c71f
movq -0x448(%rbp), %rdi
leaq 0x7062b(%rip), %rsi     # 0x1fcd58
callq 0x36fb0
movq %rax, -0x450(%rbp)
jmp 0x18c73b
movq -0x450(%rbp), %rdi
leaq 0x54063(%rip), %rsi     # 0x1e07ac
callq 0x34320
movq %rax, -0x458(%rbp)
jmp 0x18c757
movq -0x408(%rbp), %rdi
callq 0x195140
movb %al, -0x459(%rbp)
jmp 0x18c76b
movq -0x458(%rbp), %rdi
movb -0x459(%rbp), %al
andb $0x1, %al
movb %al, -0x232(%rbp)
leaq -0x232(%rbp), %rsi
callq 0x1bd970
movq %rax, -0x468(%rbp)
jmp 0x18c795
movq -0x468(%rbp), %rdi
leaq 0x50042(%rip), %rsi     # 0x1dc7e5
callq 0x34320
movq %rax, -0x470(%rbp)
jmp 0x18c7b1
movq -0x470(%rbp), %rdi
leaq 0x7058e(%rip), %rsi     # 0x1fcd4d
callq 0x34570
movq %rax, -0x478(%rbp)
jmp 0x18c7cd
movq -0x478(%rbp), %rdi
leaq 0x53fd1(%rip), %rsi     # 0x1e07ac
callq 0x34320
movq %rax, -0x480(%rbp)
jmp 0x18c7e9
movq -0x480(%rbp), %rdi
leaq -0x49(%rbp), %rsi
callq 0x1bd970
movq %rax, -0x488(%rbp)
jmp 0x18c802
movq -0x488(%rbp), %rdi
leaq 0x69c6b(%rip), %rsi     # 0x1f647b
callq 0x34320
jmp 0x18c817
leaq -0x210(%rbp), %rdi
callq 0x10ff0
jmp 0x18c825
leaq -0x230(%rbp), %rdi
callq 0x3100
leaq -0x231(%rbp), %rdi
callq 0x3290
movq -0x408(%rbp), %rdi
callq 0x195180
movb %al, -0x489(%rbp)
jmp 0x18c851
movb -0x489(%rbp), %al
movzbl %al, %eax
andl $0x1, %eax
movzbl -0x62(%rbp), %ecx
andl $0x1, %ecx
subl %ecx, %eax
sete %al
movb %al, -0x499(%rbp)
leaq -0x3e9(%rbp), %rdi
movq %rdi, -0x498(%rbp)
callq 0x33b0
movq -0x498(%rbp), %rdx
leaq 0x704d7(%rip), %rsi     # 0x1fcd67
leaq -0x3e8(%rbp), %rdi
callq 0x10a90
jmp 0x18c89e
movb -0x499(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x3c8(%rbp), %rdi
leaq -0x3e8(%rbp), %rdx
callq 0x10f80
jmp 0x18c8bf
leaq 0x4ff1f(%rip), %rsi     # 0x1dc7e5
leaq -0x3c8(%rbp), %rdi
callq 0x34320
movq %rax, -0x4a8(%rbp)
jmp 0x18c8db
movq -0x4a8(%rbp), %rdi
leaq 0x704a1(%rip), %rsi     # 0x1fcd8a
callq 0x36780
movq %rax, -0x4b0(%rbp)
jmp 0x18c8f7
movq -0x4b0(%rbp), %rdi
leaq 0x53ea7(%rip), %rsi     # 0x1e07ac
callq 0x34320
movq %rax, -0x4b8(%rbp)
jmp 0x18c913
movq -0x408(%rbp), %rdi
callq 0x195180
movb %al, -0x4b9(%rbp)
jmp 0x18c927
movq -0x4b8(%rbp), %rdi
movb -0x4b9(%rbp), %al
andb $0x1, %al
movb %al, -0x3ea(%rbp)
leaq -0x3ea(%rbp), %rsi
callq 0x1bd970
movq %rax, -0x4c8(%rbp)
jmp 0x18c951
movq -0x4c8(%rbp), %rdi
leaq 0x4fe86(%rip), %rsi     # 0x1dc7e5
callq 0x34320
movq %rax, -0x4d0(%rbp)
jmp 0x18c96d
movq -0x4d0(%rbp), %rdi
leaq 0x70401(%rip), %rsi     # 0x1fcd7c
callq 0x347a0
movq %rax, -0x4d8(%rbp)
jmp 0x18c989
movq -0x4d8(%rbp), %rdi
leaq 0x53e15(%rip), %rsi     # 0x1e07ac
callq 0x34320
movq %rax, -0x4e0(%rbp)
jmp 0x18c9a5
movq -0x4e0(%rbp), %rdi
leaq -0x62(%rbp), %rsi
callq 0x1bd970
movq %rax, -0x4e8(%rbp)
jmp 0x18c9be
movq -0x4e8(%rbp), %rdi
leaq 0x69aaf(%rip), %rsi     # 0x1f647b
callq 0x34320
jmp 0x18c9d3
leaq -0x3c8(%rbp), %rdi
callq 0x10ff0
jmp 0x18c9e1
leaq -0x3e8(%rbp), %rdi
callq 0x3100
leaq -0x3e9(%rbp), %rdi
callq 0x3290
leaq -0x20(%rbp), %rdi
callq 0x1bd9c0
addq $0x4f0, %rsp            # imm = 0x4F0
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x25(%rbp), %rdi
callq 0x10e50
jmp 0x18cae1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x18cad8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x18ca7a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x18ca6e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x210(%rbp), %rdi
callq 0x10ff0
jmp 0x18ca6c
jmp 0x18ca6e
leaq -0x230(%rbp), %rdi
callq 0x3100
leaq -0x231(%rbp), %rdi
callq 0x3290
jmp 0x18cad8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x18cacc
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x18cac0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x3c8(%rbp), %rdi
callq 0x10ff0
jmp 0x18cabe
jmp 0x18cac0
leaq -0x3e8(%rbp), %rdi
callq 0x3100
leaq -0x3e9(%rbp), %rdi
callq 0x3290
leaq -0x20(%rbp), %rdi
callq 0x1bd9c0
movq -0x30(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nopw %cs:(%rax,%rax)
nopl (%rax)