forked from xiejingfa/the-annotated-redis-3.0
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathintset.h
62 lines (58 loc) · 2.74 KB
/
intset.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
* Copyright (c) 2009-2012, Pieter Noordhuis <pcnoordhuis at gmail dot com>
* Copyright (c) 2009-2012, Salvatore Sanfilippo <antirez at gmail dot com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __INTSET_H
#define __INTSET_H
#include <stdint.h>
/* 整数集合结构体 */
typedef struct intset {
// 编码方式,有三种编码:INTSET_ENC_INT16、INTSET_ENC_INT32、INTSET_ENC_INT64
uint32_t encoding;
// 保存的元素数量
uint32_t length;
// 真正存放数据的地方
int8_t contents[];
} intset;
/* 创建一个空的整数结合 */
intset *intsetNew(void);
/* 往intset中添加一个元素 */
intset *intsetAdd(intset *is, int64_t value, uint8_t *success);
/* 从intset中删除一个给定的整数,参数success用来标识是否执行了删除操作 */
intset *intsetRemove(intset *is, int64_t value, int *success);
/* 判断intset中是否包含指定的值 */
uint8_t intsetFind(intset *is, int64_t value);
/* 随机返回intset中的一个元素 */
int64_t intsetRandom(intset *is);
/* 返回intset中指定位置的元素 */
uint8_t intsetGet(intset *is, uint32_t pos, int64_t *value);
/* 返回intset中保存的元素个数 */
uint32_t intsetLen(intset *is);
/* 返回intset所占用的字节数 */
size_t intsetBlobLen(intset *is);
#endif // __INTSET_H