genode/ports/src/app/gdb_monitor/append_list.h

111 lines
1.7 KiB
C++

/*
* \brief List which appends new elements at the end
* \author Christian Prochaska
* \date 2011-09-09
*/
/*
* Copyright (C) 2011-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 _APPEND_LIST_H_
#define _APPEND_LIST_H_
/*
* \param LT list element type
*/
template <typename LT>
class Append_list
{
private:
LT *_first;
LT *_last;
public:
class Element
{
protected:
friend class Append_list;
LT *_next;
public:
Element(): _next(0) { }
/**
* Return next element in list
*/
LT *next() const { return _next; }
};
public:
/**
* Constructor
*
* Start with an empty list.
*/
Append_list(): _first(0), _last(0) { }
/**
* Return first list element
*/
LT *first() const { return _first; }
/**
* Append element to list
*/
void append(LT *le)
{
if (_last) {
_last->Element::_next = le;
_last = le;
} else {
_first = _last = le;
}
}
/**
* Remove element from list
*/
void remove(LT *le)
{
if (!_first) return;
/* if specified element is the first of the list */
if (le == _first) {
if (_first == _last)
_first = _last = 0;
else
_first = le->Element::_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->Element::_next = e->Element::_next->Element::_next;
if (le == _last)
_last = e;
}
le->Element::_next = 0;
}
};
#endif /* _APPEND_LIST_H_ */