# IterKey
- 用于高效地存储 key。它可以:
- 用户可以将 key 拷贝进去,或者让它指向一个 unowned 地址
- 对于拷贝的小 key,使用了一个小的 inline buffer 来减少内存分配
- 跟踪了 key 的类型(user or internal),并允许相互转换。
## 核心成员
- **`key_`**:`const char *`,指向 key 的指针,可以是内部buffer,也可以是外部地址
- **`key_size_`**:`size_t`,key 的大小
- **`is_user_key_`**:`bool`,是否为 user key,false 表示为 internal key。
- 初始值为 true。
- **`space_`**:`char[30]`,inlined 小 key 存储buffer
- **`buf_`**:`char *`,内部存储 key 的 buffer(copy case),可以指向 `space_`(初始值) 或者堆上分配
- **`buf_size_`**:`buf_`的大小,可以是 `space_` 的大小(初始值)或者堆上分配的大小。
## GetUserKey()
- 如果存储的是 user key,直接返回 `Slice(key_, key_size_)`
- 否则为 internal key,返回 `Slice(key_, key_size_ - kNumInternalBytes)`
## IsKeyPinned()
- key 是否由外部存储
- 返回 `key_ != buf_`
## TrimAppend
- 入参:
- **`shared_len`**:`size_t`
- **`non_shared_data`**:`const char *`
- **`non_shared_len`**:`size_t`
- 将 `non_shared_data`追加到 `shared_len` 之后,最后总长度为 `shared_len + non_shared_len`
----------
# TODO
- [ ] Thread Pool
- [ ] Arena
- [ ] FaultInjectionTestFS