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> {}