本文整理汇总了C++中ListIterator::Score方法的典型用法代码示例。如果您正苦于以下问题:C++ ListIterator::Score方法的具体用法?C++ ListIterator::Score怎么用?C++ ListIterator::Score使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ListIterator
的用法示例。
在下文中一共展示了ListIterator::Score方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LClear
int Ardb::LClear(Context& ctx, ValueObject& meta)
{
BatchWriteGuard guard(GetKeyValueEngine(), meta.meta.Encoding() != COLLECTION_ENCODING_ZIPLIST);
if (meta.meta.Encoding() != COLLECTION_ENCODING_ZIPLIST)
{
ListIterator iter;
meta.meta.len = 0;
ListIter(ctx, meta, iter, false);
while (iter.Valid())
{
KeyObject fk;
fk.db = ctx.currentDB;
fk.key = meta.key.key;
fk.type = LIST_ELEMENT;
fk.score = *(iter.Score());
DelKeyValue(ctx, fk);
iter.Next();
}
}
DelKeyValue((ctx), meta.key);
return 0;
}
示例2: LSet
int Ardb::LSet(Context& ctx, RedisCommandFrame& cmd)
{
int64 index;
if (!GetInt64Value(ctx, cmd.GetArguments()[1], index))
{
fill_error_reply(ctx.reply, "value is not an integer or out of range");
return 0;
}
ValueObject meta;
int err = GetMetaValue(ctx, cmd.GetArguments()[0], LIST_META, meta);
CHECK_ARDB_RETURN_VALUE(ctx.reply, err);
if (0 != err)
{
fill_error_reply(ctx.reply, "no such key");
return 0;
}
if (meta.meta.Encoding() == COLLECTION_ENCODING_ZIPLIST)
{
Data* entry = GetZipEntry(meta.meta.ziplist, index);
if (NULL == entry)
{
fill_error_reply(ctx.reply, "index out of range");
return 0;
}
else
{
entry->SetString(cmd.GetArguments()[2], true);
SetKeyValue(ctx, meta);
fill_status_reply(ctx.reply, "OK");
return 0;
}
}
else
{
if (index >= meta.meta.Length() || (-index) > meta.meta.Length())
{
fill_error_reply(ctx.reply, "index out of range");
return 0;
}
if (meta.meta.IsSequentialList())
{
ValueObject list_element;
list_element.key.db = meta.key.db;
list_element.key.key = meta.key.key;
list_element.key.type = LIST_ELEMENT;
list_element.key.score = meta.meta.min_index;
if (index >= 0)
{
list_element.key.score.IncrBy(index);
}
else
{
list_element.key.score.IncrBy(index + meta.meta.Length());
}
if (0 == GetKeyValue(ctx, list_element.key, &list_element))
{
list_element.element.SetString(cmd.GetArguments()[2], true);
SetKeyValue(ctx, list_element);
fill_status_reply(ctx.reply, "OK");
return 0;
}
}
else
{
ListIterator iter;
ListIter(ctx, meta, iter, index < 0);
int64 cursor = index >= 0 ? 0 : -1;
while (iter.Valid())
{
if (cursor == index)
{
ValueObject v;
v.key.db = meta.key.db;
v.key.key = meta.key.key;
v.key.type = LIST_ELEMENT;
v.key.score = *(iter.Score());
v.type = LIST_ELEMENT;
v.element.SetString(cmd.GetArguments()[2], true);
SetKeyValue(ctx, v);
fill_status_reply(ctx.reply, "OK");
return 0;
}
if (cursor >= 0)
{
cursor++;
}
else
{
cursor--;
}
if (index < 0)
{
iter.Prev();
}
else
{
iter.Next();
}
}
//.........这里部分代码省略.........
示例3: ListInsert
int Ardb::ListInsert(Context& ctx, ValueObject& meta, const std::string* match, const std::string& value, bool head,
bool abort_nonexist)
{
if (WakeBlockList(ctx, meta.key.key, value))
{
fill_int_reply(ctx.reply, 1);
return 0;
}
if (NULL != match)
{
if (meta.meta.Encoding() == COLLECTION_ENCODING_ZIPLIST)
{
Data element;
element.SetString(value, true);
DataArray::iterator zit = meta.meta.ziplist.begin();
while (zit != meta.meta.ziplist.end())
{
std::string tmp;
zit->GetDecodeString(tmp);
if (tmp == *match)
{
break;
}
zit++;
}
if (zit == meta.meta.ziplist.end())
{
fill_int_reply(ctx.reply, 0);
return 0;
}
if (head)
{
meta.meta.ziplist.insert(zit, element);
}
else
{
zit++;
if (zit != meta.meta.ziplist.end())
{
meta.meta.ziplist.insert(zit, element);
}
else
{
meta.meta.ziplist.push_back(element);
}
}
if (meta.meta.Length() > 1
&& (meta.meta.Length() >= m_cfg.list_max_ziplist_entries
|| element.StringLength() >= m_cfg.list_max_ziplist_value))
{
//convert to non ziplist
ZipListConvert(ctx, meta);
}
}
else
{
ListIterator iter;
ListIter(ctx, meta, iter, false);
std::string tmp;
Data prev, next;
Data current;
bool matched = false;
while (iter.Valid())
{
if (iter.Element()->GetDecodeString(tmp) == (*match))
{
current = *(iter.Score());
matched = true;
if (head)
{
break;
}
}
if (head)
{
prev = *(iter.Score());
iter.Next();
}
else
{
if (matched)
{
next = *(iter.Score());
break;
}
}
iter.Next();
}
if (!matched)
{
fill_int_reply(ctx.reply, 0);
return 0;
}
Data score;
if (head)
{
if (prev.IsNil())
{
score = current.IncrBy(-1);
}
//.........这里部分代码省略.........
示例4: ListPop
int Ardb::ListPop(Context& ctx, const std::string& key, bool lpop)
{
ValueObject meta;
KeyLockerGuard keylock(m_key_lock, ctx.currentDB, key);
int err = GetMetaValue(ctx, key, LIST_META, meta);
CHECK_ARDB_RETURN_VALUE(ctx.reply, err);
if (0 != err)
{
ctx.reply.type = REDIS_REPLY_NIL;
return 0;
}
BatchWriteGuard guard(GetKeyValueEngine(), meta.meta.Encoding() != COLLECTION_ENCODING_ZIPLIST);
if (meta.meta.Encoding() == COLLECTION_ENCODING_ZIPLIST)
{
if (!meta.meta.ziplist.empty())
{
if (lpop)
{
Data& data = meta.meta.ziplist.front();
fill_value_reply(ctx.reply, data);
meta.meta.ziplist.pop_front();
}
else
{
Data& data = meta.meta.ziplist.back();
fill_value_reply(ctx.reply, data);
meta.meta.ziplist.pop_back();
}
if (meta.meta.ziplist.empty())
{
DelKeyValue(ctx, meta.key);
}
else
{
SetKeyValue(ctx, meta);
}
}
else
{
ctx.reply.type = REDIS_REPLY_NIL;
}
return 0;
}
else
{
bool poped = false;
if (meta.meta.IsSequentialList())
{
if (meta.meta.Length() > 0)
{
ValueObject lkv;
lkv.key.type = LIST_ELEMENT;
lkv.key.key = meta.key.key;
lkv.key.db = ctx.currentDB;
lkv.key.score = lpop ? meta.meta.min_index : meta.meta.max_index;
if (0 == GetKeyValue(ctx, lkv.key, &lkv))
{
DelKeyValue(ctx, lkv.key);
if (lpop)
{
meta.meta.min_index.IncrBy(1);
}
else
{
meta.meta.max_index.IncrBy(-1);
}
meta.meta.len--;
poped = true;
fill_value_reply(ctx.reply, lkv.element);
}
}
}
else
{
ListIterator iter;
err = ListIter(ctx, meta, iter, !lpop);
while (iter.Valid())
{
if (!poped)
{
fill_value_reply(ctx.reply, *(iter.Element()));
poped = true;
meta.meta.len--;
KeyObject k;
k.type = LIST_ELEMENT;
k.key = meta.key.key;
k.db = ctx.currentDB;
k.score = *(iter.Score());
DelKeyValue(ctx, k);
}
else
{
if (lpop)
{
meta.meta.min_index = *(iter.Score());
}
else
{
meta.meta.max_index = *(iter.Score());
}
//.........这里部分代码省略.........
示例5: LRem
int Ardb::LRem(Context& ctx, RedisCommandFrame& cmd)
{
int64 count;
if (!GetInt64Value(ctx, cmd.GetArguments()[1], count))
{
return 0;
}
int64 toremove = std::abs(count);
ValueObject meta;
int err = GetMetaValue(ctx, cmd.GetArguments()[0], LIST_META, meta);
CHECK_ARDB_RETURN_VALUE(ctx.reply, err);
if (0 != err)
{
fill_int_reply(ctx.reply, 0);
return 0;
}
Data element;
element.SetString(cmd.GetArguments()[2], true);
KeyLockerGuard lock(m_key_lock, ctx.currentDB, cmd.GetArguments()[0]);
if (meta.meta.Encoding() == COLLECTION_ENCODING_ZIPLIST)
{
uint32 oldlen = meta.meta.ziplist.size();
int64 removed = 0;
DataArray newzip;
if (count >= 0)
{
for (uint32 i = 0; i < oldlen; i++)
{
if (meta.meta.ziplist[i] == element)
{
if (toremove == 0 || removed < toremove)
{
removed++;
continue;
}
}
newzip.push_back(meta.meta.ziplist[i]);
}
}
else
{
for (uint32 i = 0; i < oldlen; i++)
{
if (meta.meta.ziplist[oldlen - 1 - i] == element)
{
if (toremove == 0 || removed < toremove)
{
removed++;
continue;
}
}
newzip.push_front(meta.meta.ziplist[i]);
}
}
if (removed > 0)
{
meta.meta.ziplist = newzip;
SetKeyValue(ctx, meta);
}
fill_int_reply(ctx.reply, removed);
return 0;
}
BatchWriteGuard guard(GetKeyValueEngine());
ListIterator iter;
ListIter(ctx, meta, iter, count < 0);
int64 remove = 0;
while (iter.Valid())
{
if (iter.Element()->Compare(element) == 0)
{
meta.meta.len--;
meta.meta.SetFlag(COLLECTION_FLAG_NORMAL);
KeyObject k;
k.db = meta.key.db;
k.key = meta.key.key;
k.type = LIST_ELEMENT;
k.score = *(iter.Score());
DelRaw(ctx, iter.CurrentRawKey());
//DelKeyValue(ctx, k);
remove++;
if (remove == toremove)
{
break;
}
}
if (count < 0)
{
iter.Prev();
}
else
{
iter.Next();
}
}
if (remove > 0)
{
SetKeyValue(ctx, meta);
}
fill_int_reply(ctx.reply, remove);
return 0;
//.........这里部分代码省略.........