From 6dddf614dd0f168cbb5f430c2caa26671be83e44 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 7 Feb 2014 17:15:18 +0100 Subject: [PATCH] add Inlist iterator + LList --- vtm/src/org/oscim/utils/pool/Inlist.java | 54 ++++++++++++++++++++++++ vtm/src/org/oscim/utils/pool/LList.java | 34 ++++++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/vtm/src/org/oscim/utils/pool/Inlist.java b/vtm/src/org/oscim/utils/pool/Inlist.java index dd2096cb..d88466e4 100644 --- a/vtm/src/org/oscim/utils/pool/Inlist.java +++ b/vtm/src/org/oscim/utils/pool/Inlist.java @@ -16,6 +16,8 @@ */ package org.oscim.utils.pool; +import java.util.Iterator; + import javax.annotation.CheckReturnValue; /** @@ -27,6 +29,58 @@ import javax.annotation.CheckReturnValue; * are *REALLY* sure about it. Better do not use it! :) */ public class Inlist> { + /** UNTESTED */ + public static class List> implements Iterable { + T head; + T cur; + Iterator mIterator = new Iterator() { + + @Override + public boolean hasNext() { + return cur != null; + } + + @Override + public T next() { + if (cur == null) + throw new IllegalStateException(); + + T tmp = cur; + cur = cur.next; + return tmp; + } + + @Override + public void remove() { + T tmp = cur.next; + head = Inlist.remove(head, cur); + cur = tmp; + } + }; + + @Override + public Iterator iterator() { + cur = head; + return mIterator; + } + + public void push(T it) { + it.next = head; + head = it; + } + + public void remove(T it) { + cur = null; + head = Inlist.remove(head, it); + } + + public T clear() { + T ret = head; + head = null; + cur = null; + return ret; + } + } public T next; diff --git a/vtm/src/org/oscim/utils/pool/LList.java b/vtm/src/org/oscim/utils/pool/LList.java index bc619d66..510a1e2e 100644 --- a/vtm/src/org/oscim/utils/pool/LList.java +++ b/vtm/src/org/oscim/utils/pool/LList.java @@ -17,5 +17,37 @@ package org.oscim.utils.pool; public class LList extends Inlist> { - T data; + public LList(T l) { + data = l; + } + + public final T data; + + public static , T> LList find(LList list, T item) { + for (LList l = list; l != null; l = l.next) + if (l.data == item) + return l; + + return null; + } + + public static , T> LList remove(LList list, T item) { + if (list.data == item) + return list.next; + + LList prev = list; + for (LList l = list.next; l != null; l = l.next) + if (l.data == item) { + prev.next = l.next; + break; + } + + return list; + } + + public static > LList push(LList list, T item) { + item.next = list; + return item; + } + }