提交 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; ...@@ -17,6 +17,7 @@ import java.sql.Timestamp;
import org.h2.constant.SysProperties; import org.h2.constant.SysProperties;
import org.h2.message.Message; import org.h2.message.Message;
import org.h2.util.DateTimeUtils; import org.h2.util.DateTimeUtils;
import org.h2.util.MathUtils;
import org.h2.util.MemoryUtils; import org.h2.util.MemoryUtils;
import org.h2.value.Value; import org.h2.value.Value;
import org.h2.value.ValueArray; import org.h2.value.ValueArray;
...@@ -473,7 +474,7 @@ public class Data extends DataPage { ...@@ -473,7 +474,7 @@ public class Data extends DataPage {
writeByte((byte) (DOUBLE_0_1 + x)); writeByte((byte) (DOUBLE_0_1 + x));
} else { } else {
writeByte((byte) type); writeByte((byte) type);
writeVarLong(Long.reverse(Double.doubleToLongBits(x))); writeVarLong(MathUtils.reverse(Double.doubleToLongBits(x)));
} }
break; break;
} }
...@@ -483,7 +484,7 @@ public class Data extends DataPage { ...@@ -483,7 +484,7 @@ public class Data extends DataPage {
writeByte((byte) (FLOAT_0_1 + x)); writeByte((byte) (FLOAT_0_1 + x));
} else { } else {
writeByte((byte) type); writeByte((byte) type);
writeVarInt(Integer.reverse(Float.floatToIntBits(v.getFloat()))); writeVarInt(MathUtils.reverse(Float.floatToIntBits(v.getFloat())));
} }
break; break;
} }
...@@ -617,9 +618,9 @@ public class Data extends DataPage { ...@@ -617,9 +618,9 @@ public class Data extends DataPage {
case DOUBLE_0_1 + 1: case DOUBLE_0_1 + 1:
return ValueDouble.get(1); return ValueDouble.get(1);
case Value.DOUBLE: case Value.DOUBLE:
return ValueDouble.get(Double.longBitsToDouble(Long.reverse(readVarLong()))); return ValueDouble.get(Double.longBitsToDouble(MathUtils.reverse(readVarLong())));
case Value.FLOAT: case Value.FLOAT:
return ValueFloat.get(Float.intBitsToFloat(Integer.reverse(readVarInt()))); return ValueFloat.get(Float.intBitsToFloat(MathUtils.reverse(readVarInt())));
case Value.BLOB: case Value.BLOB:
case Value.CLOB: { case Value.CLOB: {
int smallLen = readVarInt(); int smallLen = readVarInt();
...@@ -712,14 +713,14 @@ public class Data extends DataPage { ...@@ -712,14 +713,14 @@ public class Data extends DataPage {
if (x == 0.0 || x == 1.0) { if (x == 0.0 || x == 1.0) {
return 1; return 1;
} }
return 1 + getVarLongLen(Long.reverse(Double.doubleToLongBits(x))); return 1 + getVarLongLen(MathUtils.reverse(Double.doubleToLongBits(x)));
} }
case Value.FLOAT: { case Value.FLOAT: {
float x = v.getFloat(); float x = v.getFloat();
if (x == 0.0f || x == 1.0f) { if (x == 0.0f || x == 1.0f) {
return 1; return 1;
} }
return 1 + getVarIntLen(Integer.reverse(Float.floatToIntBits(v.getFloat()))); return 1 + getVarIntLen(MathUtils.reverse(Float.floatToIntBits(v.getFloat())));
} }
case Value.STRING: { case Value.STRING: {
String s = v.getString(); String s = v.getString();
......
...@@ -178,4 +178,31 @@ public class MathUtils { ...@@ -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 @@ ...@@ -7,7 +7,9 @@
package org.h2.test.unit; package org.h2.test.unit;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Random;
import org.h2.test.TestBase; import org.h2.test.TestBase;
import org.h2.util.MathUtils;
/** /**
* Tests math utility methods. * Tests math utility methods.
...@@ -24,9 +26,44 @@ public class TestMathUtils extends TestBase { ...@@ -24,9 +26,44 @@ public class TestMathUtils extends TestBase {
} }
public void test() { public void test() {
testReverse();
testFactorial(); 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() { private void testFactorial() {
try { try {
factorial(-1); factorial(-1);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论