mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-26 03:42:55 +00:00
102 lines
2.4 KiB
C
102 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
|
||
|
|
||
|
|