/** * Inserts a link into the list after the given existing link. * * @param list the list to modify * @param after_this_link existing link to insert after, or #NULL to prepend * @param link the link to insert */ void _dbus_list_insert_after_link (DBusList **list, DBusList *after_this_link, DBusList *link) { if (after_this_link == NULL) _dbus_list_prepend_link (list, link); else link_after (list, after_this_link, link); }
//! <b>Effects</b>: Moves the node p n positions towards the beginning of the list. //! //! <b>Throws</b>: Nothing. //! //! <b>Complexity</b>: Linear to the number of moved positions. static void move_forward(const node_ptr &p, std::size_t n) { //Null shift, nothing to do if(!n) return; node_ptr last = NodeTraits::get_previous(p); //size() == 0 or 1, nothing to do if(last == NodeTraits::get_next(p)) return; unlink(p); //Now get the new last node while(n--){ last = NodeTraits::get_previous(last); } link_after(last, p); }
/** * Inserts data into the list after the given existing link. * * @param list the list to modify * @param after_this_link existing link to insert after, or #NULL to prepend * @param data the value to insert * @returns #TRUE on success, #FALSE if memory allocation fails */ dbus_bool_t _dbus_list_insert_after (DBusList **list, DBusList *after_this_link, void *data) { DBusList *link; if (after_this_link == NULL) return _dbus_list_prepend (list, data); else { link = alloc_link (data); if (link == NULL) return FALSE; link_after (list, after_this_link, link); } return TRUE; }
void link_after(T* element, T* after) { link_after(&(element->*LinkMember), &(after->*LinkMember)); }
void link_head(IntrusiveListLink<T>* link) { link_after(link, &sentinel_); }