Int array abstraction able to support more than 2B values. This implementation slices data into fixed-sized blocks of configurable length.
| 31 | * configurable length. |
| 32 | */ |
| 33 | final class BigIntArray extends AbstractBigArray implements IntArray { |
| 34 | |
| 35 | private static final BigIntArray ESTIMATOR = new BigIntArray(0, BigArrays.NON_RECYCLING_INSTANCE, false); |
| 36 | |
| 37 | private int[][] pages; |
| 38 | |
| 39 | /** Constructor. */ |
| 40 | BigIntArray(long size, BigArrays bigArrays, boolean clearOnResize) { |
| 41 | super(INT_PAGE_SIZE, bigArrays, clearOnResize); |
| 42 | this.size = size; |
| 43 | pages = new int[numPages(size)][]; |
| 44 | for (int i = 0; i < pages.length; ++i) { |
| 45 | pages[i] = newIntPage(i); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | @Override |
| 50 | public int get(long index) { |
| 51 | final int pageIndex = pageIndex(index); |
| 52 | final int indexInPage = indexInPage(index); |
| 53 | return pages[pageIndex][indexInPage]; |
| 54 | } |
| 55 | |
| 56 | @Override |
| 57 | public int set(long index, int value) { |
| 58 | final int pageIndex = pageIndex(index); |
| 59 | final int indexInPage = indexInPage(index); |
| 60 | final int[] page = pages[pageIndex]; |
| 61 | final int ret = page[indexInPage]; |
| 62 | page[indexInPage] = value; |
| 63 | return ret; |
| 64 | } |
| 65 | |
| 66 | @Override |
| 67 | public int increment(long index, int inc) { |
| 68 | final int pageIndex = pageIndex(index); |
| 69 | final int indexInPage = indexInPage(index); |
| 70 | return pages[pageIndex][indexInPage] += inc; |
| 71 | } |
| 72 | |
| 73 | @Override |
| 74 | public void fill(long fromIndex, long toIndex, int value) { |
| 75 | if (fromIndex > toIndex) { |
| 76 | throw new IllegalArgumentException(); |
| 77 | } |
| 78 | final int fromPage = pageIndex(fromIndex); |
| 79 | final int toPage = pageIndex(toIndex - 1); |
| 80 | if (fromPage == toPage) { |
| 81 | Arrays.fill(pages[fromPage], indexInPage(fromIndex), indexInPage(toIndex - 1) + 1, value); |
| 82 | } else { |
| 83 | Arrays.fill(pages[fromPage], indexInPage(fromIndex), pages[fromPage].length, value); |
| 84 | for (int i = fromPage + 1; i < toPage; ++i) { |
| 85 | Arrays.fill(pages[i], value); |
| 86 | } |
| 87 | Arrays.fill(pages[toPage], 0, indexInPage(toIndex - 1) + 1, value); |
| 88 | } |
| 89 | } |
| 90 |
nothing calls this directly
no outgoing calls
no test coverage detected