// File: grame-cncm[P]digraph/./dglib/digraphop.hh
// Function: Tarjan<char, std::pair<std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, int, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, int>>>, int>>::visit(char const&)
void visit(const N& v)
    {
        // std::cout << "start (first) visit of " << v << std::endl;
        auto& x = fAux[v];
        fStack.push(v);
        x.fStacked = true;
        x.fVisited = true;
        x.fNum1 = x.fNum2 = fGroup;
        ++fGroup;

        // std::cout << "visit all nodes connected to " << v << std::endl;
        for (const auto& p : fGraph.connections(v)) {
            // std::cout << "we have a connection " << v << "-" << p.second << "->" << p.first <<
            // std::endl;
            const N& w = p.first;
            auto&    y = fAux[w];
            if (!y.fVisited) {
                visit(w);
                x.fNum2 = std::min(x.fNum2, y.fNum2);
            } else {
                if (y.fStacked) {
                    // std::cout << "the node " << w << " is already in the std::stack" <<
                    // std::endl;
                    x.fNum2 = std::min(x.fNum2, y.fNum1);
                }
            }
        }

        if (x.fNum1 == x.fNum2) {
            // std::cout << "the node " << v << " is the root of a cycle" << std::endl;

            std::set<N> cycle;
            bool        finished = false;
            do {
                const N& w = fStack.top();
                fStack.pop();
                fAux[w].fStacked = false;
                cycle.insert(w);
                finished = (w == v);
            } while (!finished);
            fPartition.insert(cycle);
            if ((cycle.size() > 1) || fGraph.areConnected(v, v)) {
                fCycleCount++;
            }
        }
        // std::cout << "end (first) visit of " << v << std::endl;
    }

// Assembly:
subq $0xf8, %rsp
movq %rdi, 0xf0(%rsp)
movq %rsi, 0xe8(%rsp)
movq 0xf0(%rsp), %rdi
movq %rdi, 0x38(%rsp)
addq $0x60, %rdi
movq 0xe8(%rsp), %rsi
callq 0xbee0
movq 0x38(%rsp), %rdi
movq %rax, 0xe0(%rsp)
addq $0x10, %rdi
movq 0xe8(%rsp), %rsi
callq 0xbfd0
movq 0x38(%rsp), %rax
movq 0xe0(%rsp), %rcx
movb $0x1, 0x1(%rcx)
movq 0xe0(%rsp), %rcx
movb $0x1, (%rcx)
movl 0x8(%rax), %edx
movq 0xe0(%rsp), %rcx
movl %edx, 0x8(%rcx)
movq 0xe0(%rsp), %rcx
movl %edx, 0x4(%rcx)
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movq (%rax), %rdi
movq 0xe8(%rsp), %rsi
callq 0xa1f0
movq %rax, 0xd8(%rsp)
movq 0xd8(%rsp), %rdi
callq 0xa220
movq %rax, 0xd0(%rsp)
movq 0xd8(%rsp), %rdi
callq 0xa250
movq %rax, 0xc8(%rsp)
leaq 0xd0(%rsp), %rdi
leaq 0xc8(%rsp), %rsi
callq 0xa280
testb $0x1, %al
jne 0xafe1
jmp 0xb0bd
leaq 0xd0(%rsp), %rdi
callq 0xa2a0
movq 0x38(%rsp), %rdi
movq %rax, 0xc0(%rsp)
movq 0xc0(%rsp), %rax
movq %rax, 0xb8(%rsp)
addq $0x60, %rdi
movq 0xb8(%rsp), %rsi
callq 0xbee0
movq %rax, 0xb0(%rsp)
movq 0xb0(%rsp), %rax
testb $0x1, (%rax)
jne 0xb06f
movq 0x38(%rsp), %rdi
movq 0xb8(%rsp), %rsi
callq 0xaef0
movq 0xe0(%rsp), %rdi
addq $0x8, %rdi
movq 0xb0(%rsp), %rsi
addq $0x8, %rsi
callq 0x8440
movl (%rax), %ecx
movq 0xe0(%rsp), %rax
movl %ecx, 0x8(%rax)
jmp 0xb0a9
movq 0xb0(%rsp), %rax
testb $0x1, 0x1(%rax)
je 0xb0a7
movq 0xe0(%rsp), %rdi
addq $0x8, %rdi
movq 0xb0(%rsp), %rsi
addq $0x4, %rsi
callq 0x8440
movl (%rax), %ecx
movq 0xe0(%rsp), %rax
movl %ecx, 0x8(%rax)
jmp 0xb0a9
jmp 0xb0ab
leaq 0xd0(%rsp), %rdi
callq 0xa320
jmp 0xafc3
movq 0xe0(%rsp), %rax
movl 0x4(%rax), %eax
movq 0xe0(%rsp), %rcx
cmpl 0x8(%rcx), %eax
jne 0xb249
leaq 0x80(%rsp), %rdi
callq 0x5200
movb $0x0, 0x7f(%rsp)
movq 0x38(%rsp), %rdi
addq $0x10, %rdi
callq 0xc000
movq %rax, 0x30(%rsp)
jmp 0xb100
movq 0x38(%rsp), %rdi
movq 0x30(%rsp), %rax
movq %rax, 0x70(%rsp)
addq $0x10, %rdi
callq 0xc010
jmp 0xb11a
movq 0x38(%rsp), %rdi
addq $0x60, %rdi
movq 0x70(%rsp), %rsi
callq 0xbee0
movq %rax, 0x28(%rsp)
jmp 0xb134
movq 0x28(%rsp), %rax
movb $0x0, 0x1(%rax)
movq 0x70(%rsp), %rsi
leaq 0x80(%rsp), %rdi
callq 0x6840
movb %dl, 0x1f(%rsp)
movq %rax, 0x20(%rsp)
jmp 0xb15a
movb 0x1f(%rsp), %al
movq 0x20(%rsp), %rcx
movq %rcx, 0x50(%rsp)
movb %al, 0x58(%rsp)
movq 0x70(%rsp), %rax
movsbl (%rax), %eax
movq 0xe8(%rsp), %rcx
movsbl (%rcx), %ecx
cmpl %ecx, %eax
sete %al
andb $0x1, %al
movb %al, 0x7f(%rsp)
movb 0x7f(%rsp), %al
xorb $-0x1, %al
testb $0x1, %al
jne 0xb0eb
movq 0x38(%rsp), %rdi
addq $0x90, %rdi
leaq 0x80(%rsp), %rsi
callq 0xc020
movb %dl, 0xf(%rsp)
movq %rax, 0x10(%rsp)
jmp 0xb1bc
movb 0xf(%rsp), %al
movq 0x10(%rsp), %rcx
movq %rcx, 0x40(%rsp)
movb %al, 0x48(%rsp)
leaq 0x80(%rsp), %rdi
callq 0xc080
cmpq $0x1, %rax
ja 0xb209
movq 0x38(%rsp), %rax
movq (%rax), %rdi
movq 0xe8(%rsp), %rdx
movq %rdx, %rsi
callq 0xc090
movb %al, 0xe(%rsp)
jmp 0xb1ff
movb 0xe(%rsp), %al
testb $0x1, %al
jne 0xb209
jmp 0xb23c
movq 0x38(%rsp), %rax
movl 0xc0(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0xc0(%rax)
jmp 0xb23c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x68(%rsp)
movl %eax, 0x64(%rsp)
leaq 0x80(%rsp), %rdi
callq 0x5620
jmp 0xb251
leaq 0x80(%rsp), %rdi
callq 0x5620
addq $0xf8, %rsp
retq
movq 0x68(%rsp), %rdi
callq 0x2290
nopl (%rax,%rax)