提交 64b9cd64 authored 作者: Thomas Mueller's avatar Thomas Mueller

The page store did not work when using Retrotranslator.

上级 264212b5
......@@ -17,6 +17,7 @@ import java.sql.Timestamp;
import org.h2.constant.SysProperties;
import org.h2.message.Message;
import org.h2.util.DateTimeUtils;
import org.h2.util.MathUtils;
import org.h2.util.MemoryUtils;
import org.h2.value.Value;
import org.h2.value.ValueArray;
......@@ -473,7 +474,7 @@ public class Data extends DataPage {
writeByte((byte) (DOUBLE_0_1 + x));
} else {
writeByte((byte) type);
writeVarLong(Long.reverse(Double.doubleToLongBits(x)));
writeVarLong(MathUtils.reverse(Double.doubleToLongBits(x)));
}
break;
}
......@@ -483,7 +484,7 @@ public class Data extends DataPage {
writeByte((byte) (FLOAT_0_1 + x));
} else {
writeByte((byte) type);
writeVarInt(Integer.reverse(Float.floatToIntBits(v.getFloat())));
writeVarInt(MathUtils.reverse(Float.floatToIntBits(v.getFloat())));
}
break;
}
......@@ -617,9 +618,9 @@ public class Data extends DataPage {
case DOUBLE_0_1 + 1:
return ValueDouble.get(1);
case Value.DOUBLE:
return ValueDouble.get(Double.longBitsToDouble(Long.reverse(readVarLong())));
return ValueDouble.get(Double.longBitsToDouble(MathUtils.reverse(readVarLong())));
case Value.FLOAT:
return ValueFloat.get(Float.intBitsToFloat(Integer.reverse(readVarInt())));
return ValueFloat.get(Float.intBitsToFloat(MathUtils.reverse(readVarInt())));
case Value.BLOB:
case Value.CLOB: {
int smallLen = readVarInt();
......@@ -712,14 +713,14 @@ public class Data extends DataPage {
if (x == 0.0 || x == 1.0) {
return 1;
}
return 1 + getVarLongLen(Long.reverse(Double.doubleToLongBits(x)));
return 1 + getVarLongLen(MathUtils.reverse(Double.doubleToLongBits(x)));
}
case Value.FLOAT: {
float x = v.getFloat();
if (x == 0.0f || x == 1.0f) {
return 1;
}
return 1 + getVarIntLen(Integer.reverse(Float.floatToIntBits(v.getFloat())));
return 1 + getVarIntLen(MathUtils.reverse(Float.floatToIntBits(v.getFloat())));
}
case Value.STRING: {
String s = v.getString();
......
......@@ -178,4 +178,31 @@ public class MathUtils {
}
}
/**
* Reverse the bits in a 32 bit integer. This code is also available in Java
* 5 using Integer.reverse, however not available yet in Retrotranslator.
* The code was taken from http://www.hackersdelight.org - reverse.c
*
* @param x the original value
* @return the value with reversed bits
*/
public static int reverse(int x) {
x = (x & 0x55555555) << 1 | (x >>> 1) & 0x55555555;
x = (x & 0x33333333) << 2 | (x >>> 2) & 0x33333333;
x = (x & 0x0f0f0f0f) << 4 | (x >>> 4) & 0x0f0f0f0f;
x = (x << 24) | ((x & 0xff00) << 8) | ((x >>> 8) & 0xff00) | (x >>> 24);
return x;
}
/**
* Reverse the bits in a 64 bit long. This code is also available in Java 5
* using Long.reverse, however not available yet in Retrotranslator.
*
* @param x the original value
* @return the value with reversed bits
*/
public static long reverse(long x) {
return (reverse((int) (x >>> 32L)) & 0xffffffffL) ^ (((long) reverse((int) x)) << 32L);
}
}
......@@ -7,7 +7,9 @@
package org.h2.test.unit;
import java.math.BigInteger;
import java.util.Random;
import org.h2.test.TestBase;
import org.h2.util.MathUtils;
/**
* Tests math utility methods.
......@@ -24,9 +26,44 @@ public class TestMathUtils extends TestBase {
}
public void test() {
testReverse();
testFactorial();
}
private void testReverse() {
assertEquals(Integer.reverse(0), MathUtils.reverse(0));
assertEquals(Integer.reverse(Integer.MAX_VALUE), MathUtils.reverse(Integer.MAX_VALUE));
assertEquals(Integer.reverse(Integer.MIN_VALUE), MathUtils.reverse(Integer.MIN_VALUE));
assertEquals(Long.reverse(0), MathUtils.reverse(0L));
assertEquals(Long.reverse(Long.MAX_VALUE), MathUtils.reverse(Long.MAX_VALUE));
assertEquals(Long.reverse(Long.MIN_VALUE), MathUtils.reverse(Long.MIN_VALUE));
for (int i = Integer.MIN_VALUE; i < 0; i += 1019) {
int x = MathUtils.reverse(i);
assertEquals(Integer.reverse(i), x);
}
for (int i = 0; i > 0; i += 1019) {
int x = MathUtils.reverse(i);
assertEquals(Integer.reverse(i), x);
}
for (long i = Long.MIN_VALUE; i < 0; i += 1018764321251L) {
long x = MathUtils.reverse(i);
assertEquals(Long.reverse(i), x);
}
for (long i = 0; i > 0; i += 1018764321251L) {
long x = MathUtils.reverse(i);
assertEquals(Long.reverse(i), x);
}
Random random = new Random(10);
for (int i = 0; i < 1000000; i++) {
long x = random.nextLong();
long r = MathUtils.reverse(x);
assertEquals(Long.reverse(x), r);
int y = random.nextInt();
int s = MathUtils.reverse(y);
assertEquals(Integer.reverse(y), s);
}
}
private void testFactorial() {
try {
factorial(-1);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论