Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
f9d5c4e3
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f9d5c4e3
编写于
8月 26, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make the function intsetUpgrade self-contained
上级
76864d56
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
28 addition
and
17 deletion
+28
-17
src/intset.c
src/intset.c
+28
-17
未找到文件。
src/intset.c
浏览文件 @
f9d5c4e3
...
...
@@ -58,20 +58,6 @@ static intset *intsetResize(intset *is, uint32_t len) {
return
is
;
}
static
intset
*
intsetUpgrade
(
intset
*
is
,
uint8_t
newenc
,
uint8_t
extra
,
uint8_t
offset
)
{
uint8_t
curenc
=
is
->
encoding
;
int
length
=
is
->
length
;
/* First set new encoding and resize */
is
->
encoding
=
newenc
;
is
=
intsetResize
(
is
,
is
->
length
+
extra
);
/* Upgrade back-to-front so we don't overwrite values */
while
(
length
--
)
_intsetSet
(
is
,
length
+
offset
,
_intsetGetEncoded
(
is
,
length
,
curenc
));
return
is
;
}
/* Search for the position of "value". Return 1 when the value was found and
* sets "pos" to the position of the value within the intset. Return 0 when
* the value is not present in the intset and sets "pos" to the position
...
...
@@ -117,6 +103,32 @@ static uint8_t intsetSearch(intset *is, int64_t value, uint32_t *pos) {
}
}
/* Upgrades the intset to a larger encoding and inserts the given integer. */
static
intset
*
intsetUpgradeAndAdd
(
intset
*
is
,
int64_t
value
)
{
uint8_t
curenc
=
is
->
encoding
;
uint8_t
newenc
=
_intsetValueEncoding
(
value
);
int
length
=
is
->
length
;
int
prepend
=
value
<
0
?
1
:
0
;
/* First set new encoding and resize */
is
->
encoding
=
newenc
;
is
=
intsetResize
(
is
,
is
->
length
+
1
);
/* Upgrade back-to-front so we don't overwrite values.
* Note that the "prepend" variable is used to make sure we have an empty
* space at either the beginning or the end of the intset. */
while
(
length
--
)
_intsetSet
(
is
,
length
+
prepend
,
_intsetGetEncoded
(
is
,
length
,
curenc
));
/* Set the value at the beginning or the end. */
if
(
prepend
)
_intsetSet
(
is
,
0
,
value
);
else
_intsetSet
(
is
,
is
->
length
,
value
);
is
->
length
++
;
return
is
;
}
static
void
intsetMoveTail
(
intset
*
is
,
uint32_t
from
,
uint32_t
to
)
{
void
*
src
,
*
dst
;
uint32_t
bytes
=
is
->
length
-
from
;
...
...
@@ -146,9 +158,8 @@ intset *intsetAdd(intset *is, int64_t value, uint8_t *success) {
* this value should be either appended (if > 0) or prepended (if < 0),
* because it lies outside the range of existing values. */
if
(
valenc
>
is
->
encoding
)
{
offset
=
value
<
0
?
1
:
0
;
is
=
intsetUpgrade
(
is
,
valenc
,
1
,
offset
);
pos
=
(
value
<
0
)
?
0
:
is
->
length
;
/* This always succeeds, so we don't need to curry *success. */
return
intsetUpgradeAndAdd
(
is
,
value
);
}
else
{
/* Abort if the value is already present in the set.
* This call will populate "pos" with the right position to insert
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录