// File: /workspace/github_cpp_makefile_star2_O2/ArashPartow[P]exprtk/./exprtk.hpp
// Function: bool exprtk::details::match_impl<char const*, exprtk::details::cis_match>(char const*, char const*, char const*, char const*, std::iterator_traits<char const*>::value_type const&, std::iterator_traits<char const*>::value_type const&)
inline bool match_impl(const Iterator pattern_begin,
                             const Iterator pattern_end  ,
                             const Iterator data_begin   ,
                             const Iterator data_end     ,
                             const typename std::iterator_traits<Iterator>::value_type& zero_or_more,
                             const typename std::iterator_traits<Iterator>::value_type& exactly_one )
      {
         typedef typename std::iterator_traits<Iterator>::value_type type;

         const Iterator null_itr(0);

         Iterator p_itr  = pattern_begin;
         Iterator d_itr  = data_begin;
         Iterator np_itr = null_itr;
         Iterator nd_itr = null_itr;

         for ( ; ; )
         {
            if (p_itr != pattern_end)
            {
               const type c = *(p_itr);

               if ((data_end != d_itr) && (Compare::cmp(c,*(d_itr)) || (exactly_one == c)))
               {
                  ++d_itr;
                  ++p_itr;
                  continue;
               }
               else if (zero_or_more == c)
               {
                  while ((pattern_end != p_itr) && (zero_or_more == *(p_itr)))
                  {
                     ++p_itr;
                  }

                  const type d = *(p_itr);

                  while ((data_end != d_itr) && !(Compare::cmp(d,*(d_itr)) || (exactly_one == d)))
                  {
                     ++d_itr;
                  }

                  // set backtrack iterators
                  np_itr = p_itr - 1;
                  nd_itr = d_itr + 1;

                  continue;
               }
            }
            else if (data_end == d_itr)
               break;

            if ((data_end == d_itr) || (null_itr == nd_itr))
                return false;

            p_itr = np_itr;
            d_itr = nd_itr;
         }

         return true;
      }

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %r9, 0x8(%rsp)
movq %r8, 0x10(%rsp)
movq %rcx, %r15
movq %rdx, %r13
movq %rsi, (%rsp)
movq %rdi, %rbp
xorl %r14d, %r14d
xorl %ebx, %ebx
cmpq (%rsp), %rbp
je 0x254dcf
movb (%rbp), %r12b
cmpq %r15, %r13
je 0x254dc3
movsbl (%r13), %esi
movsbl %r12b, %edi
callq 0x254e50
testb %al, %al
jne 0x254dfb
movq 0x8(%rsp), %rax
cmpb %r12b, (%rax)
je 0x254dfb
movq 0x10(%rsp), %rax
cmpb %r12b, (%rax)
jne 0x254dd4
jmp 0x254deb
cmpq %r15, %r13
je 0x254e3f
xorl %eax, %eax
cmpq %r15, %r13
je 0x254e41
movq %rbx, %r13
movq %r14, %rbp
testq %rbx, %rbx
jne 0x254d98
jmp 0x254e41
incq %rbp
cmpq (%rsp), %rbp
je 0x254e03
movb (%rbp), %bl
cmpb %bl, %r12b
je 0x254de8
jmp 0x254e0a
incq %r13
incq %rbp
jmp 0x254d98
movq (%rsp), %rbp
movb (%rbp), %bl
movsbl %bl, %r14d
cmpq %r15, %r13
je 0x254e32
movsbl (%r13), %esi
movl %r14d, %edi
callq 0x254e50
testb %al, %al
jne 0x254e32
movq 0x8(%rsp), %rax
cmpb %bl, (%rax)
je 0x254e32
incq %r13
jmp 0x254e0e
leaq -0x1(%rbp), %r14
leaq 0x1(%r13), %rbx
jmp 0x254d98
movb $0x1, %al
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq