fujaba/NetworkParser

View on GitHub
src/main/java/de/uniks/networkparser/list/SpeedList.java

Summary

Maintainability
A
25 mins
Test Coverage
package de.uniks.networkparser.list;

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import de.uniks.networkparser.interfaces.BaseItem;

public class SpeedList<V> extends AbstractArray<V> implements List<V>, Iterable<V> {
    public SpeedList() {
        withFlag(SimpleList.ALLOWDUPLICATE);
    }

    @Override
    public BaseItem getNewList(boolean keyValue) {
        return new SpeedList<V>();
    }

    public Iterator<V> iterator() {
        return new Iterator<V>() {
            private int cursor;

            @Override
            public boolean hasNext() {
                return cursor < size;
            }

            @SuppressWarnings("unchecked")
            @Override
            public V next() {
                if (size < MINHASHINGSIZE) {
                    return (V) elements[cursor++];
                }
                return (V) ((Object[]) elements[0])[cursor++];
            }
        };
    }

    @Override
    public boolean contains(Object o) {
        if (size < MINHASHINGSIZE) {
            for (int pos = 0; pos < this.size; pos++) {
                if (o == elements[pos++]) {
                    return true;
                }
            }
            return false;
        }
        return getPosition(o, 0, false) >= 0;
    }

    @Override
    public boolean add(V e) {
        if (size < MINHASHINGSIZE - 10) {
            if (elements == null) {
                elements = new Object[42];
            } else if (size >= elements.length) {
                int newSize = size + size + 5;
                elements = arrayCopy(elements, newSize);
                this.index = 0;
            }
            elements[size] = e;
            this.size++;
            return true;
        }
        return super.add(e);
    }

    @Override
    public boolean remove(Object o) {
        return super.removeByObject(o) >= 0;
    }

    @Override
    public boolean add(Object... values) {
        if (values == null || values.length < 1) {
            return false;
        }
        int newSize = size + values.length;
        grow(newSize);
        for (Object value : values) {
            if (value == null) {
                continue;
            }
            this.addKey(this.size, value, newSize);
        }
        return size > newSize - values.length;
    }

    @Override
    public boolean addAll(Collection<? extends V> c) {
        if (c == null) {
            return false;
        }
        boolean modified = false;
        for (V e : c) {
            if (add(e)) {
                modified = true;
            }
        }
        return modified;
    }

    @Override
    public boolean addAll(int index, Collection<? extends V> values) {
        if (values == null) {
            return false;
        }
        boolean allAdded = true;
        int newSize = size + values.size();
        grow(newSize);
        for (Iterator<? extends V> i = values.iterator(); i.hasNext();) {
            if (addKey(index++, i.next(), newSize) < 0) {
                allAdded = false;
            }
        }
        return allAdded;
    }

    @Override
    public V set(int index, V element) {
        if (index < 0 || index > size) {
            return null;
        }
        setValue(index, element, SMALL_KEY);
        return element;
    }

    @Override
    public void add(int index, V element) {
        int pos = hasKey(element);
        if (pos >= 0) {
            grow(size + 1);
            addKey(index, element, size + 1);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public V remove(int index) {
        if (index < 0 || index > size) {
            return null;
        }
        return (V) removeByIndex(index, SMALL_KEY, this.index);
    }

    @Override
    public ListIterator<V> listIterator() {
        return new SimpleIterator<V>(this);
    }

    @Override
    public ListIterator<V> listIterator(int index) {
        return new SimpleIterator<V>(this, index);
    }

    @SuppressWarnings("unchecked")
    public SpeedList<V> subList(int fromIndex, int toIndex) {
        return (SpeedList<V>) super.subList(fromIndex, toIndex);
    }

    @Override
    public void clear() {
        this.elements = null;
        this.size = 0;
        this.index = 0;
    }
}