acl  3.5.3.0
token_tree.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "noncopyable.hpp"
4 #include "string.hpp"
5 #include <list>
6 
7 struct ACL_TOKEN;
8 struct ACL_ITER;
9 
10 namespace acl {
11 
12 class token_tree;
13 
14 /**
15  * 256 叉匹配树中的节点对象,为纯私有类
16  */
18 {
19 public:
20  /**
21  * 获得该节点对应的键值
22  * @return {const char*}
23  */
24  const char* get_key(void) const;
25 
26  /**
27  * 获得该节点所绑定的对象地址
28  * @return {void*}
29  */
30  void* get_ctx(void) const;
31 
32  /**
33  * 获得该节点所属的匹配树对象
34  * @return {token_tree*}
35  */
36  token_tree* get_tree(void) const
37  {
38  return tree_;
39  }
40 
41  /**
42  * 获得 C 版本的节点对象
43  * @return {ACL_TOKEN*}
44  */
45  ACL_TOKEN* get_token(void) const
46  {
47  return me_;
48  }
49 
50 private:
51  friend class token_tree; // 仅允许 token_tree 构造/析构本类对象
52 
53  token_node(void);
54  ~token_node(void);
55 
56  void set_node(ACL_TOKEN* token, token_tree* tree);
57 
58 private:
59  ACL_TOKEN* me_;
60  token_tree* tree_;
61  string key_;
62  bool dirty_;
63 };
64 
65 /**
66  * 256 叉树最大匹配查找算法,该算法具有通用性及非常高的性能(比哈希性能还高),
67  * 通过将字符串映射到 256 叉树上进行匹配查找
68  */
70 {
71 public:
72  token_tree(void);
73  ~token_tree(void);
74 
75  /**
76  * 添加一个新的项
77  * @param key {const char*} 键值
78  * @param ctx {void*} 该 key 所绑定的对象,可以为空
79  * @return {bool} 添加是否成功,返回 false 表明相同 key 已存在
80  */
81  bool insert(const char* key, void* ctx = NULL);
82 
83  /**
84  * 从匹配树中删除指定的 key 项
85  * @param key {const char*} 键值
86  * @return {void*} 返回添加时绑定的对象地址
87  */
88  void* remove(const char* key);
89 
90  /**
91  * 根据键值精确查找匹配的节点
92  * @param key {const char*} 键值
93  * @return {const token_node*} 返回 NULL 表示未找到匹配项
94  */
95  const token_node* find(const char* key);
96 
97  /**
98  * 按字符串最大匹配模式从匹配中查找与所给文本字符串相匹配的节点,同时
99  * 移动文本字符串的指针位置
100  * @param text {const char**} 要匹配查找的文本字符串,在匹配过程中,该
101  * 地址指针会被移动至下一位置
102  * @param delimiters {const char*} 非 NULL 时指定的截止符字符串,即查
103  * 找过程中只要遇到的字符在该截止字符串中,则返回本次查找的结果
104  * @param delimiters_tab {const char*} 非 NULL 时指定的截止符字符数组,
105  * 即查找过程中只要遇到的字符在该截止字符数组中,则返回本次查找的结果,该数组
106  * 必须由 create_delimiters_tab 创建,由 free_delimiters_tab 释放
107  * @return {token_node*} 返回 NULL 表示本次查找未找到匹配项,通过检查
108  * *text 是否为 '\0' 表示是否匹配完毕目标文本字符串
109  * 注:当 delimiters 非空时优先使用 delimiters 做为截止符,否则再检查
110  * delimiters_tab 是否非空,如果非空则使用其做为截止符
111  */
112  const token_node* search(const char** text, const char* delimiters = NULL,
113  const char* delimiters_tab = NULL);
114 
115  /**
116  * 创建截止符数组
117  * @param delimiters {const char*} 截止符字符串
118  * @return {char*} 根据截止符字符串创建的截止符数组
119  */
120  static char* create_delimiters_tab(const char* delimiters);
121 
122  /**
123  * 释放由 create_delimiters_tab 创建的截止符数组
124  * @param delimiters_tab {char*}
125  */
126  static void free_delimiters_tab(char* delimiters_tab);
127 
128  /**
129  * 遍历 256 匹配树时需先调用本方法获得第一个节点对象
130  * @return {token_node*}
131  */
132  const token_node* first_node(void);
133 
134  /**
135  * 遍历 256 匹配树时需先调用本方法获得下一个节点对象
136  * @return {token_node*}
137  */
138  const token_node* next_node(void);
139 
140  /**
141  * 获得 C 版本的 256 叉树对象
142  * @return {ACL_TOKEN*}
143  */
144  ACL_TOKEN* get_tree(void) const
145  {
146  return tree_;
147  }
148 
149 private:
150  ACL_TOKEN* tree_;
151  ACL_ITER* iter_;
152  token_node node_;
153 };
154 
155 } // namespace acl
ACL_TOKEN * get_tree(void) const
Definition: token_tree.hpp:144
ACL_TOKEN * get_token(void) const
Definition: token_tree.hpp:45
#define ACL_CPP_API
token_tree * get_tree(void) const
Definition: token_tree.hpp:36