// File: ArashPartow[P]exprtk/./exprtk.hpp
// Function: exprtk::expression_helper<double>::match_type_sequence(exprtk::expression<double> const&, std::vector<exprtk::expression_helper<double>::node_types, std::allocator<exprtk::expression_helper<double>::node_types>> const&)
static inline bool match_type_sequence(const expression<T>& expr, const std::vector<node_types>& type_seq)
      {
         if ((0 == expr.control_block_) || !is_vararg(expr))
         {
            return false;
         }

         typedef details::vararg_node<T, exprtk::details::vararg_multi_op<T> > mo_vararg_t;

         mo_vararg_t* vnode = dynamic_cast<mo_vararg_t*>(expr.control_block_->expr);

         if (
              (0 == vnode) ||
              type_seq.empty() ||
              (vnode->size() < type_seq.size())
            )
         {
            return false;
         }

         for (std::size_t i = 0; i < type_seq.size(); ++i)
         {
            assert((*vnode)[i]);

            switch (type_seq[i])
            {
               case e_literal  : { if (details::is_literal_node         ((*vnode)[i])) continue; } break;
               case e_variable : { if (details::is_variable_node        ((*vnode)[i])) continue; } break;
               case e_string   : { if (details::is_generally_string_node((*vnode)[i])) continue; } break;
               case e_unary    : { if (details::is_unary_node           ((*vnode)[i])) continue; } break;
               case e_binary   : { if (details::is_binary_node          ((*vnode)[i])) continue; } break;
               case e_function : { if (details::is_function             ((*vnode)[i])) continue; } break;
               case e_null     : { if (details::is_null_node            ((*vnode)[i])) continue; } break;
               case e_assert   : { if (details::is_assert_node          ((*vnode)[i])) continue; } break;
               case e_sf3ext   : { if (details::is_sf3ext_node          ((*vnode)[i])) continue; } break;
               case e_sf4ext   : { if (details::is_sf4ext_node          ((*vnode)[i])) continue; } break;
               case e_vararg   : break;
            }

            return false;
         }

         return true;
      }

// Assembly:
subq $0x58, %rsp
movq %rdi, 0x48(%rsp)
movq %rsi, 0x40(%rsp)
movq 0x48(%rsp), %rcx
xorl %eax, %eax
cmpq (%rcx), %rax
je 0x598bc8
movq 0x48(%rsp), %rdi
callq 0x59a980
testb $0x1, %al
jne 0x598bd2
movb $0x0, 0x57(%rsp)
jmp 0x598e58
movq 0x48(%rsp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq %rax, 0x28(%rsp)
cmpq $0x0, %rax
je 0x598c0c
movq 0x28(%rsp), %rdi
leaq 0x1d15eb(%rip), %rsi    # 0x76a1e0
leaq 0x203ddc(%rip), %rdx    # 0x79c9d8
xorl %eax, %eax
movl %eax, %ecx
callq 0x11b6d0
movq %rax, 0x20(%rsp)
jmp 0x598c15
xorl %eax, %eax
movq %rax, 0x20(%rsp)
jmp 0x598c15
movq 0x20(%rsp), %rax
movq %rax, 0x38(%rsp)
xorl %eax, %eax
cmpq 0x38(%rsp), %rax
je 0x598c5c
movq 0x40(%rsp), %rdi
callq 0x59a9c0
testb $0x1, %al
jne 0x598c5c
movq 0x38(%rsp), %rdi
callq 0x59aa10
movq %rax, 0x18(%rsp)
movq 0x40(%rsp), %rdi
callq 0x59a650
movq %rax, %rcx
movq 0x18(%rsp), %rax
cmpq %rcx, %rax
jae 0x598c66
movb $0x0, 0x57(%rsp)
jmp 0x598e58
movq $0x0, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x40(%rsp), %rdi
callq 0x59a650
movq %rax, %rcx
movq 0x10(%rsp), %rax
cmpq %rcx, %rax
jae 0x598e53
movq 0x40(%rsp), %rdi
movq 0x30(%rsp), %rsi
callq 0x59aa30
movl (%rax), %eax
movq %rax, 0x8(%rsp)
subq $0xa, %rax
ja 0x598e39
movq 0x8(%rsp), %rax
leaq 0x7814(%rip), %rcx      # 0x5a04d4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x3e7690
testb $0x1, %al
jne 0x598ce6
jmp 0x598ceb
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x23c960
testb $0x1, %al
jne 0x598d0d
jmp 0x598d12
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x3a7600
testb $0x1, %al
jne 0x598d34
jmp 0x598d39
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x59aa80
testb $0x1, %al
jne 0x598d5b
jmp 0x598d60
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x59aac0
testb $0x1, %al
jne 0x598d82
jmp 0x598d87
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x59ab00
testb $0x1, %al
jne 0x598da9
jmp 0x598dae
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x3af620
testb $0x1, %al
jne 0x598dd0
jmp 0x598dd2
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x59ab40
testb $0x1, %al
jne 0x598df1
jmp 0x598df3
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x4858f0
testb $0x1, %al
jne 0x598e12
jmp 0x598e14
jmp 0x598e40
jmp 0x598e39
movq 0x38(%rsp), %rdi
leaq 0x30(%rsp), %rsi
callq 0x59aa50
movq %rax, %rdi
callq 0x59ab80
testb $0x1, %al
jne 0x598e33
jmp 0x598e35
jmp 0x598e40
jmp 0x598e39
jmp 0x598e39
movb $0x0, 0x57(%rsp)
jmp 0x598e58
movq 0x30(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x30(%rsp)
jmp 0x598c6f
movb $0x1, 0x57(%rsp)
movb 0x57(%rsp), %al
andb $0x1, %al
addq $0x58, %rsp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)