/* Return the +index+ numbered element from the beginning. */ Object* List::locate(STATE, size_t index) { ListNode* cur = first_; while(index > 0) { if(cur->nil_p()) return Qnil; cur = cur->next(); index--; } if(cur->nil_p()) return Qnil; return cur->object(); }
/* Search the List for +obj+ and remove all instances of it. * * Returns the number of elements removed. */ size_t List::remove(STATE, const Object* obj) { if(empty_p()) return 0; size_t deleted = 0, counted = 0; ListNode* node = first_; ListNode* lst = nil<ListNode>(); ListNode* nxt = nil<ListNode>(); while(!node->nil_p()) { nxt = node->next(); if(node->object() == obj) { deleted++; if(lst->nil_p()) { first(state, nxt); } else { lst->next(state, nxt); } if(last_ == node) { last(state, lst); } lst = nil<ListNode>(); } else { counted++; lst = node; } node = nxt; } count(state, Integer::from(state, counted)); return deleted; }