summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2018-07-06 13:47:14 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2018-07-06 13:47:14 +0200
commit80cde5a9822b7beb509df1904b11c30be4f22cac (patch)
tree7a83786da8359cfaba71df29f3f9cdeee9965af9
parent21405a878478592281e077981c2d155b2c5af36f (diff)
downloadgdx-boardgame-80cde5a9822b7beb509df1904b11c30be4f22cac.zip
gdx-boardgame-80cde5a9822b7beb509df1904b11c30be4f22cac.tar.gz
add engine/util : Collection interface and implementations
-rw-r--r--core/src/ch/asynk/zproject/engine/util/Collection.java28
-rw-r--r--core/src/ch/asynk/zproject/engine/util/IterableArray.java143
-rw-r--r--core/src/ch/asynk/zproject/engine/util/IterableQueue.java19
-rw-r--r--core/src/ch/asynk/zproject/engine/util/IterableSet.java16
-rw-r--r--core/src/ch/asynk/zproject/engine/util/IterableStack.java26
5 files changed, 232 insertions, 0 deletions
diff --git a/core/src/ch/asynk/zproject/engine/util/Collection.java b/core/src/ch/asynk/zproject/engine/util/Collection.java
new file mode 100644
index 0000000..001ea76
--- /dev/null
+++ b/core/src/ch/asynk/zproject/engine/util/Collection.java
@@ -0,0 +1,28 @@
+package ch.asynk.zproject.engine.util;
+
+import java.util.Iterator;
+
+public interface Collection<E> extends Iterator, Iterable<E>
+{
+ public int size();
+
+ public boolean isEmpty();
+
+ public void clear();
+
+ public void ensureCapacity(int c);
+
+ public boolean contains(E e);
+
+ public E get(int idx);
+
+ public int indexOf(E e);
+
+ public boolean add(E e);
+
+ public boolean insert(E e, int idx);
+
+ public E remove(int idx);
+
+ public boolean remove(E e);
+}
diff --git a/core/src/ch/asynk/zproject/engine/util/IterableArray.java b/core/src/ch/asynk/zproject/engine/util/IterableArray.java
new file mode 100644
index 0000000..b6b0eee
--- /dev/null
+++ b/core/src/ch/asynk/zproject/engine/util/IterableArray.java
@@ -0,0 +1,143 @@
+package ch.asynk.zproject.engine.util;
+
+import java.util.Arrays;
+import java.util.Iterator;
+
+public class IterableArray<E> implements Collection<E>
+{
+ private int idx;
+ private int s;
+ private int c;
+ transient E[] data;
+
+ @SuppressWarnings("unchecked")
+ public IterableArray(int capacity)
+ {
+ this.s = 0;
+ this.c = capacity;
+ this.data = (E[]) new Object[c];
+ }
+
+ @Override public int size()
+ {
+ return s;
+ }
+
+ @Override public boolean isEmpty()
+ {
+ return (s == 0);
+ }
+
+ @Override public void clear()
+ {
+ for (int i = 0; i < s; i++)
+ data[i] = null;
+ s = 0;
+ }
+
+ @Override public void ensureCapacity(int min)
+ {
+ if (c > min) return;
+ c += (c >> 1);
+ if (c < min)
+ c = min;
+ data = Arrays.copyOf(data, c);
+ }
+
+ @Override public boolean contains(E e)
+ {
+ if (e == null) {
+ for (int i = 0; i < s; i++) {
+ if (data[i] == null)
+ return true;
+ }
+ } else {
+ for (int i = 0; i < s; i++) {
+ if (e.equals(data[i]))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override public E get(int i)
+ {
+ return data[i];
+ }
+
+ @Override public int indexOf(E e)
+ {
+ for (int i = 0; i < data.length; i++) {
+ if (data[i] != null && data[i].equals(e))
+ return i;
+ }
+ return -1;
+ }
+
+ @Override public boolean add(E e)
+ {
+ ensureCapacity(s + 1);
+ data[s] = e;
+ s += 1;
+ return true;
+ }
+
+ @Override public boolean insert(E e, int idx)
+ {
+ ensureCapacity(s + 1);
+ System.arraycopy(data, idx, data, idx+1, (s - idx));
+ data[idx] = e;
+ s += 1;
+ return true;
+ }
+
+ @Override public E remove(int i)
+ {
+ E e = data[i];
+ int m = (s - i - 1);
+ if (m > 0)
+ System.arraycopy(data, i+1, data, i, m);
+ data[--s] = null;
+
+ return e;
+ }
+
+ @Override public boolean remove(E e)
+ {
+ for (int i = 0; i < s; i++) {
+ if (e.equals(data[i])) {
+ int m = (s - i - 1);
+ if (m > 0)
+ System.arraycopy(data, i+1, data, i, m);
+ data[--s] = null;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override public Iterator<E> iterator()
+ {
+ this.idx = 0;
+ return (Iterator<E>) this;
+ }
+
+ @Override public boolean hasNext()
+ {
+ return (idx < s);
+ }
+
+ @Override public E next()
+ {
+ E e = get(idx);
+ idx += 1;
+ return e;
+ }
+
+ @Override public void remove()
+ {
+ idx -= 1;
+ remove(idx);
+ }
+}
diff --git a/core/src/ch/asynk/zproject/engine/util/IterableQueue.java b/core/src/ch/asynk/zproject/engine/util/IterableQueue.java
new file mode 100644
index 0000000..bbf05bf
--- /dev/null
+++ b/core/src/ch/asynk/zproject/engine/util/IterableQueue.java
@@ -0,0 +1,19 @@
+package ch.asynk.zproject.engine.util;
+
+public class IterableQueue<E> extends IterableArray<E>
+{
+ public IterableQueue(int n)
+ {
+ super(n);
+ }
+
+ public void enqueue(E e)
+ {
+ add(e);
+ }
+
+ public E dequeue()
+ {
+ return remove(0);
+ }
+}
diff --git a/core/src/ch/asynk/zproject/engine/util/IterableSet.java b/core/src/ch/asynk/zproject/engine/util/IterableSet.java
new file mode 100644
index 0000000..37ae573
--- /dev/null
+++ b/core/src/ch/asynk/zproject/engine/util/IterableSet.java
@@ -0,0 +1,16 @@
+package ch.asynk.zproject.engine.util;
+
+public class IterableSet<E> extends IterableArray<E>
+{
+ public IterableSet(int n)
+ {
+ super(n);
+ }
+
+ @Override public boolean add(E e)
+ {
+ if (contains(e)) return false;
+ super.add(e);
+ return true;
+ }
+}
diff --git a/core/src/ch/asynk/zproject/engine/util/IterableStack.java b/core/src/ch/asynk/zproject/engine/util/IterableStack.java
new file mode 100644
index 0000000..7e7edb0
--- /dev/null
+++ b/core/src/ch/asynk/zproject/engine/util/IterableStack.java
@@ -0,0 +1,26 @@
+package ch.asynk.zproject.engine.util;
+
+public class IterableStack<E> extends IterableArray<E>
+{
+ public IterableStack(int n)
+ {
+ super(n);
+ }
+
+ public void push(E e)
+ {
+ add(e);
+ }
+
+ public E pop()
+ {
+ if (size() <= 0) return null;
+ return remove(size() - 1);
+ }
+
+ public E getTop()
+ {
+ if (size() <= 0) return null;
+ return get(size() - 1);
+ }
+}