ts+to;
bytes *= sizeof(int16_t);
}
memmove(dst,src,bytes);
}
intsetUpdateAndAdd
//¶Ô±àÂëÀàÐͽøÐÐÉý¼¶£¬O(n)
//ÐèÒª²åÈëµÄÖµ£¬ÒªÃ´±Èµ±Ç°¼¯ºÏÖеÄ×î´óÖµ´ó£¬ÒªÃ´±È¼¯ºÏÖеÄ×îСֵС£¬²»È»²»ÐèÒªÉý¼¶
//±È×î´óÖµ´ó»¹ÊÇС£¬Ö»ÐèÒª¸ù¾ÝvalueµÄÕý¸º¼´¿ÉÅжÏ
static intset *intsetUpgradeAndAdd(intset *is, int64_t value) {
uint8_t curenc = intrev32ifbe(is->encoding); //µ±Ç°±àÂëÀàÐÍ
uint8_t newenc = _intsetValueEncoding(value);//еıàÂëÀàÐÍ
int length = intrev32ifbe(is->length);
int prepend = value < 0 1 : 0;//¾ö¶¨ÐµÄÖµ²åÈëµÄλÖÃ(1±íʾͷ£¬0±íʾβ)
/* First set new encoding and resize */
is->encoding = intrev32ifbe(newenc); //ÉèÖñàÂëÀàÐÍ
is = intsetResize(is,intrev32ifbe(is->length)+1);//resize
/* 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. */
//ͨ¹ý_intsetGetEncodedµÃµ½Éý¼¶Ç°µÄ¸ÃλÖõÄÕûÊýÖµ
//ÉèÖÃÔÀ´µÄÕûÊý¼¯µÄÖµ£¬Èç¹ûprepend=1±íʾÐÂÖµÔÚÍ·²åÈ룬ÄÇôÔÀ´µÄÊýֵȫ²¿ÏòºóÆ«ÒÆ
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,intrev32ifbe(is->length),value);
is->length = intrev32ifbe(intrev32ifbe(is->length)+1);
return is;
}
intsetRemove
//ɾ³ýÒ»¸öÕûÊý
intset *intsetRemove(intset *is, int64_t value, int *success) {
uint8_t valenc = _intsetValueEncoding(value);
uint32_t pos;
if (success) *success = 0;
//valueÔÚÔ¼¯ºÏÖÐ
if (valenc <= intrev32ifbe(is->encoding) && intsetSearch(is,value,&pos)) {
uint32_t len = intrev32ifbe(is->length);
/* We know we can delete */
if (success) *success = 1;
/* Overwrite value with tail and update length */
//Èç¹û pos ²»ÊÇ is µÄ×îĩβ£¬Ö±½Óͨ¹ýmemmoveÄڴ渲¸ÇµÄ·½Ê½É¾³ý¸ÃÕûÊýÖµ
//Èç¹ûÊÇĩβ£¬Ö±½Óresizeɾ³ý
if (pos < (len-1)) intsetMoveTail(is,pos+1,pos);
is = intsetResize(is,len-1);//½«¿Õ¼äËõС
is->length = intrev32ifbe(len-1);
}
return is;
}
intsetÌí¼ÓÔªËØÁ÷³Ìͼ

С½á
intsetÓÃÓÚÓÐÐò¡¢ÎÞÖØ¸´µØ±£´æ¶à¸öÕûÊýÖµ£¬Ëü»á¸ù¾ÝÔªËØµÄÖµ£¬×Ô¶¯Ñ¡Ôñ¸ÃÓÃʲô³¤¶ÈµÄÕûÊýÀàÐÍÀ´±£´æÔªËØ£»
µ±Ìí¼ÓÐÂÔªËØÊ±£¬ÐèÒªÅжϵ±Ç°intsetµÄ±àÂëÀàÐÍÄÜ·ñ±£´æÐÂÔªËØ£¬Èç¹û²»ÐÐÐèÒª¶Ôintset½øÐÐÉý¼¶£¬Éý¼¶ºóµÄintsetÖеÄÔªËØ»áÀ©´óÆäÕ¼ÓеÄ×Ö½ÚÊý£¬µ«ÊÇÖµ²»·¢Éú¸Ä±ä£»
intsetÖ»Ö§³ÖÉý¼¶£¬²»Ö§³Ö½µ¼¶£¬Òò´ËÏà¶Ô¶øÑÔ»áÀË·ÑÄڴ棻
intsetÖÐÔªËØÊÇÓÐÐòÅÅÁеģ¬Òò´ËʹÓÃÕÛ°ë²éÕÒµÄʱ¼ä¸´ÔÓ¶ÈΪO(logN)¡£
×îºó¸Ðл»Æ½¡ºê£¨huangz1990£©µÄRedisÉè¼ÆÓëʵÏÖ¼°ÆäËû¶ÔRedis2.6Ô´ÂëµÄÏà¹Ø×¢ÊͶÔÎÒÔÚÑо¿Redis2.8Ô´Âë·½ÃæµÄ°ïÖú¡£