From 9732e0c744e45a67094fc6ce08bdadb1f9a08d4a Mon Sep 17 00:00:00 2001 From: Hugo Lima Date: Mon, 17 Aug 2009 17:32:08 -0300 Subject: The genesis... --- parser/list.h | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 parser/list.h (limited to 'parser/list.h') diff --git a/parser/list.h b/parser/list.h new file mode 100644 index 000000000..64aef452f --- /dev/null +++ b/parser/list.h @@ -0,0 +1,100 @@ +/* + * This file is part of the API Extractor project. + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2002-2005 Roberto Raggi + * + * Contact: PySide team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + + +#ifndef FASTLIST_H +#define FASTLIST_H + +#include "smallobject.h" + +template +struct ListNode { + Tp element; + int index; + mutable const ListNode *next; + + static ListNode *create(const Tp &element, pool *p) { + ListNode *node = new(p->allocate(sizeof(ListNode))) ListNode(); + node->element = element; + node->index = 0; + node->next = node; + + return node; + } + + static ListNode *create(const ListNode *n1, const Tp &element, pool *p) { + ListNode *n2 = ListNode::create(element, p); + + n2->index = n1->index + 1; + n2->next = n1->next; + n1->next = n2; + + return n2; + } + + inline ListNode() { } + + inline const ListNode *at(int index) const { + const ListNode *node = this; + while (index != node->index) + node = node->next; + + return node; + } + + inline bool hasNext() const { + return index < next->index; + } + + inline int count() const { + return 1 + toBack()->index; + } + + inline const ListNode *toFront() const { + return toBack()->next; + } + + inline const ListNode *toBack() const { + const ListNode *node = this; + while (node->hasNext()) + node = node->next; + + return node; + } +}; + +template +inline const ListNode *snoc(const ListNode *list, + const Tp &element, pool *p) +{ + if (!list) + return ListNode::create(element, p); + + return ListNode::create(list->toBack(), element, p); +} + +#endif // FASTLIST_H + +// kate: space-indent on; indent-width 2; replace-tabs on; + -- cgit v1.2.3