// File: /workspace/github_cpp_makefile_star2_O2/elarielcl[P]ArielsSequitur/TestSequitur.cpp
// Function: main
int main() {
  vector<char*> v;
  vector <char*> :: iterator s;

  v.push_back((char*)"abcdbcabcd");
  v.push_back((char*)"cdddcdaddcd");
  v.push_back((char*)"cdddcdaddcdcdddcdaddcdcdddcdaddcdcdddcdaddcdcdddcdaddcdcdddcdaddcdcdddcdaddcdcdddcdaddcd");
  v.push_back((char*)"aaaaaaaaaaaaaaaaaaaaaaaa");
  v.push_back((char*)"ababababababababab");

  cout << "SIMPLE TEST" << endl << "=====================================" << endl << endl;
  for (s = v.begin(); s != v.end(); ++s)
    simpleTest(*s);

  vector<int> nOR;
  nOR.push_back(3);
  nOR.push_back(3);
  nOR.push_back(6);
  nOR.push_back(4);
  nOR.push_back(4); // Precomputed Values
  cout << "GRAMMAR SIZE TEST" << endl << "=====================================" << endl << endl;
  for (int i = 0; i < nOR.size(); ++i)
    numberOfRulesTest(v[i], nOR[i]);


  vector<int> sizes;
  sizes.push_back(8);
  sizes.push_back(9);
  sizes.push_back(15);
  sizes.push_back(9);
  sizes.push_back(9); // Precomputed Values
  cout << "GRAMMAR SIZE TEST" << endl << "=====================================" << endl << endl;
  for (int i = 0; i < sizes.size(); ++i)
    grammarSizeTest(v[i], sizes[i]);

  cout << "RULE USAGE TEST" << endl << "=====================================" << endl << endl;
  for (s = v.begin(); s != v.end(); ++s)
    ruleUsageTest(*s);

  cout << "DIGRAM UNIQUENESS TEST" << endl << "=====================================" << endl << endl;
  for (s = v.begin(); s != v.end(); ++s)
    digramUniquenessTest(*s);

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0x68, %rsp
xorps %xmm0, %xmm0
leaq -0x30(%rbp), %rdi
andq $0x0, 0x10(%rdi)
movaps %xmm0, (%rdi)
leaq 0x2be9(%rip), %rax      # 0x5004
leaq -0x70(%rbp), %rsi
movq %rax, (%rsi)
callq 0x32ac
leaq 0x2c2e(%rip), %rax      # 0x505c
leaq -0x70(%rbp), %rsi
movq %rax, (%rsi)
leaq -0x30(%rbp), %rdi
callq 0x32ac
leaq 0x2bca(%rip), %rax      # 0x500f
leaq -0x70(%rbp), %rsi
movq %rax, (%rsi)
leaq -0x30(%rbp), %rdi
callq 0x32ac
leaq 0x2c0c(%rip), %rax      # 0x5068
leaq -0x70(%rbp), %rsi
movq %rax, (%rsi)
leaq -0x30(%rbp), %rdi
callq 0x32ac
leaq 0x2c0e(%rip), %rax      # 0x5081
leaq -0x70(%rbp), %rsi
movq %rax, (%rsi)
leaq -0x30(%rbp), %rdi
callq 0x32ac
movq 0x5b4e(%rip), %rdi      # 0x7fd8
leaq 0x2c03(%rip), %rsi      # 0x5094
callq 0x2130
movq %rax, %rdi
callq 0x20b0
leaq 0x2bfb(%rip), %rsi      # 0x50a0
movq %rax, %rdi
callq 0x2130
movq %rax, %rdi
callq 0x20b0
movq %rax, %rdi
callq 0x20b0
movq -0x30(%rbp), %rbx
cmpq -0x28(%rbp), %rbx
je 0x24d5
movq (%rbx), %rdi
callq 0x2793
addq $0x8, %rbx
jmp 0x24c1
leaq -0x70(%rbp), %rdi
andq $0x0, 0x10(%rdi)
xorps %xmm0, %xmm0
movaps %xmm0, (%rdi)
leaq -0x50(%rbp), %rsi
movl $0x3, (%rsi)
callq 0x3488
leaq -0x50(%rbp), %rsi
movl $0x3, (%rsi)
leaq -0x70(%rbp), %rdi
callq 0x3488
leaq -0x50(%rbp), %rsi
movl $0x6, (%rsi)
leaq -0x70(%rbp), %rdi
callq 0x3488
leaq -0x50(%rbp), %rsi
movl $0x4, (%rsi)
leaq -0x70(%rbp), %rdi
callq 0x3488
leaq -0x50(%rbp), %rsi
movl $0x4, (%rsi)
leaq -0x70(%rbp), %rdi
callq 0x3488
movq 0x5a92(%rip), %rdi      # 0x7fd8
leaq 0x2b79(%rip), %rsi      # 0x50c6
callq 0x2130
movq %rax, %rdi
callq 0x20b0
leaq 0x2b3f(%rip), %rsi      # 0x50a0
movq %rax, %rdi
callq 0x2130
movq %rax, %rdi
callq 0x20b0
movq %rax, %rdi
callq 0x20b0
xorl %ebx, %ebx
movq -0x70(%rbp), %rax
movq -0x68(%rbp), %rcx
subq %rax, %rcx
sarq $0x2, %rcx
cmpq %rbx, %rcx
jbe 0x25a4
movq -0x30(%rbp), %rcx
movq (%rcx,%rbx,8), %rdi
movl (%rax,%rbx,4), %esi
callq 0x2911
incq %rbx
jmp 0x257b
leaq -0x50(%rbp), %rdi
andq $0x0, 0x10(%rdi)
xorps %xmm0, %xmm0
movaps %xmm0, (%rdi)
leaq -0xc(%rbp), %rsi
movl $0x8, (%rsi)
callq 0x3488
leaq -0xc(%rbp), %rsi
movl $0x9, (%rsi)
leaq -0x50(%rbp), %rdi
callq 0x3488
leaq -0xc(%rbp), %rsi
movl $0xf, (%rsi)
leaq -0x50(%rbp), %rdi
callq 0x3488
leaq -0xc(%rbp), %rsi
movl $0x9, (%rsi)
leaq -0x50(%rbp), %rdi
callq 0x3488
leaq -0xc(%rbp), %rsi
movl $0x9, (%rsi)
leaq -0x50(%rbp), %rdi
callq 0x3488
movq 0x59c3(%rip), %rdi      # 0x7fd8
leaq 0x2aaa(%rip), %rsi      # 0x50c6
callq 0x2130
movq %rax, %rdi
callq 0x20b0
leaq 0x2a70(%rip), %rsi      # 0x50a0
movq %rax, %rdi
callq 0x2130
movq %rax, %rdi
callq 0x20b0
movq %rax, %rdi
callq 0x20b0
xorl %ebx, %ebx
movq -0x50(%rbp), %rax
movq -0x48(%rbp), %rcx
subq %rax, %rcx
sarq $0x2, %rcx
cmpq %rbx, %rcx
jbe 0x2673
movq -0x30(%rbp), %rcx
movq (%rcx,%rbx,8), %rdi
movl (%rax,%rbx,4), %esi
callq 0x2a32
incq %rbx
jmp 0x264a
movq 0x595e(%rip), %rdi      # 0x7fd8
leaq 0x2a57(%rip), %rsi      # 0x50d8
callq 0x2130
movq %rax, %rdi
callq 0x20b0
leaq 0x2a0b(%rip), %rsi      # 0x50a0
movq %rax, %rdi
callq 0x2130
movq %rax, %rdi
callq 0x20b0
movq %rax, %rdi
callq 0x20b0
movq -0x30(%rbp), %rbx
cmpq -0x28(%rbp), %rbx
je 0x26c5
movq (%rbx), %rdi
callq 0x2b53
addq $0x8, %rbx
jmp 0x26b1
movq 0x590c(%rip), %rdi      # 0x7fd8
leaq 0x2a15(%rip), %rsi      # 0x50e8
callq 0x2130
movq %rax, %rdi
callq 0x20b0
leaq 0x29b9(%rip), %rsi      # 0x50a0
movq %rax, %rdi
callq 0x2130
movq %rax, %rdi
callq 0x20b0
movq %rax, %rdi
callq 0x20b0
movq -0x30(%rbp), %rbx
cmpq -0x28(%rbp), %rbx
je 0x2717
movq (%rbx), %rdi
callq 0x2e2e
addq $0x8, %rbx
jmp 0x2703
leaq -0x50(%rbp), %rdi
callq 0x344a
leaq -0x70(%rbp), %rdi
callq 0x344a
leaq -0x30(%rbp), %rdi
callq 0x326e
xorl %eax, %eax
addq $0x68, %rsp
popq %rbx
popq %rbp
retq
jmp 0x2763
jmp 0x2763
jmp 0x2763
jmp 0x2763
jmp 0x2763
jmp 0x2771
jmp 0x2771
jmp 0x2771
jmp 0x2771
jmp 0x2771
jmp 0x277f
jmp 0x277f
jmp 0x277f
jmp 0x277f
jmp 0x277f
jmp 0x2771
jmp 0x277f
jmp 0x2763
jmp 0x2763
jmp 0x2763
movq %rax, %rbx
leaq -0x50(%rbp), %rdi
callq 0x344a
jmp 0x2774
movq %rax, %rbx
leaq -0x70(%rbp), %rdi
callq 0x344a
jmp 0x2782
movq %rax, %rbx
leaq -0x30(%rbp), %rdi
callq 0x326e
movq %rbx, %rdi
callq 0x21e0