/* * 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.sorted; import javolution.util.internal.table.SubTableImpl; import javolution.util.service.SortedTableService; import javolution.util.service.TableService; /** * A view over a portion of a sorted table. */ public class SubSortedTableImpl<E> extends SubTableImpl<E> implements SortedTableService<E> { private static final long serialVersionUID = 0x600L; // Version. /** Splits the specified table. */ @SuppressWarnings("unchecked") public static <E> SortedTableService<E>[] splitOf(SortedTableService<E> table, int n, boolean updateable) { if (updateable) table = new SharedSortedTableImpl<E>(table); if (n < 1) throw new IllegalArgumentException("Invalid argument n: " + n); SortedTableService<E>[] subTables = new SortedTableService[n]; int minSize = table.size() / n; int start = 0; for (int i = 0; i < n - 1; i++) { subTables[i] = new SubSortedTableImpl<E>(table, start, start + minSize); start += minSize; } subTables[n - 1] = new SubSortedTableImpl<E>(table, start, table.size()); return subTables; } public SubSortedTableImpl(TableService<E> target, int from, int to) { super(target, from, to); } @Override public boolean add(E element) { int i = positionOf(element); add((i < 0) ? -i-1 : i, element); return true; } @Override public boolean addIfAbsent(E element) { int i = positionOf(element); if (i >= 0) return false; add(-i-1, element); return true; } @SuppressWarnings("unchecked") @Override public int indexOf(Object o) { int i = positionOf((E)o); return (i >= 0) ? i : -1; } @SuppressWarnings("unchecked") @Override public int lastIndexOf(Object o) { int i = positionOf((E) o); if (i < 0) return -1; while ((++i < size()) && comparator().equal((E) o, get(i))) { } return --i; } @Override public int positionOf(E element) { int i = target().positionOf(element); if (i >= 0) { // Actual index. if (i < fromIndex) return -1; if (i >= toIndex) return -size()-1; return i - fromIndex; } else { // Would be index. i = -i - 1; if (i < fromIndex) return -1; if (i >= toIndex) return -size()-1; return -(i - fromIndex) - 1; } } @Override public SortedTableService<E>[] split(int n, boolean updateable) { return SubSortedTableImpl.splitOf(this, n, updateable); // Sub-views over this. } @Override protected SortedTableService<E> target() { return (SortedTableService<E>) super.target(); } }