XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
键值对容器
键值对容器 的协作图:

结构体

struct  xwlib_map_container
 键值对容器 更多...
 
struct  xwlib_map
 键值对集合 更多...
 

宏定义

#define xwlib_map_itr_forward(map, c)
 向前遍历(从小到大)键值对容器
 
#define xwlib_map_itr_backward(map, c)
 向后遍历(从大到小)键值对容器
 
#define xwlib_map_itr_forward_safe(map, c, n)
 向前遍历(从小到大)键值对容器,并防止因遍历到的容器被删除而造成的错误
 
#define xwlib_map_itr_backward_safe(map, c, n)
 向后遍历(从大到小)键值对容器,并防止因遍历到的容器被删除而造成的错误
 

类型定义

typedef xwssq_t(* xwlib_map_cmp_f) (void *, void *)
 键比较函数类型
 

函数

static void xwlib_map_init (struct xwlib_map *map, xwlib_map_cmp_f cmp)
 初始化键值对容器的map
 
static void xwlib_map_init_container (struct xwlib_map_container *mc, void *key, void *value)
 初始化键值对容器
 
xwer_t xwlib_map_insert (struct xwlib_map *map, struct xwlib_map_container *newmc)
 插入键值对容器
 
xwer_t xwlib_map_erase (struct xwlib_map *map, struct xwlib_map_container *mc)
 删除键值对容器
 
xwer_t xwlib_map_find (struct xwlib_map *map, void *key, struct xwlib_map_container **mcbuf)
 根据 键值 查找容器
 

详细描述

概述

map是按从 排列的键值对容器的集合。在map中, 是唯一的。

宏定义说明

◆ xwlib_map_itr_backward

#define xwlib_map_itr_backward (   map,
 
)
值:
&(map)->bclh, \
struct xwlib_map_container, bcln)
#define xwlib_bclst_itr_next_entry(p, head, type, member)
向前遍历(iterate over)整个链表,并将节点指针转化为包含它们的外层结构体指针。
Definition bclst.h:143
键值对容器
Definition map.h:32

向后遍历(从大到小)键值对容器

参数
[in]mapmap指针
[in]c光标指针,指向当前遍历到的键值对容器

在文件 map.h97 行定义.

◆ xwlib_map_itr_backward_safe

#define xwlib_map_itr_backward_safe (   map,
  c,
 
)
值:
&(map)->bclh, \
struct xwlib_map_container, bcln)
#define xwlib_bclst_itr_prev_entry_safe(p, n, head, type, member)
向后遍历(iterate over)整个链表,并防止因遍历到的节点被删除而造成的错误。 同时将节点指针转化为包含它们的外层结构体指针。
Definition bclst.h:202

向后遍历(从大到小)键值对容器,并防止因遍历到的容器被删除而造成的错误

参数
[in]mapmap指针
[in]c光标指针,指向当前遍历到的键值对容器
[in]n键值对容器的指针,用于宏内部暂存数据

在文件 map.h119 行定义.

◆ xwlib_map_itr_forward

#define xwlib_map_itr_forward (   map,
 
)
值:
&(map)->bclh, \
struct xwlib_map_container, bcln)

向前遍历(从小到大)键值对容器

参数
[in]mapmap指针
[in]c光标指针,指向当前遍历到的键值对容器

在文件 map.h87 行定义.

◆ xwlib_map_itr_forward_safe

#define xwlib_map_itr_forward_safe (   map,
  c,
 
)
值:
&(map)->bclh, \
struct xwlib_map_container, bcln)
#define xwlib_bclst_itr_next_entry_safe(p, n, head, type, member)
向前遍历(iterate over)整个链表,并防止因遍历到的节点被删除而造成的错误。 同时将节点指针转化为包含它们的外层结构体指针。
Definition bclst.h:170

向前遍历(从小到大)键值对容器,并防止因遍历到的容器被删除而造成的错误

参数
[in]mapmap指针
[in]c光标指针,指向当前遍历到的键值对容器
[in]n键值对容器的指针,用于宏内部暂存数据

在文件 map.h108 行定义.

类型定义说明

◆ xwlib_map_cmp_f

typedef xwssq_t(* xwlib_map_cmp_f) (void *, void *)

键比较函数类型

在文件 map.h42 行定义.

函数说明

◆ xwlib_map_erase()

xwer_t xwlib_map_erase ( struct xwlib_map map,
struct xwlib_map_container mc 
)

删除键值对容器

参数
[in]mapmap的指针
[in]mc待删除的键值对容器的指针
返回
错误码
返回值
XWOK没有错误
-ESRCH此键值对容器不在键值对集合中

<No error

在文件 map.c70 行定义.

71{
72 xwer_t rc;
73
75 rc = -ESRCH;
76 } else {
77 xwlib_rbtree_remove(&map->rbtree, &mc->rbn);
80 rc = XWOK;
81 }
82 return rc;
83}
static void xwlib_bclst_del_init(struct xwlib_bclst_node *node)
删除一个节点,并重新初始化它
Definition bclst.h:391
#define ESRCH
No such process
Definition errno.h:33
#define XWOK
No error
Definition errno.h:182
static bool xwlib_rbtree_tst_node_unlinked(struct xwlib_rbtree_node *n)
测试红黑树节点是否已经链接到红黑树中
Definition rbtree.h:449
static void xwlib_rbtree_init_node(struct xwlib_rbtree_node *rbn)
初始化红黑树节点
Definition rbtree.h:114
void xwlib_rbtree_remove(struct xwlib_rbtree *tree, struct xwlib_rbtree_node *node)
删除一个节点,并修正红黑树的颜色
Definition rbtree.c:320
signed long xwer_t
Definition type.h:554
struct xwlib_bclst_node bcln
Definition map.h:34
struct xwlib_rbtree_node rbn
Definition map.h:33
struct xwlib_rbtree rbtree
Definition map.h:48
函数调用图:

◆ xwlib_map_find()

xwer_t xwlib_map_find ( struct xwlib_map map,
void *  key,
struct xwlib_map_container **  mcbuf 
)

根据 键值 查找容器

参数
[in]mapmap的指针
[in]key键值对容器的指针
[out]mcbuf指向指针缓存的指针,此指针缓存用于返回查找到的键值对容器的指针
返回
错误码
返回值
XWOK没有错误
-ESRCH目标不存在

<No error

在文件 map.c86 行定义.

88{
89 struct xwlib_rbtree_node * rbn;
90 struct xwlib_map_container * mc;
91 xwssq_t cmprc;
92 xwer_t rc;
93
94 rbn = map->rbtree.root;
95 while (NULL != rbn) {
97 cmprc = map->cmp(key, mc->key);
98 if (cmprc < 0) {
99 rbn = rbn->left;
100 } else if (cmprc > 0) {
101 rbn = rbn->right;
102 } else {
103 break;
104 }
105 }
106 if (NULL != rbn) {
108 rc = XWOK;
109 } else {
110 *mcbuf = NULL;
111 rc = -ESRCH;
112 }
113 return rc;
114}
#define xwlib_rbtree_entry(ptr, type, member)
从红黑树节点指针值计算出包含该节点成员的外层结构体的指针值
Definition rbtree.h:236
#define NULL
Definition type.h:28
signed long xwssq_t
Definition type.h:461
xwlib_map_cmp_f cmp
Definition map.h:50
红黑树节点
Definition rbtree.h:81
struct xwlib_rbtree_node * left
Definition rbtree.h:82
struct xwlib_rbtree_node * right
Definition rbtree.h:83
struct xwlib_rbtree_node * root
Definition rbtree.h:96

◆ xwlib_map_init()

static void xwlib_map_init ( struct xwlib_map map,
xwlib_map_cmp_f  cmp 
)
inlinestatic

初始化键值对容器的map

参数
[in]mapmap指针
[in]cmp比较键大小的函数指针

在文件 map.h59 行定义.

60{
63 map->cmp = cmp;
64}
static void xwlib_bclst_init_head(struct xwlib_bclst_node *h)
初始化一个链表头。
Definition bclst.h:229
static void xwlib_rbtree_init(struct xwlib_rbtree *rbt)
初始化红黑树
Definition rbtree.h:104
struct xwlib_bclst_node bclh
Definition map.h:49
函数调用图:

◆ xwlib_map_init_container()

static void xwlib_map_init_container ( struct xwlib_map_container mc,
void *  key,
void *  value 
)
inlinestatic

初始化键值对容器

参数
[in]mc键值对容器的指针
[in]key
[in]value

在文件 map.h73 行定义.

75{
78 mc->key = key;
79 mc->value = value;
80}
static void xwlib_bclst_init_node(struct xwlib_bclst_node *n)
初始化一个链表节点。
Definition bclst.h:240
void * value
Definition map.h:36
函数调用图:

◆ xwlib_map_insert()

xwer_t xwlib_map_insert ( struct xwlib_map map,
struct xwlib_map_container newmc 
)

插入键值对容器

参数
[in]mapmap的指针
[in]newmc待插入的键值对容器的指针
返回
错误码
返回值
XWOK没有错误
-EEXIST键值对已经存在

<No error

在文件 map.c17 行定义.

18{
19 struct xwlib_rbtree_node ** pos;
20 struct xwlib_rbtree_node * rbn;
21 struct xwlib_map_container * mc;
22 struct xwlib_map_container * parent;
23 xwptr_t lpc;
24 xwssq_t cmprc;
25 xwer_t rc;
26
27 pos = &map->rbtree.root;
28 lpc = (xwptr_t)pos;
29 rbn = *pos;
30 while (NULL != rbn) {
32 cmprc = map->cmp(newmc->key, mc->key);
33 if (cmprc < 0) {
34 pos = &rbn->left;
35 lpc = (xwptr_t)pos;
36 rbn = rbn->left;
37 } else if (cmprc > 0) {
38 pos = &rbn->right;
40 rbn = rbn->right;
41 } else {
42 lpc = (xwptr_t)0;
43 break;
44 }
45 }
46 if ((xwptr_t)0 != lpc) {
49 xwlib_bclst_add_head(&map->bclh, &newmc->bcln);
50 } else {
53 rbn);
54 if (xwlib_rbtree_tst_left(lpc)) {
55 xwlib_bclst_add_front(&newmc->bcln, &parent->bcln);
56 } else {
57 xwlib_bclst_add_behind(&newmc->bcln, &parent->bcln);
58 }
59 }
60 xwlib_rbtree_link(&newmc->rbn, lpc);
61 xwlib_rbtree_insert_color(&map->rbtree, &newmc->rbn);
62 rc = XWOK;
63 } else {
64 rc = -EEXIST;
65 }
66 return rc;
67}
static void xwlib_bclst_add_front(struct xwlib_bclst_node *newn, struct xwlib_bclst_node *next)
将一个节点加入到另一个节点的前面
Definition bclst.h:320
static void xwlib_bclst_add_head(struct xwlib_bclst_node *head, struct xwlib_bclst_node *newn)
将一个节点加入链表头部(链表头的后面)
Definition bclst.h:345
static void xwlib_bclst_add_behind(struct xwlib_bclst_node *newn, struct xwlib_bclst_node *prev)
将一个节点加入到另一个节点的后面
Definition bclst.h:333
#define EEXIST
File exists
Definition errno.h:47
#define xwlib_rbtree_tst_left(lpc)
测试当前lpc中的位置信息是否为左侧
Definition rbtree.h:159
static bool xwlib_rbtree_tst_link_root(struct xwlib_rbtree *rbt, struct xwlib_rbtree_node **link)
测试是否连接到根节点(是否为根节点的子节点)
Definition rbtree.h:308
#define xwlib_rbtree_get_link(lpc)
获取lpc信息中的link指针
Definition rbtree.h:126
void xwlib_rbtree_insert_color(struct xwlib_rbtree *tree, struct xwlib_rbtree_node *node)
插入一个红色节点后修正红黑树的颜色
Definition rbtree.c:17
static struct xwlib_rbtree_node * xwlib_rbtree_get_parent_from_lpc(xwptr_t lpc)
从lpc信息返回父节点指针
Definition rbtree.h:271
static void xwlib_rbtree_link(struct xwlib_rbtree_node *node, xwptr_t lpc)
链接节点,并设置位置及颜色信息
Definition rbtree.h:350
@ XWLIB_RBTREE_POS_RIGHT
Definition rbtree.h:67
unsigned long xwptr_t
Definition type.h:375
xwptr_t pos
Definition rbtree.h:86
函数调用图: