模块契约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类型
字节键映射使用哈希桶查找,并以独立条目保持键和值地址稳定。
| 字段 | 类型 | 语义 |
|---|
Buckets | xmapentry** | 桶数组 |
First | xmapentry* | 首元素 |
Last | xmapentry* | 末元素 |
ValueSize | size_t | ValueSize |
ValueOffset | size_t | ValueOffset |
KeyOffset | size_t | KeyOffset |
Alignment | size_t | 对齐(二次幂) |
Count | size_t | 数量 |
BucketCount | size_t | 桶数量 |
Threshold | size_t | 阈值 |
Version | uint64 | 结构版本 |
Hash | xmaphash | Hash |
Equal | xmapequal | Equal |
Drop | xmapdrop | Drop |
KeyUserData | ptr | KeyUserData |
DropUserData | ptr | DropUserData |
Flags | uint32 | 标志位 |
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类型
外置迭代器允许同一映射存在多个独立遍历状态。
| 字段 | 类型 | 语义 |
|---|
Map | xmap* | Map |
Next | xmapentry* | 后继 |
Version | uint64 | 结构版本 |
Direction | int | Direction |
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 — 指针为空或大小/对齐非法
xrtMapInitAligned函数
使用显式值对齐初始化空字节键映射。
bool xrtMapInitAligned(xmap* pMap, size_t iValueSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输出 | 非空 | 接收空映射 |
iValueSize | 输入 | > 0 | 每值字节数 |
iAlignment | 输入 | 非零二次幂 | 值对齐 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtMapCreate函数
创建使用默认 16 字节值对齐的空字节键映射。
xmap* xrtMapCreate(size_t iValueSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iValueSize | 输入 | > 0 | 每值字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 堆映射;Destroy 释放 | — |
NULL | 参数非法或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapCreateAligned函数
创建使用显式值对齐的空字节键映射。
xmap* xrtMapCreateAligned(size_t iValueSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iValueSize | 输入 | > 0 | 每值字节数 |
iAlignment | 输入 | 非零二次幂 | 值对齐 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 堆映射 | — |
NULL | 参数非法或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapSetKeyPolicy函数
为仍为空的映射设置成对的自定义哈希器和相等器;两个空指针恢复默认策略。
bool xrtMapSetKeyPolicy(xmap* pMap, xmaphash pHash, xmapequal pEqual, ptr pUserData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空、空映射 | 目标映射 |
pHash | 输入 | 允许空(成对) | 哈希器 |
pEqual | 输入 | 允许空(成对) | 相等器 |
pUserData | 输入 | 任意值 | 原样传给二者 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 策略已安装 | — |
false | 映射非空或参数非法 | — |
错误XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtMapSetDrop函数
为仍为空的映射设置值资源释放器和独立用户数据。
bool xrtMapSetDrop(xmap* pMap, xmapdrop pDrop, ptr pUserData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空、空映射 | 目标映射 |
pDrop | 输入 | 非空 | 值释放器 |
pUserData | 输入 | 任意值 | 原样传给释放器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 释放器已安装 | — |
false | 映射非空 | — |
错误XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改
xrtMapUnit函数
释放全部键值和桶数组,但不释放映射结构(内嵌形态收尾)。
void xrtMapUnit(xmap* pMap)
xrtMapDestroy函数
释放全部键值、桶数组和映射结构。
void xrtMapDestroy(xmap* pMap)
xrtMapClear函数
清空全部键值并保留桶数组供复用。
void xrtMapClear(xmap* pMap)
xrtMapReserve函数
确保映射无需扩容即可容纳指定数量的键。
bool xrtMapReserve(xmap* pMap, size_t iCapacity)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iCapacity | 输入 | — | 最低容量 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 容量已保证 | — |
false | 参数或 OOM | 映射不变 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapTrim函数
把桶数组收缩到当前键数所需的最小容量。
bool xrtMapTrim(xmap* pMap)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已收缩 | — |
false | 参数或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapCount函数
返回当前键值数量,非法映射返回零。
size_t xrtMapCount(const xmap* pMap)
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtMapCapacity函数
返回当前桶数组在再次扩容前可容纳的键数。
size_t xrtMapCapacity(const xmap* pMap)
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
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 — 分配失败- 回调失败 — 回滚新条目,映射不变
xrtMapSet函数
复制插入或替换值;来源不得触及映射元数据或目标条目。
bool xrtMapSet(xmap* pMap, xbytesview Key, const void* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
Key | 输入 | 借用 | 字节键 |
pValue | 输入 | 借用、独立 | 值来源 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已插入/替换(旧值先过释放器) | — |
false | 参数或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapGet函数
返回指定键的可写值槽,未找到是正常结果。
ptr xrtMapGet(xmap* pMap, xbytesview Key)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
Key | 输入 | 借用 | 字节键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 可写值槽 | — |
NULL | 未找到(正常结果) | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapConstGet函数
返回指定键的只读值槽,未找到是正常结果。
const void* xrtMapConstGet(const xmap* pMap, xbytesview Key)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
Key | 输入 | 借用 | 字节键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读值槽 | — |
NULL | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapHas函数
判断指定字节键是否存在。
bool xrtMapHas(const xmap* pMap, xbytesview Key)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
Key | 输入 | 借用 | 字节键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 存在 | — |
false | 不存在 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapStoredKey函数
返回与查询键等价的内部键副本,缺失时清空输出。
bool xrtMapStoredKey(const xmap* pMap, xbytesview Key, xbytesview* pStoredKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
Key | 输入 | 借用 | 查询键 |
pStoredKey | 输出 | 非空 | 接收内部键视图 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 视图已发布(存活到键被删除) | — |
false | 未找到 | *pStoredKey 清空 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapRemove函数
删除指定键并调用值释放器。
bool xrtMapRemove(xmap* pMap, xbytesview Key)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
Key | 输入 | 借用 | 要删除的键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已删除 | — |
false | 未找到(正常结果) | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapTake函数
将值移交给映射外缓冲后删除;输出不得触及映射拥有的内存。
bool xrtMapTake(xmap* pMap, xbytesview Key, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
Key | 输入 | 借用 | 键 |
pValue | 输出 | 非空、独立 | 接收值字节 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 值已移交且条目已删除(不调释放器) | — |
false | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapSetPtr函数
对 sizeof(ptr) 值映射执行指针类型友好的插入或替换。
bool xrtMapSetPtr(xmap* pMap, xbytesview Key, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 值大小为 sizeof(ptr) 的映射 |
Key | 输入 | 借用 | 字节键 |
pValue | 输入 | — | 指针值 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已插入/替换 | — |
false | 参数或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtMapGetPtr函数
返回 sizeof(ptr) 值映射中保存的指针;空值与缺失键用 Has 区分。
ptr xrtMapGetPtr(xmap* pMap, xbytesview Key)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
Key | 输入 | 借用 | 字节键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空或空 | 保存的指针(可为 NULL 值) | — |
| 区分缺失 | 用 xrtMapHas | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapTakePtr函数
从 sizeof(ptr) 值映射中移交指针,不调用值释放器。
bool xrtMapTakePtr(xmap* pMap, xbytesview Key, ptr* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
Key | 输入 | 借用 | 键 |
pValue | 输出 | 非空、独立 | 接收指针 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 指针已移交且条目已删除 | — |
false | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtMapVisit函数
按插入顺序访问键值,并返回实际访问数量。
size_t xrtMapVisit(xmap* pMap, xmapvisitor pVisitor, ptr pUserData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pVisitor | 输入 | 非空 | 访问器 |
pUserData | 输入 | 任意值 | 传给访问器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
>= 0 | 实际访问数(提前停止时小于总数) | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtMapIterBegin函数
启动按插入顺序的外置迭代器。
bool xrtMapIterBegin(xmap* pMap, xmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射(空映射可启动) |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtMapIterRBegin函数
启动按插入顺序逆序遍历的外置迭代器。
bool xrtMapIterRBegin(xmap* pMap, xmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
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 | 输入 | 允许空 | 空 = 空操作 |
xrtIntMapInit函数
使用默认 16 字节值对齐初始化空整数映射(按键有序存储)。
bool xrtIntMapInit(xintmap* pMap, size_t iValueSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输出 | 非空 | 接收空映射 |
iValueSize | 输入 | > 0 | 每值字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
整数键 IntMap
xrtIntMapInitAligned函数
使用显式值对齐初始化空整数映射。
bool xrtIntMapInitAligned(xintmap* pMap, size_t iValueSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输出 | 非空 | 接收空映射 |
iValueSize | 输入 | > 0 | 每值字节数 |
iAlignment | 输入 | 非零二次幂 | 值对齐 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapCreate函数
创建使用默认 16 字节值对齐的空整数映射。
xintmap* xrtIntMapCreate(size_t iValueSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iValueSize | 输入 | > 0 | 每值字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 堆映射;Destroy 释放 | — |
NULL | 参数非法或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtIntMapCreateAligned函数
创建使用显式值对齐的空整数映射。
xintmap* xrtIntMapCreateAligned(size_t iValueSize, size_t iAlignment)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iValueSize | 输入 | > 0 | 每值字节数 |
iAlignment | 输入 | 非零二次幂 | 值对齐 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 堆映射 | — |
NULL | 参数非法或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtIntMapSetDrop函数
为仍为空的映射设置值资源释放器和用户数据。
bool xrtIntMapSetDrop(xintmap* pMap, xintmapdrop pDrop, ptr pUserData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空、空映射 | 目标映射 |
pDrop | 输入 | 非空 | 值释放器 |
pUserData | 输入 | 任意值 | 传给释放器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已安装 | — |
false | 映射非空 | — |
错误XERR_STATE — 映射非空(策略/释放器只能在空映射上设置)或迭代期间结构被修改
xrtIntMapUnit函数
释放全部值和池页,但不释放映射结构。
void xrtIntMapUnit(xintmap* pMap)
xrtIntMapDestroy函数
释放全部值、池页和映射结构。
void xrtIntMapDestroy(xintmap* pMap)
xrtIntMapClear函数
清空全部值并保留固定池的复用能力。
void xrtIntMapClear(xintmap* pMap)
xrtIntMapTrim函数
释放空闲池页,并返回实际释放的页数。
size_t xrtIntMapTrim(xintmap* pMap, size_t iRetainEmpty)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iRetainEmpty | 输入 | — | 至少保留的空页数 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapCount函数
返回当前键值数量,非法映射返回零。
size_t xrtIntMapCount(const xintmap* pMap)
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapGetOrAdd函数
返回已有值槽,或原地创建并清零一个新值槽。
ptr xrtIntMapGetOrAdd(xintmap* pMap, int64 iKey, bool* pNew)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
pNew | 输出 | 可空 | 是否新插入 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 值槽(新槽已清零) | — |
NULL | 参数非法或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtIntMapGetOrInit函数
返回已有值槽,或失败原子地原位初始化一个新值。
ptr xrtIntMapGetOrInit(xintmap* pMap, int64 iKey, xintmapinit pInit, ptr pUserData, bool* pNew)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
pInit | 输入 | 非空 | 原位初始化回调 |
pUserData | 输入 | 任意值 | 传给回调 |
pNew | 输出 | 可空 | 是否新插入 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 值槽 | — |
NULL | 回调失败(原子回滚)或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败- 回调失败 — 回滚新条目
xrtIntMapSet函数
复制插入或替换值;替换时先调用旧值释放器。
bool xrtIntMapSet(xintmap* pMap, int64 iKey, const void* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
pValue | 输入 | 借用、独立 | 值来源 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已插入/替换 | — |
false | 参数或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtIntMapGet函数
返回指定键的可写值槽,未找到是正常结果。
ptr xrtIntMapGet(xintmap* pMap, int64 iKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 可写值槽 | — |
NULL | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapConstGet函数
返回指定键的只读值槽,未找到是正常结果。
const void* xrtIntMapConstGet(const xintmap* pMap, int64 iKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 只读值槽 | — |
NULL | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapHas函数
判断指定整数键是否存在。
bool xrtIntMapHas(const xintmap* pMap, int64 iKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 存在 | — |
false | 不存在 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapRemove函数
删除指定键并调用值释放器。
bool xrtIntMapRemove(xintmap* pMap, int64 iKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 要删除的键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已删除 | — |
false | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapTake函数
将指定键的值字节移交给调用方后删除,不调用值释放器。
bool xrtIntMapTake(xintmap* pMap, int64 iKey, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 键 |
pValue | 输出 | 非空、独立 | 接收值字节 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 值已移交且条目已删除 | — |
false | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapSetPtr函数
对 sizeof(ptr) 值映射执行指针类型友好的插入或替换。
bool xrtIntMapSetPtr(xintmap* pMap, int64 iKey, ptr pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 值大小为 sizeof(ptr) 的映射 |
iKey | 输入 | — | 整数键 |
pValue | 输入 | — | 指针值 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已插入/替换 | — |
false | 参数或 OOM | — |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法XERR_MEMORY — 分配失败
xrtIntMapGetPtr函数
返回 sizeof(ptr) 值映射中保存的指针;空指针值与缺失键用 Has 区分。
ptr xrtIntMapGetPtr(xintmap* pMap, int64 iKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 整数键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空或空 | 保存的指针(可为 NULL 值) | — |
| 区分缺失 | 用 xrtIntMapHas | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapTakePtr函数
从 sizeof(ptr) 值映射中移交指针,不调用值释放器。
bool xrtIntMapTakePtr(xintmap* pMap, int64 iKey, ptr* pValue)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入/输出 | 非空 | 目标映射 |
iKey | 输入 | — | 键 |
pValue | 输出 | 非空、独立 | 接收指针 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 指针已移交且条目已删除 | — |
false | 未找到 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapFirst函数
返回顺序第一项的值槽,并可选返回键。
ptr xrtIntMapFirst(xintmap* pMap, int64* pKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pKey | 输出 | 可空 | 接收键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 首项值槽(键最小) | — |
NULL | 空映射 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapLast函数
返回顺序最后一项的值槽,并可选返回键。
ptr xrtIntMapLast(xintmap* pMap, int64* pKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pKey | 输出 | 可空 | 接收键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 末项值槽(键最大) | — |
NULL | 空映射 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapLowerBound函数
返回第一个不小于指定键的值槽和实际键。
ptr xrtIntMapLowerBound(xintmap* pMap, int64 iKey, int64* pActualKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 边界键 |
pActualKey | 输出 | 可空 | 接收实际键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 首个 >= iKey 项 | — |
NULL | 全部小于 iKey | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapUpperBound函数
返回第一个严格大于指定键的值槽和实际键。
ptr xrtIntMapUpperBound(xintmap* pMap, int64 iKey, int64* pActualKey)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 边界键 |
pActualKey | 输出 | 可空 | 接收实际键 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 首个 > iKey 项 | — |
NULL | 无严格大于项 | 不设错 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法- 未找到不是错误
xrtIntMapVisit函数
按键升序访问值;回调期间查询可用,结构和生命周期修改被拒绝。
size_t xrtIntMapVisit(xintmap* pMap, xintmapvisitor pVisitor, ptr pUserData)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pVisitor | 输入 | 非空 | 访问器 |
pUserData | 输入 | 任意值 | 传给访问器 |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapIterBegin函数
启动按键升序的外置迭代器。
bool xrtIntMapIterBegin(xintmap* pMap, xintmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapIterRBegin函数
启动按键降序的外置迭代器。
bool xrtIntMapIterRBegin(xintmap* pMap, xintmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapIterFrom函数
从第一个不小于指定键的项开始升序迭代。
bool xrtIntMapIterFrom(xintmap* pMap, int64 iKey, xintmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 起点键 |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪(O(log n) 起点) | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
xrtIntMapIterRFrom函数
从第一个不大于指定键的项开始降序迭代。
bool xrtIntMapIterRFrom(xintmap* pMap, int64 iKey, xintmapiter* pIterator)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pMap | 输入 | 非空 | 目标映射 |
iKey | 输入 | — | 起点键 |
pIterator | 输出 | 非空 | 迭代器 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已就绪 | — |
false | 参数错误 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 指针为空或大小/对齐非法
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 | 输入 | 允许空 | 空 = 空操作 |
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
| XRT_MAP_ALIGNMENT_DEFAULT | 见头文件注释 |
| XRT_MAP_BUCKETS_MIN | 见头文件注释 |