0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 package org.apache.spark.util.collection.unsafe.sort;
0019
0020 import org.apache.spark.unsafe.Platform;
0021 import org.apache.spark.unsafe.array.LongArray;
0022 import org.apache.spark.util.collection.SortDataFormat;
0023
0024
0025
0026
0027
0028
0029
0030
0031 public final class UnsafeSortDataFormat
0032 extends SortDataFormat<RecordPointerAndKeyPrefix, LongArray> {
0033
0034 private final LongArray buffer;
0035
0036 public UnsafeSortDataFormat(LongArray buffer) {
0037 this.buffer = buffer;
0038 }
0039
0040 @Override
0041 public RecordPointerAndKeyPrefix getKey(LongArray data, int pos) {
0042
0043 throw new UnsupportedOperationException();
0044 }
0045
0046 @Override
0047 public RecordPointerAndKeyPrefix newKey() {
0048 return new RecordPointerAndKeyPrefix();
0049 }
0050
0051 @Override
0052 public RecordPointerAndKeyPrefix getKey(LongArray data, int pos,
0053 RecordPointerAndKeyPrefix reuse) {
0054 reuse.recordPointer = data.get(pos * 2);
0055 reuse.keyPrefix = data.get(pos * 2 + 1);
0056 return reuse;
0057 }
0058
0059 @Override
0060 public void swap(LongArray data, int pos0, int pos1) {
0061 long tempPointer = data.get(pos0 * 2);
0062 long tempKeyPrefix = data.get(pos0 * 2 + 1);
0063 data.set(pos0 * 2, data.get(pos1 * 2));
0064 data.set(pos0 * 2 + 1, data.get(pos1 * 2 + 1));
0065 data.set(pos1 * 2, tempPointer);
0066 data.set(pos1 * 2 + 1, tempKeyPrefix);
0067 }
0068
0069 @Override
0070 public void copyElement(LongArray src, int srcPos, LongArray dst, int dstPos) {
0071 dst.set(dstPos * 2, src.get(srcPos * 2));
0072 dst.set(dstPos * 2 + 1, src.get(srcPos * 2 + 1));
0073 }
0074
0075 @Override
0076 public void copyRange(LongArray src, int srcPos, LongArray dst, int dstPos, int length) {
0077 Platform.copyMemory(
0078 src.getBaseObject(),
0079 src.getBaseOffset() + srcPos * 16L,
0080 dst.getBaseObject(),
0081 dst.getBaseOffset() + dstPos * 16L,
0082 length * 16L);
0083 }
0084
0085 @Override
0086 public LongArray allocate(int length) {
0087 assert (length * 2L <= buffer.size()) :
0088 "the buffer is smaller than required: " + buffer.size() + " < " + (length * 2);
0089 return buffer;
0090 }
0091
0092 }