模块契约Map 与 IntMap

删除与所有权

API调用释放器返回值字节
xrtIntMapRemove是否
xrtIntMapTake否是
xrtIntMapTakePtr否是

Take 的输出缓冲必须至少有初始化时指定的值大小。键不存在时返回 false,不修改通用值输出。TakePtr 在失败时会将指针输出清空。

错误与边界

  • 空映射指针、零值大小、非 2 的幂对齐、空必需输出会报告 XERR_ARGUMENT。
  • 条目布局加法溢出会报告 XERR_RANGE。
  • 池页分配失败会报告 XERR_MEMORY,映射保持不变。
  • 释放器中的 API 重入,以及访问器中的结构或生命周期修改,会报告 XERR_STATE。
  • 不存在的键是正常结果,不会设置错误。
  • 重复键 GetOrAdd 不分配。
  • Count 使用 size_t,不保留旧版 32 位计数上限。

IntMap

IntMap 是以 int64 为键、按键有序、值大小固定的稀疏映射。它继承旧版 List 已经验证的整数键体系,但使用准确的容器名称,并复用新版拥有式 AVL 树和固定对象池。

启用与依赖

功能宏:

int_map 依赖 avl_tree,因此完整依赖链为:

公共头文件会拒绝缺失 XRT_FEATURE_AVL_TREE 的非法裁剪组合。

存储模型

每个条目只占用一个固定池槽:

  • 键支持 INT64_MIN 到 INT64_MAX。
  • 键可以为负数、跳号或极度稀疏,没有最大索引造成的连续空间浪费。
  • 值直接内联在树节点中,没有逐值堆分配。
  • 值地址在该键被删除、Clear 或 Unit 前保持稳定。
  • 遍历顺序是整数键升序或降序,不是插入顺序。
  • 查找、插入和删除的复杂度是 O(log n)。

IntMap 不内置线程归属、锁或 shared 模式。这个基础容器的同一实例不能被多线程并发修改;需要共享时,由调用方或后续同步容器层选择互斥锁、读写锁或任务归属模型。

tests/containers/test_container_external_sync.c 覆盖 IntMap 在外部 Mutex 下的多线程写入、最终键数和组合生命周期。

生命周期

API语义
xrtIntMapInit以默认对齐初始化自维护结构
xrtIntMapInitAligned以显式值对齐初始化
xrtIntMapCreate堆创建默认对齐映射
xrtIntMapCreateAligned堆创建显式对齐映射
xrtIntMapSetDrop为空映射设置释放器和用户数据
xrtIntMapClear释放全部值,保留池页复用
xrtIntMapTrim释放空闲池页,可保留指定数量
xrtIntMapUnit释放值和池页,不释放结构
xrtIntMapDestroy释放值、池页和堆结构
xrtIntMapCount返回当前键值数量

SetDrop 只能在映射为空时调用,避免已有值的所有权合同在中途改变。

指针值便利接口

当映射以 sizeof(ptr) 初始化时,可使用:

SetPtr 用相同指针替换已有值时为无操作,不会调用释放器。在非 sizeof(ptr) 值映射上调用这些函数会报告 XERR_STATE。

有序查询

API结果
xrtIntMapFirst最小键
xrtIntMapLast最大键
xrtIntMapLowerBound第一个 actual_key >= key 的条目
xrtIntMapUpperBound第一个 actual_key > key 的条目

这些函数可选返回实际键。没有结果时返回空指针,并将键输出设为零。

完整范例

可编译范例位于 examples/containers/int_map/main.c。范例演示稀疏会话 ID、零初始化值槽和升序迭代。

与旧版 List 的取舍

保留:

  • int64 全范围稀疏键。
  • AVL 有序查找和升序遍历。
  • 固定大小内联值槽。
  • 指针值友好路径。
  • 旧版百万级插入和千万级查找所覆盖的平衡树与池复用路径。

改进:

  • 使用 IntMap 准确表达“整数到值”,不再占用惯例上的 List 名称。
  • 外置迭代器支持多个并行迭代状态,不把状态藏在容器内。
  • 增加降序遍历、上下界查询、只读查询、释放回调、Take 所有权移交、显式对齐和池页裁剪。
  • 去掉容器内部 owner/shared 分支和锁对象,使基础容器的成本、依赖和线程合同更清晰。

旧版的百万插入和千万查找不放入每次单元回归,它们作为性能基准资产保留;日常回归使用更快的稳定地址、OOM、顺序和所有权边界测试。

XRT_INT_MAP_ALIGNMENT_DEFAULT常量

默认值对齐,当前为 16 字节。

xintmap类型

可以放在栈上、嵌入其他对象,或由 xrtIntMapCreate 在堆上创建。初始化后不应按字节复制或移动结构,因为内部 AVL 适配器保存了对映射结构的引用。

xintmapiter类型

零堆分配的外置迭代器。同一映射可同时存在多个读迭代器。

xintmapdrop类型

回调只释放值内部拥有的资源,不释放 value 值槽本身。它在以下路径调用:

  • Set 替换已有值。
  • Remove 删除值。
  • Clear、Unit 和 Destroy 清理剩余值。

Take 和 TakePtr 是所有权移交路径,不调用释放器。释放回调执行期间, 同一映射的全部 API 都会以 XERR_STATE 拒绝;回调只应处理当前值内部的资源。

typedef void(*xintmapdrop)(int64 iKey, ptr pValue, ptr pUserData)

xintmapinit类型

该回调用于 xrtIntMapGetOrInit 原位建立一个缺失键的值。回调失败时必须自行释放 已经取得的部分资源并设置错误;映射不会提交该条目,也不会再调用释放器。回调成功后, 如果底层提交因内部状态失败,映射会用已经配置的 xintmapdrop 回滚完整值。

typedef bool(*xintmapinit)(int64 iKey, ptr pValue, ptr pUserData)

xintmapvisitor类型

返回 true 继续遍历,返回 false 停止。回调可以查询同一映射并直接修改当前值槽, 但不得插入、替换、删除、清空、裁剪、释放映射或嵌套调用 Visit。

typedef bool(*xintmapvisitor)(int64 iKey, ptr pValue, ptr pUserData)

xmap类型

字节键映射使用哈希桶查找,并以独立条目保持键和值地址稳定。

字段类型语义
Bucketsxmapentry**桶数组
Firstxmapentry*首元素
Lastxmapentry*末元素
ValueSizesize_tValueSize
ValueOffsetsize_tValueOffset
KeyOffsetsize_tKeyOffset
Alignmentsize_t对齐(二次幂)
Countsize_t数量
BucketCountsize_t桶数量
Thresholdsize_t阈值
Versionuint64结构版本
HashxmaphashHash
EqualxmapequalEqual
DropxmapdropDrop
KeyUserDataptrKeyUserData
DropUserDataptrDropUserData
Flagsuint32标志位
typedef struct xmap { xmapentry** Buckets; xmapentry* First; xmapentry* Last; size_t ValueSize; size_t ValueOffset; size_t KeyOffset; size_t Alignment; size_t Count; size_t BucketCount; size_t Threshold; uint64 Version; xmaphash Hash; xmapequal Equal; xmapdrop Drop; ptr KeyUserData; ptr DropUserData; uint32 Flags; } xmap;

xmapiter类型

外置迭代器允许同一映射存在多个独立遍历状态。

字段类型语义
Mapxmap*Map
Nextxmapentry*后继
Versionuint64结构版本
DirectionintDirection
typedef struct xmapiter { xmap* Map; xmapentry* Next; uint64 Version; int Direction; } xmapiter;

xmapentry类型

Map 内部条目结构(不透明,仅实现内部使用)。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xmapentry xmapentry;

xmaphash类型

键哈希器必须保证相等键产生相同哈希值,且不得重入当前映射。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef uint64(*xmaphash)(xbytesview Key, ptr pUserData)

xmapequal类型

键相等器只比较键内容,不取得所有权,也不得重入当前映射。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xmapequal)(xbytesview Left, xbytesview Right, ptr pUserData)

xmapdrop类型

映射释放器处理值内部的拥有资源,不释放值槽、键或重入当前映射。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xmapdrop)(xbytesview Key, ptr pValue, ptr pUserData)

xmapinit类型

新值初始化器失败时自行清理部分状态并设置错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xmapinit)(xbytesview Key, ptr pValue, ptr pUserData)

xmapvisitor类型

访问器返回 false 时停止遍历;回调内允许查询,不允许结构修改。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xmapvisitor)(xbytesview Key, ptr pValue, ptr pUserData)
字节键 Map

xrtMapInit函数

使用默认 16 字节值对齐初始化空字节键映射。

bool xrtMapInit(xmap* pMap, size_t iValueSize)

参数

参数方向约束说明
pMap输出非空接收空映射
iValueSize输入> 0每值字节数
返回值
返回含义失败时状态
true已就绪—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map · 生命周期 · 观察

	if ( !xrtMapInit(&tRoutes, sizeof(routestat)) ) {

xrtMapInitAligned函数

使用显式值对齐初始化空字节键映射。

bool xrtMapInitAligned(xmap* pMap, size_t iValueSize, size_t iAlignment)

参数

参数方向约束说明
pMap输出非空接收空映射
iValueSize输入> 0每值字节数
iAlignment输入非零二次幂值对齐
返回值
返回含义失败时状态
true已就绪—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 生命周期 · 观察

		if ( !xrtMapInitAligned(&Aligned, sizeof(uint64), 64u) ) {

xrtMapCreate函数

创建使用默认 16 字节值对齐的空字节键映射。

xmap* xrtMapCreate(size_t iValueSize)

参数

参数方向约束说明
iValueSize输入> 0每值字节数
返回值
返回含义失败时状态
非空堆映射;Destroy 释放—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 生命周期 · 观察

	xmap* pMap = xrtMapCreate(sizeof(ptr));

xrtMapCreateAligned函数

创建使用显式值对齐的空字节键映射。

xmap* xrtMapCreateAligned(size_t iValueSize, size_t iAlignment)

参数

参数方向约束说明
iValueSize输入> 0每值字节数
iAlignment输入非零二次幂值对齐
返回值
返回含义失败时状态
非空堆映射—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 生命周期 · 观察

		xmap* pAlignedHeap = xrtMapCreateAligned(sizeof(uint64), 64u);

xrtMapSetKeyPolicy函数

为仍为空的映射设置成对的自定义哈希器和相等器;两个空指针恢复默认策略。

bool xrtMapSetKeyPolicy(xmap* pMap, xmaphash pHash, xmapequal pEqual, ptr pUserData)

参数

参数方向约束说明
pMap输入/输出非空、空映射目标映射
pHash输入允许空(成对)哈希器
pEqual输入允许空(成对)相等器
pUserData输入任意值原样传给二者
返回值
返回含义失败时状态
true策略已安装—
false映射非空或参数非法—
错误
  • XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 生命周期 · 观察

		if ( !xrtMapSetKeyPolicy(&Aligned, NULL, NULL, NULL) ) {

xrtMapSetDrop函数

为仍为空的映射设置值资源释放器和独立用户数据。

bool xrtMapSetDrop(xmap* pMap, xmapdrop pDrop, ptr pUserData)

参数

参数方向约束说明
pMap输入/输出非空、空映射目标映射
pDrop输入非空值释放器
pUserData输入任意值原样传给释放器
返回值
返回含义失败时状态
true释放器已安装—
false映射非空—
错误
  • XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改

范例已编译验证

containers/map_tour · 生命周期 · 观察

		, xrtMapSetDrop(&Aligned, NULL, NULL) ? 1 : 0);

xrtMapUnit函数

释放全部键值和桶数组,但不释放映射结构(内嵌形态收尾)。

void xrtMapUnit(xmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无调用全部值释放器后释放—
错误
  • 无 — 释放不失败

范例已编译验证

containers/map · 生命周期 · 观察

		xrtMapUnit(&tRoutes);

xrtMapDestroy函数

释放全部键值、桶数组和映射结构。

void xrtMapDestroy(xmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无全部资源已释放—
错误
  • 无 — 释放不失败

范例已编译验证

containers/map_tour · 生命周期 · 观察

			xrtMapDestroy(pMap);

xrtMapClear函数

清空全部键值并保留桶数组供复用。

void xrtMapClear(xmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无Count 归零;容量保留—
错误
  • 无 — 清空不失败

范例已编译验证

containers/map_tour · 编辑 · 观察

	xrtMapClear(pMap);

xrtMapReserve函数

确保映射无需扩容即可容纳指定数量的键。

bool xrtMapReserve(xmap* pMap, size_t iCapacity)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iCapacity输入—最低容量
返回值
返回含义失败时状态
true容量已保证—
false参数或 OOM映射不变
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 编辑 · 观察

		(void)xrtMapReserve(pMap, 8u);

xrtMapTrim函数

把桶数组收缩到当前键数所需的最小容量。

bool xrtMapTrim(xmap* pMap)

参数

参数方向约束说明
pMap输入/输出非空目标映射
返回值
返回含义失败时状态
true已收缩—
false参数或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 编辑 · 观察

	(void)xrtMapTrim(pMap);

xrtMapCount函数

返回当前键值数量,非法映射返回零。

size_t xrtMapCount(const xmap* pMap)

参数

参数方向约束说明
pMap输入允许空目标映射
返回值
返回含义失败时状态
>= 0键值数—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 查询 · 观察

	printf("count=%zu cap>=%zu ", xrtMapCount(pMap), xrtMapCapacity(pMap));

xrtMapCapacity函数

返回当前桶数组在再次扩容前可容纳的键数。

size_t xrtMapCapacity(const xmap* pMap)

参数

参数方向约束说明
pMap输入允许空目标映射
返回值
返回含义失败时状态
>= 0容量—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 查询 · 观察

	printf("count=%zu cap>=%zu ", xrtMapCount(pMap), xrtMapCapacity(pMap));

xrtMapGetOrAdd函数

返回已有值槽,或复制键并原地创建、清零一个新值槽。

ptr xrtMapGetOrAdd(xmap* pMap, xbytesview Key, bool* pNew)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用字节键(成功后内部持副本)
pNew输出可空是否新插入
返回值
返回含义失败时状态
非空值槽(新槽已清零)—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map · 编辑 · 观察

	pStat = (routestat*)xrtMapGetOrAdd(&tRoutes, XRT_BYTES_LITERAL("/health"), &bNew);

xrtMapGetOrInit函数

返回已有值槽,或失败原子地复制键并原位初始化新值。

ptr xrtMapGetOrInit(xmap* pMap, xbytesview Key, xmapinit pInit, ptr pUserData, bool* pNew)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用字节键
pInit输入非空原位初始化回调
pUserData输入任意值传给回调
pNew输出可空是否新插入
返回值
返回含义失败时状态
非空值槽—
NULL回调失败(原子回滚)或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败
  • 回调失败 — 回滚新条目,映射不变

范例已编译验证

containers/map_tour · 编辑 · 观察

		pSlot = xrtMapGetOrInit(pMap, SV("c"), initSlot, NULL, &bNew);

xrtMapSet函数

复制插入或替换值;来源不得触及映射元数据或目标条目。

bool xrtMapSet(xmap* pMap, xbytesview Key, const void* pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用字节键
pValue输入借用、独立值来源
返回值
返回含义失败时状态
true已插入/替换(旧值先过释放器)—
false参数或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 编辑 · 观察

		if ( !xrtMapSet(pMap, SV("a"), &iZero) ) {

xrtMapGet函数

返回指定键的可写值槽,未找到是正常结果。

ptr xrtMapGet(xmap* pMap, xbytesview Key)

参数

参数方向约束说明
pMap输入非空目标映射
Key输入借用字节键
返回值
返回含义失败时状态
非空可写值槽—
NULL未找到(正常结果)不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 查询 · 观察

		, xrtMapGet(pMap, SV("b")) != NULL ? 1 : 0);

xrtMapConstGet函数

返回指定键的只读值槽,未找到是正常结果。

const void* xrtMapConstGet(const xmap* pMap, xbytesview Key)

参数

参数方向约束说明
pMap输入非空目标映射
Key输入借用字节键
返回值
返回含义失败时状态
非空只读值槽—
NULL未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 查询 · 观察

		xrtMapConstGet(pMap, SV("b")) != NULL ? 1 : 0);

xrtMapHas函数

判断指定字节键是否存在。

bool xrtMapHas(const xmap* pMap, xbytesview Key)

参数

参数方向约束说明
pMap输入非空目标映射
Key输入借用字节键
返回值
返回含义失败时状态
true存在—
false不存在不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 查询 · 观察

			xrtMapHas(pMap, SV("a")) ? 1 : 0);

xrtMapStoredKey函数

返回与查询键等价的内部键副本,缺失时清空输出。

bool xrtMapStoredKey(const xmap* pMap, xbytesview Key, xbytesview* pStoredKey)

参数

参数方向约束说明
pMap输入非空目标映射
Key输入借用查询键
pStoredKey输出非空接收内部键视图
返回值
返回含义失败时状态
true视图已发布(存活到键被删除)—
false未找到*pStoredKey 清空
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 查询 · 观察

	if ( xrtMapStoredKey(pMap, SV("a"), &Key) ) {

xrtMapRemove函数

删除指定键并调用值释放器。

bool xrtMapRemove(xmap* pMap, xbytesview Key)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用要删除的键
返回值
返回含义失败时状态
true已删除—
false未找到(正常结果)不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 编辑 · 观察

		, xrtMapRemove(pMap, SV("c")) ? 1 : 0);

xrtMapTake函数

将值移交给映射外缓冲后删除;输出不得触及映射拥有的内存。

bool xrtMapTake(xmap* pMap, xbytesview Key, ptr pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用键
pValue输出非空、独立接收值字节
返回值
返回含义失败时状态
true值已移交且条目已删除(不调释放器)—
false未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 编辑 · 观察

			(void)xrtMapTake(&Aligned, SV("k"), &iValue);

xrtMapSetPtr函数

对 sizeof(ptr) 值映射执行指针类型友好的插入或替换。

bool xrtMapSetPtr(xmap* pMap, xbytesview Key, ptr pValue)

参数

参数方向约束说明
pMap输入/输出非空值大小为 sizeof(ptr) 的映射
Key输入借用字节键
pValue输入—指针值
返回值
返回含义失败时状态
true已插入/替换—
false参数或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/map_tour · 编辑 · 观察

	(void)xrtMapSetPtr(pMap, SV("a"), (ptr)0x10u);

xrtMapGetPtr函数

返回 sizeof(ptr) 值映射中保存的指针;空值与缺失键用 Has 区分。

ptr xrtMapGetPtr(xmap* pMap, xbytesview Key)

参数

参数方向约束说明
pMap输入非空目标映射
Key输入借用字节键
返回值
返回含义失败时状态
非空或空保存的指针(可为 NULL 值)—
区分缺失用 xrtMapHas不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 查询 · 观察

		xrtMapGetPtr(pMap, SV("a")) == (ptr)0x10u ? "0x10" : "?");

xrtMapTakePtr函数

从 sizeof(ptr) 值映射中移交指针,不调用值释放器。

bool xrtMapTakePtr(xmap* pMap, xbytesview Key, ptr* pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
Key输入借用键
pValue输出非空、独立接收指针
返回值
返回含义失败时状态
true指针已移交且条目已删除—
false未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/map_tour · 编辑 · 观察

		bool bTook = xrtMapTakePtr(pMap, SV("a"), &pTaken);

xrtMapVisit函数

按插入顺序访问键值,并返回实际访问数量。

size_t xrtMapVisit(xmap* pMap, xmapvisitor pVisitor, ptr pUserData)

参数

参数方向约束说明
pMap输入非空目标映射
pVisitor输入非空访问器
pUserData输入任意值传给访问器
返回值
返回含义失败时状态
>= 0实际访问数(提前停止时小于总数)—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 迭代 · 观察

	(void)xrtMapVisit(pMap, visitPair, &iVisited);

xrtMapIterBegin函数

启动按插入顺序的外置迭代器。

bool xrtMapIterBegin(xmap* pMap, xmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射(空映射可启动)
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map · 迭代 · 观察

	if ( !xrtMapIterBegin(&tRoutes, &tIterator) ) {

xrtMapIterRBegin函数

启动按插入顺序逆序遍历的外置迭代器。

bool xrtMapIterRBegin(xmap* pMap, xmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/map_tour · 迭代 · 观察

	(void)xrtMapIterRBegin(pMap, &Iter);

xrtMapIterNext函数

返回下一值槽并可选返回内部键视图;结构修改后报告状态错误。

ptr xrtMapIterNext(xmapiter* pIterator, xbytesview* pKey)

参数

参数方向约束说明
pIterator输入/输出非空、活动迭代器
pKey输出可空接收内部键视图
返回值
返回含义失败时状态
非空下一值槽—
NULL自然耗尽(不设错)或结构被修改结构修改时 XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_STATE — 迭代期间结构被修改

范例已编译验证

containers/map · 迭代 · 观察

	while ( (pStat = (routestat*)xrtMapIterNext(&tIterator, &Path)) != NULL ) {

xrtMapIterEnd函数

提前结束迭代并清除借用状态。

void xrtMapIterEnd(xmapiter* pIterator)

参数

参数方向约束说明
pIterator输入允许空空 = 空操作
返回值
返回含义失败时状态
无纯清理—
错误
  • 无 — 清理不失败

范例已编译验证

containers/map · 迭代 · 观察

	xrtMapIterEnd(&tIterator);

xrtIntMapInit函数

使用默认 16 字节值对齐初始化空整数映射(按键有序存储)。

bool xrtIntMapInit(xintmap* pMap, size_t iValueSize)

参数

参数方向约束说明
pMap输出非空接收空映射
iValueSize输入> 0每值字节数
返回值
返回含义失败时状态
true已就绪—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map · 生命周期 · 观察

	if ( !xrtIntMapInit(&tSessions, sizeof(sessionstate)) ) {
整数键 IntMap

xrtIntMapInitAligned函数

使用显式值对齐初始化空整数映射。

bool xrtIntMapInitAligned(xintmap* pMap, size_t iValueSize, size_t iAlignment)

参数

参数方向约束说明
pMap输出非空接收空映射
iValueSize输入> 0每值字节数
iAlignment输入非零二次幂值对齐
返回值
返回含义失败时状态
true已就绪—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 生命周期 · 观察

		if ( !xrtIntMapInitAligned(&Aligned, sizeof(ptr), 64u) ) {

xrtIntMapCreate函数

创建使用默认 16 字节值对齐的空整数映射。

xintmap* xrtIntMapCreate(size_t iValueSize)

参数

参数方向约束说明
iValueSize输入> 0每值字节数
返回值
返回含义失败时状态
非空堆映射;Destroy 释放—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/int_map_tour · 生命周期 · 观察

	xintmap* pMap = xrtIntMapCreate(sizeof(int64));

xrtIntMapCreateAligned函数

创建使用显式值对齐的空整数映射。

xintmap* xrtIntMapCreateAligned(size_t iValueSize, size_t iAlignment)

参数

参数方向约束说明
iValueSize输入> 0每值字节数
iAlignment输入非零二次幂值对齐
返回值
返回含义失败时状态
非空堆映射—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/int_map_tour · 生命周期 · 观察

		xintmap* pHeap = xrtIntMapCreateAligned(sizeof(ptr), 64u);

xrtIntMapSetDrop函数

为仍为空的映射设置值资源释放器和用户数据。

bool xrtIntMapSetDrop(xintmap* pMap, xintmapdrop pDrop, ptr pUserData)

参数

参数方向约束说明
pMap输入/输出非空、空映射目标映射
pDrop输入非空值释放器
pUserData输入任意值传给释放器
返回值
返回含义失败时状态
true已安装—
false映射非空—
错误
  • XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改

范例已编译验证

containers/int_map_tour · 生命周期 · 观察

		printf("setdrop=%d\n", xrtIntMapSetDrop(&Aligned, NULL, NULL) ? 1 : 0);

xrtIntMapUnit函数

释放全部值和池页,但不释放映射结构。

void xrtIntMapUnit(xintmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无值释放器先执行—
错误
  • 无 — 释放不失败

范例已编译验证

containers/int_map · 生命周期 · 观察

		xrtIntMapUnit(&tSessions);

xrtIntMapDestroy函数

释放全部值、池页和映射结构。

void xrtIntMapDestroy(xintmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无全部资源已释放—
错误
  • 无 — 释放不失败

范例已编译验证

containers/int_map_tour · 生命周期 · 观察

			xrtIntMapDestroy(pMap);

xrtIntMapClear函数

清空全部值并保留固定池的复用能力。

void xrtIntMapClear(xintmap* pMap)

参数

参数方向约束说明
pMap输入允许空空 = 空操作
返回值
返回含义失败时状态
无Count 归零;池页保留—
错误
  • 无 — 清空不失败

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	xrtIntMapClear(pMap);

xrtIntMapTrim函数

释放空闲池页,并返回实际释放的页数。

size_t xrtIntMapTrim(xintmap* pMap, size_t iRetainEmpty)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iRetainEmpty输入—至少保留的空页数
返回值
返回含义失败时状态
>= 0实际释放页数—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	(void)xrtIntMapTrim(pMap, 0);

xrtIntMapCount函数

返回当前键值数量,非法映射返回零。

size_t xrtIntMapCount(const xintmap* pMap)

参数

参数方向约束说明
pMap输入允许空目标映射
返回值
返回含义失败时状态
>= 0键值数—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 查询 · 观察

		xrtIntMapCount(pMap));

xrtIntMapGetOrAdd函数

返回已有值槽,或原地创建并清零一个新值槽。

ptr xrtIntMapGetOrAdd(xintmap* pMap, int64 iKey, bool* pNew)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—整数键
pNew输出可空是否新插入
返回值
返回含义失败时状态
非空值槽(新槽已清零)—
NULL参数非法或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/int_map · 编辑 · 观察

	pState = (sessionstate*)xrtIntMapGetOrAdd(&tSessions, 1000001, &bNew);

xrtIntMapGetOrInit函数

返回已有值槽,或失败原子地原位初始化一个新值。

ptr xrtIntMapGetOrInit(xintmap* pMap, int64 iKey, xintmapinit pInit, ptr pUserData, bool* pNew)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—整数键
pInit输入非空原位初始化回调
pUserData输入任意值传给回调
pNew输出可空是否新插入
返回值
返回含义失败时状态
非空值槽—
NULL回调失败(原子回滚)或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败
  • 回调失败 — 回滚新条目

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	pSlot = xrtIntMapGetOrInit(pMap, 60, initZero, NULL, NULL);

xrtIntMapSet函数

复制插入或替换值;替换时先调用旧值释放器。

bool xrtIntMapSet(xintmap* pMap, int64 iKey, const void* pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—整数键
pValue输入借用、独立值来源
返回值
返回含义失败时状态
true已插入/替换—
false参数或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/int_map_tour · 编辑 · 观察

		if ( !xrtIntMapSet(pMap, Keys[i], &iValue) ) {

xrtIntMapGet函数

返回指定键的可写值槽,未找到是正常结果。

ptr xrtIntMapGet(xintmap* pMap, int64 iKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—整数键
返回值
返回含义失败时状态
非空可写值槽—
NULL未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	if ( (pSlot = xrtIntMapGet(pMap, 20)) != NULL ) {

xrtIntMapConstGet函数

返回指定键的只读值槽,未找到是正常结果。

const void* xrtIntMapConstGet(const xintmap* pMap, int64 iKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—整数键
返回值
返回含义失败时状态
非空只读值槽—
NULL未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

		(long long)*(const int64*)xrtIntMapConstGet(pMap, 10));

xrtIntMapHas函数

判断指定整数键是否存在。

bool xrtIntMapHas(const xintmap* pMap, int64 iKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—整数键
返回值
返回含义失败时状态
true存在—
false不存在不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

		pSlot != NULL ? 1 : 0, xrtIntMapHas(pMap, 60) ? 1 : 0,

xrtIntMapRemove函数

删除指定键并调用值释放器。

bool xrtIntMapRemove(xintmap* pMap, int64 iKey)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—要删除的键
返回值
返回含义失败时状态
true已删除—
false未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	printf("removed=%d ", xrtIntMapRemove(pMap, 30) ? 1 : 0);

xrtIntMapTake函数

将指定键的值字节移交给调用方后删除,不调用值释放器。

bool xrtIntMapTake(xintmap* pMap, int64 iKey, ptr pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—键
pValue输出非空、独立接收值字节
返回值
返回含义失败时状态
true值已移交且条目已删除—
false未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	(void)xrtIntMapTake(pMap, 10, &iValue);

xrtIntMapSetPtr函数

对 sizeof(ptr) 值映射执行指针类型友好的插入或替换。

bool xrtIntMapSetPtr(xintmap* pMap, int64 iKey, ptr pValue)

参数

参数方向约束说明
pMap输入/输出非空值大小为 sizeof(ptr) 的映射
iKey输入—整数键
pValue输入—指针值
返回值
返回含义失败时状态
true已插入/替换—
false参数或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_MEMORY — 分配失败

范例已编译验证

containers/int_map_tour · 编辑 · 观察

	(void)xrtIntMapSetPtr(pMap, 50, (ptr)0xABu);

xrtIntMapGetPtr函数

返回 sizeof(ptr) 值映射中保存的指针;空指针值与缺失键用 Has 区分。

ptr xrtIntMapGetPtr(xintmap* pMap, int64 iKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—整数键
返回值
返回含义失败时状态
非空或空保存的指针(可为 NULL 值)—
区分缺失用 xrtIntMapHas不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	printf("getptr=%p ", (void*)xrtIntMapGetPtr(pMap, 50));

xrtIntMapTakePtr函数

从 sizeof(ptr) 值映射中移交指针,不调用值释放器。

bool xrtIntMapTakePtr(xintmap* pMap, int64 iKey, ptr* pValue)

参数

参数方向约束说明
pMap输入/输出非空目标映射
iKey输入—键
pValue输出非空、独立接收指针
返回值
返回含义失败时状态
true指针已移交且条目已删除—
false未找到不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 编辑 · 观察

			(void)xrtIntMapTakePtr(&Aligned, 1, &pTaken);

xrtIntMapFirst函数

返回顺序第一项的值槽,并可选返回键。

ptr xrtIntMapFirst(xintmap* pMap, int64* pKey)

参数

参数方向约束说明
pMap输入非空目标映射
pKey输出可空接收键
返回值
返回含义失败时状态
非空首项值槽(键最小)—
NULL空映射不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	(void)xrtIntMapFirst(pMap, &iKey);

xrtIntMapLast函数

返回顺序最后一项的值槽,并可选返回键。

ptr xrtIntMapLast(xintmap* pMap, int64* pKey)

参数

参数方向约束说明
pMap输入非空目标映射
pKey输出可空接收键
返回值
返回含义失败时状态
非空末项值槽(键最大)—
NULL空映射不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	(void)xrtIntMapLast(pMap, &iKey);

xrtIntMapLowerBound函数

返回第一个不小于指定键的值槽和实际键。

ptr xrtIntMapLowerBound(xintmap* pMap, int64 iKey, int64* pActualKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—边界键
pActualKey输出可空接收实际键
返回值
返回含义失败时状态
非空首个 >= iKey 项—
NULL全部小于 iKey不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	(void)xrtIntMapLowerBound(pMap, 25, &iKey);

xrtIntMapUpperBound函数

返回第一个严格大于指定键的值槽和实际键。

ptr xrtIntMapUpperBound(xintmap* pMap, int64 iKey, int64* pActualKey)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—边界键
pActualKey输出可空接收实际键
返回值
返回含义失败时状态
非空首个 > iKey 项—
NULL无严格大于项不设错
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • 未找到不是错误

范例已编译验证

containers/int_map_tour · 查询 · 观察

	(void)xrtIntMapUpperBound(pMap, 25, &iKey);

xrtIntMapVisit函数

按键升序访问值;回调期间查询可用,结构和生命周期修改被拒绝。

size_t xrtIntMapVisit(xintmap* pMap, xintmapvisitor pVisitor, ptr pUserData)

参数

参数方向约束说明
pMap输入非空目标映射
pVisitor输入非空访问器
pUserData输入任意值传给访问器
返回值
返回含义失败时状态
>= 0实际访问数—
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 迭代 · 观察

	(void)xrtIntMapVisit(pMap, doubleValue, &iHit);

xrtIntMapIterBegin函数

启动按键升序的外置迭代器。

bool xrtIntMapIterBegin(xintmap* pMap, xintmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map · 迭代 · 观察

	if ( !xrtIntMapIterBegin(&tSessions, &tIterator) ) {

xrtIntMapIterRBegin函数

启动按键降序的外置迭代器。

bool xrtIntMapIterRBegin(xintmap* pMap, xintmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 迭代 · 观察

	(void)xrtIntMapIterRBegin(pMap, &Iter);

xrtIntMapIterFrom函数

从第一个不小于指定键的项开始升序迭代。

bool xrtIntMapIterFrom(xintmap* pMap, int64 iKey, xintmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—起点键
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪(O(log n) 起点)—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 迭代 · 观察

	(void)xrtIntMapIterFrom(pMap, 20, &Iter);

xrtIntMapIterRFrom函数

从第一个不大于指定键的项开始降序迭代。

bool xrtIntMapIterRFrom(xintmap* pMap, int64 iKey, xintmapiter* pIterator)

参数

参数方向约束说明
pMap输入非空目标映射
iKey输入—起点键
pIterator输出非空迭代器
返回值
返回含义失败时状态
true已就绪—
false参数错误XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法

范例已编译验证

containers/int_map_tour · 迭代 · 观察

	(void)xrtIntMapIterRFrom(pMap, 30, &Iter);

xrtIntMapIterNext函数

返回下一值槽并可选返回键;自然耗尽不设错。

ptr xrtIntMapIterNext(xintmapiter* pIterator, int64* pKey)

参数

参数方向约束说明
pIterator输入/输出非空、活动迭代器
pKey输出可空接收键
返回值
返回含义失败时状态
非空下一值槽—
NULL耗尽或结构被修改结构修改时 XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或大小/对齐非法
  • XERR_STATE — 迭代期间结构被修改

范例已编译验证

containers/int_map · 迭代 · 观察

	while ( (pState = (sessionstate*)xrtIntMapIterNext(&tIterator, &iSessionId)) != NULL ) {

xrtIntMapIterEnd函数

提前结束迭代并清除借用状态。

void xrtIntMapIterEnd(xintmapiter* pIterator)

参数

参数方向约束说明
pIterator输入允许空空 = 空操作
返回值
返回含义失败时状态
无纯清理—
错误
  • 无 — 清理不失败

范例已编译验证

containers/int_map · 迭代 · 观察

	xrtIntMapIterEnd(&tIterator);

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XRT_MAP_ALIGNMENT_DEFAULT见头文件注释
XRT_MAP_BUCKETS_MIN见头文件注释