当前位置: 首页>>代码示例>>C++>>正文


C++ NFA::graphSize方法代码示例

本文整理汇总了C++中NFA::graphSize方法的典型用法代码示例。如果您正苦于以下问题:C++ NFA::graphSize方法的具体用法?C++ NFA::graphSize怎么用?C++ NFA::graphSize使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在NFA的用法示例。


在下文中一共展示了NFA::graphSize方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: generateNFAForSubtree

static void generateNFAForSubtree(NFA& nfa, unsigned nfaRootId, PrefixTreeVertex& root, size_t maxNFASize)
{
    // This recurses the subtree of the prefix tree.
    // For each edge that has fixed length (no quantifiers like ?, *, or +) it generates the nfa graph,
    // recurses into children, and deletes any processed leaf nodes.
    struct ActiveSubtree {
        ActiveSubtree(PrefixTreeVertex& vertex, unsigned nfaNodeId, unsigned edgeIndex)
            : vertex(vertex)
            , nfaNodeId(nfaNodeId)
            , edgeIndex(edgeIndex)
        {
        }
        PrefixTreeVertex& vertex;
        unsigned nfaNodeId;
        unsigned edgeIndex;
    };
    Vector<ActiveSubtree> stack;
    if (!root.edges.isEmpty())
        stack.append(ActiveSubtree(root, nfaRootId, 0));
    bool nfaTooBig = false;
    
    // Generate graphs for each subtree that does not contain any quantifiers.
    while (!stack.isEmpty()) {
        PrefixTreeVertex& vertex = stack.last().vertex;
        const unsigned edgeIndex = stack.last().edgeIndex;
        
        // Only stop generating an NFA at a leaf to ensure we have a correct NFA. We could go slightly over the maxNFASize.
        if (vertex.edges.isEmpty() && nfa.graphSize() > maxNFASize)
            nfaTooBig = true;
        
        if (edgeIndex < vertex.edges.size()) {
            auto& edge = vertex.edges[edgeIndex];
            
            // Clean up any processed leaves and return early if we are past the maxNFASize.
            if (nfaTooBig) {
                stack.last().edgeIndex = stack.last().vertex.edges.size();
                continue;
            }
            
            // Quantified edges in the subtree will be a part of another NFA.
            if (!edge.term.hasFixedLength()) {
                stack.last().edgeIndex++;
                continue;
            }
            
            unsigned subtreeRootId = edge.term.generateGraph(nfa, stack.last().nfaNodeId, edge.child->finalActions);
            ASSERT(edge.child.get());
            stack.append(ActiveSubtree(*edge.child.get(), subtreeRootId, 0));
        } else {
            ASSERT(edgeIndex == vertex.edges.size());
            vertex.edges.removeAllMatching([](PrefixTreeEdge& edge)
            {
                return edge.term.isDeletedValue();
            });
            stack.removeLast();
            if (!stack.isEmpty()) {
                auto& activeSubtree = stack.last();
                auto& edge = activeSubtree.vertex.edges[stack.last().edgeIndex];
                if (edge.child->edges.isEmpty())
                    edge.term = Term(Term::DeletedValue); // Mark this leaf for deleting.
                activeSubtree.edgeIndex++;
            }
        }
    }
}
开发者ID:mu326668629,项目名称:webkit,代码行数:65,代码来源:CombinedURLFilters.cpp


注:本文中的NFA::graphSize方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。