/* * Copyright (c) 2008, Jan Stender, Bjoern Kolbeck, Mikael Hoegqvist, * Felix Hupfeld, Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package de.mxro.thrd.babudb05.index; import de.mxro.thrd.babudb05.api.index.ByteRangeComparator; public class DefaultByteRangeComparator implements ByteRangeComparator { private static DefaultByteRangeComparator instance; @Override public byte[][] prefixToRange(byte[] prefix, boolean ascending) { if (prefix == null) return new byte[][] { null, null }; byte[] bytes = new byte[prefix.length]; System.arraycopy(prefix, 0, bytes, 0, prefix.length); for (int i = bytes.length - 1; i >= 0; i--) { if (i == 0 && bytes[i] == Byte.MAX_VALUE) return null; bytes[i]++; if (bytes[i] != Byte.MIN_VALUE) break; } return ascending ? new byte[][] { prefix, bytes } : new byte[][] { bytes, prefix }; } @Override public int compare(ByteRange rng, byte[] buf) { int n = rng.getStartOffset() + Math.min(rng.getSize(), buf.length); int j = 0; for (int i = rng.getStartOffset(); i < n; i++, j++) { assert (i < rng.getEndOffset()) : "i == " + i + ", endOffset == " + rng.getEndOffset(); byte v1 = rng.getBuf().get(i); byte v2 = buf[j]; if (v1 == v2) continue; if (v1 < v2) return -1; return 1; } return rng.getSize() - buf.length; } @Override public int compare(byte[] buf1, byte[] buf2) { int n = Math.min(buf1.length, buf2.length); for (int i = 0, j = 0; i < n; i++, j++) { byte v1 = buf1[i]; byte v2 = buf2[j]; if (v1 == v2) continue; if (v1 < v2) return -1; return 1; } return buf1.length - buf2.length; } public static DefaultByteRangeComparator getInstance() { if (instance == null) instance = new DefaultByteRangeComparator(); return instance; } }