hyperscan预备知识

hyperscan是一个开源项目, 但其代码量很大而且比较复杂, 以下是其src子目录下的代码量统计:

-----------------------------------------------------------------
Language       files          blank        comment           code
-----------------------------------------------------------------
C++              181          13659          11401          69002
C/C++ Header     335           7300          16587          37854
C                 51           3489           2778          17526
-----------------------------------------------------------------
SUM:             567          24448          30766         124382
-----------------------------------------------------------------

要看懂这10几万行代码, 首先要掌握一些预备知识.

C++ 11

hyperscan主要代码使用C++写成, 并使用了大量C++11特性, 因此要分析代码必须对C++和C++11特性 较为熟悉.

右值引用与移动赋值

/** \brief Class that makes derived classes non-copyable.  */
struct noncopyable {
    noncopyable() = default;
    noncopyable(const noncopyable &) = delete;
    noncopyable(noncopyable &&) = default;
    noncopyable &operator=(const noncopyable &) = delete;
    noncopyable &operator=(noncopyable &&) = default;
};

智能指针

unique_ptr, make_unique

委托构造

explicit NGHolder(nfa_kind kind);
NGHolder(void) : NGHolder(NFA_OUTFIX) {};

其他

  • 熟练掌握C++模板类

    template<typename Graph,
       typename VertexPropertyType = graph_detail::default_vertex_property,
       typename EdgePropertyType = graph_detail::default_edge_property>
    class ue2_graph : graph_detail::graph_base {}
    
    class NGHolder : public ue2_graph<NGHolder, NFAGraphVertexProps,
              NFAGraphEdgeProps> {}
    

设计模式

VISITOR

BUILDER

数据结构

Graph

图数据结构, 及相关算法.

DAG(Directed Acyclic Graph: 有向无环图)

Intrusive List

侵入式容器介绍, boost中的侵入式数据结构.

boost::intrusive

Boost Library

Ragel

状态机生成器. https://www.colm.net/open-source/ragel/