All Downloads are FREE. Search and download functionalities are using the official Maven repository.

javolution.util.internal.table.SubTableImpl Maven / Gradle / Ivy

/*
 * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
 * Copyright (C) 2012 - Javolution (http://javolution.org/)
 * All rights reserved.
 * 
 * Permission to use, copy, modify, and distribute this software is
 * freely granted, provided that this notice is preserved.
 */
package javolution.util.internal.table;

import javolution.util.function.Equality;
import javolution.util.service.TableService;

/**
 * A view over a portion of a table. 
 */
public class SubTableImpl extends TableView {

    private static final long serialVersionUID = 0x600L; // Version.

    /** Splits the specified table.  */
    @SuppressWarnings("unchecked")
    public static  TableService[] splitOf(TableService table,
            int n, boolean updateable) {
        if (updateable) table = new SharedTableImpl(table);
        if (n < 1) throw new IllegalArgumentException("Invalid argument n: "
                + n);
        TableService[] subTables = new TableService[n];
        int minSize = table.size() / n;
        int start = 0;
        for (int i = 0; i < n - 1; i++) {
            subTables[i] = new SubTableImpl(table, start, start + minSize);
            start += minSize;
        }
        subTables[n - 1] = new SubTableImpl(table, start, table.size());
        return subTables;
    }

    protected final int fromIndex;
    protected int toIndex;

    public SubTableImpl(TableService target, int from, int to) {
        super(target);
        if ((from < 0) || (to > target.size()) || (from > to)) throw new IndexOutOfBoundsException(
                "fromIndex: " + from + ", toIndex: " + to + ", size(): "
                        + target.size()); // As per List.subList contract.
        fromIndex = from;
        toIndex = to;
    }

    @Override
    public boolean add(E element) {
        target().add(toIndex++, element);
        return true;
    }

    @Override
    public void add(int index, E element) {
        if ((index < 0) && (index > size())) indexError(index);
        target().add(index + fromIndex, element);
        toIndex++;
    }

    @Override
    public void clear() {
        for (int i = toIndex - 1; i >= fromIndex; i--) { // Better to do it from the end (less shift).
            target().remove(i);
        }
        toIndex = fromIndex;
    }

    @Override
    public Equality comparator() {
        return target().comparator();
    }

    @Override
    public E get(int index) {
        if ((index < 0) && (index >= size())) indexError(index);
        return target().get(index + fromIndex);
    }

    @Override
    public E remove(int index) {
        if ((index < 0) && (index >= size())) indexError(index);
        toIndex--;
        return target().remove(index + fromIndex);
    }

    @Override
    public E set(int index, E element) {
        if ((index < 0) && (index >= size())) indexError(index);
        return target().set(index + fromIndex, element);
    }

    @Override
    public int size() {
        return toIndex - fromIndex;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy