/* * \brief Simple connected list * \author Norman Feske * \date 2006-08-02 */ /* * Copyright (C) 2006-2013 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. */ #ifndef _LIST_H_ #define _LIST_H_ /* * \param LT list element type */ template class List { private: LT *_first; public: class Element { protected: friend class List; LT mutable *_next; public: Element(): _next(0) { } /** * Return next element in list */ LT *next() const { return _next; } }; public: /** * Constructor * * On construction, start with an empty list. */ List(): _first(0) { } /** * Return first list element */ LT *first() { return _first; } LT const *first() const { return _first; } /** * Insert element into list * * \param le list element to insert * \param at target position (preceding list element) or * 0 to insert element at the beginning of the list */ void insert(LT const *le, LT const *at = 0) { /* insert element at the beginning of the list */ if (at == 0) { le->_next = _first; _first = const_cast(le); } else { le->_next = at->_next; at->_next = const_cast(le); } } /** * Remove element from list */ void remove(LT const *le) { if (!_first) return; /* if specified element is the first of the list */ if (le == _first) _first = le->_next; else { /* search specified element in the list */ LT *e = _first; while (e->_next && (e->_next != le)) e = e->_next; /* element is not member of the list */ if (!e->_next) return; /* e->_next is the element to remove, skip it in list */ e->_next = e->_next->_next; } le->_next = 0; } }; #endif