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
*/
17
class
ACL_CPP_API
token_node
:
public
noncopyable
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
*/
69
class
ACL_CPP_API
token_tree
:
public
noncopyable
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_tree::get_tree
ACL_TOKEN * get_tree(void) const
Definition:
token_tree.hpp:144
acl::token_node::get_token
ACL_TOKEN * get_token(void) const
Definition:
token_tree.hpp:45
string.hpp
ACL_TOKEN
Definition:
acl_token_tree.h:31
acl::token_tree
Definition:
token_tree.hpp:69
acl
Definition:
acl_cpp_init.hpp:4
acl::noncopyable
Definition:
noncopyable.hpp:6
noncopyable.hpp
ACL_ITER
Definition:
acl_iterator.h:9
acl::token_node
Definition:
token_tree.hpp:17
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
acl::token_node::get_tree
token_tree * get_tree(void) const
Definition:
token_tree.hpp:36
include
acl_cpp
stdlib
token_tree.hpp
生成于 2021年 九月 10日 星期五 11:14:44 , 为 acl使用
1.8.15