mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-25 19:32:54 +00:00
101 lines
2.4 KiB
C++
101 lines
2.4 KiB
C++
/* This file is part of KDevelop
|
|
Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License version 2 as published by the Free Software Foundation.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef LISTNODE_H
|
|
#define LISTNODE_H
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <memorypool.h>
|
|
|
|
/**
|
|
* @brief An intrusive list of AST nodes.
|
|
* @note ListNodes inside AST nodes are NOT guaranteed to start from the beginning, call toFront.
|
|
*/
|
|
template <typename Tp>
|
|
class ListNode
|
|
{
|
|
public:
|
|
|
|
Tp element;
|
|
int index;
|
|
mutable const ListNode<Tp> *next;
|
|
|
|
static ListNode *create(const Tp &element, MemoryPool *p)
|
|
{
|
|
ListNode<Tp> *node = p->allocate< ListNode<Tp> >();
|
|
node->element = element;
|
|
node->index = 0;
|
|
node->next = node;
|
|
|
|
return node;
|
|
}
|
|
|
|
static ListNode *create(const ListNode *n1, const Tp &element, MemoryPool *p)
|
|
{
|
|
ListNode<Tp> *n2 = ListNode::create(element, p);
|
|
|
|
n2->index = n1->index + 1;
|
|
n2->next = n1->next;
|
|
n1->next = n2;
|
|
|
|
return n2;
|
|
}
|
|
|
|
inline const ListNode<Tp> *at(int index) const
|
|
{
|
|
const ListNode<Tp> *node = this;
|
|
while (index != node->index)
|
|
node = node->next;
|
|
|
|
return node;
|
|
}
|
|
|
|
inline bool hasNext() const
|
|
{ return ( next && index < next->index ); }
|
|
|
|
inline int count() const
|
|
{ return 1 + toBack()->index; }
|
|
|
|
inline const ListNode<Tp> *toFront() const
|
|
{ return toBack()->next; }
|
|
|
|
inline const ListNode<Tp> *toBack() const
|
|
{
|
|
const ListNode<Tp> *node = this;
|
|
while (node->hasNext())
|
|
node = node->next;
|
|
|
|
return node;
|
|
}
|
|
};
|
|
|
|
template <class Tp,class pool>
|
|
inline const ListNode<Tp> *snoc(const ListNode<Tp> *list,
|
|
const Tp &element, pool *p)
|
|
{
|
|
|
|
if (!list)
|
|
return ListNode<Tp>::create(element, p);
|
|
|
|
return ListNode<Tp>::create(list->toBack(), element, p);
|
|
}
|
|
|
|
#endif // FASTLIST_H
|
|
|
|
|