template <typename T>
struct List {
sp<T> head;
wp<T> tail;
sp<T> pending;
uint32_t count;
List()
: head(NULL)
, tail(NULL)
, pending(NULL)
, count(0){
}
bool add() {
if (add(pending)) {
pending.clear();
return true;
}
return false;
}
bool add(sp<T> &n) {
if (n.get()) {
if (head == NULL) {
head = n;
tail = n;
} else {
ASSERT(tail != NULL);
tail.promote()->next = n;
n->prev = tail;
tail = n;
}
++count;
return true;
}
return false;
}
bool remove(sp<T> &p) {
return remove(p.get());
}
bool remove(T *c) {
if (c) {
T *t = head.get();
while (t) {
if (t == c) {
ASSERT(count);
wp<T> p = t->prev;
sp<T> n = t->next;
if (p.promote().get()) {
p.promote()->next = n; // c or t has be removed
} else {
head = n;
}
if (n.get()) {
n->prev = p;
} else {
tail = p;
}
--count;
return true;
}
t = t->next.get();
}
}
return false;
}
bool empty() {
return head == NULL;
}
void clear() {
head.clear();
pending.clear();
count = 0;
}
};
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交