diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java index 8482ae791..db2acbc35 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java @@ -247,5 +247,14 @@ public interface ChronicleMap extends ConcurrentMap, ChronicleHash { */ void putAll(File fromFile) throws IOException; + /** + * @return a new empty instance based on the Value type + */ + V newValueInstance(); + + /** + * @return a new empty instance based on the Key type + */ + K newKeyInstance(); } diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index eb6ed4dee..21e2b5884 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -69,26 +69,8 @@ public final class ChronicleMapBuilder implements ChronicleMapBuilderI(builder); } - // todo - work in progress this will be changed me not today, so don't refactor this ! - public static T newInstance(Class interfaceClass, boolean isKey) { - if (interfaceClass.isEnum()) - return isKey ? DataValueClasses.newDirectReference(interfaceClass) : DataValueClasses - .newDirectInstance(interfaceClass); - - else if (!offHeapReference(interfaceClass) && !interfaceClass.isInterface() && - !builtInType(interfaceClass)) { - - // if (()) - // interfaceClass = DataValueClasses.directClassFor(interfaceClass); - return DataValueClasses.newInstance(interfaceClass); - - } - return DataValueClasses.newDirectInstance(interfaceClass); - - } - static boolean builtInType(Class clazz) { return clazz.getClassLoader() == Class.class.getClassLoader(); } @@ -97,7 +79,7 @@ public final class ChronicleMapBuilder implements ChronicleMapBuilderI implements ChronicleMap, Closeable, Clon throw new UnsupportedOperationException(); } + @Override + public V newValueInstance() { + return VanillaChronicleMap.newInstance(vClass, false); + } + + @Override + public K newKeyInstance() { + return VanillaChronicleMap.newInstance(kClass, true); + } + private ExecutorService lazyExecutorService() { if (executorService == null) { synchronized (this) { diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index 2864f578f..3c3f538e9 100755 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -37,6 +37,7 @@ import net.openhft.lang.collection.SingleThreadedDirectBitSet; import net.openhft.lang.io.*; import net.openhft.lang.io.serialization.JDKObjectSerializer; import net.openhft.lang.io.serialization.impl.VanillaBytesMarshallerFactory; +import net.openhft.lang.model.DataValueClasses; import net.openhft.lang.threadlocal.Provider; import net.openhft.lang.threadlocal.StatefulCopyable; import net.openhft.lang.threadlocal.ThreadLocalCopies; @@ -58,6 +59,8 @@ import static java.lang.Math.max; import static java.lang.Thread.currentThread; import static java.nio.ByteBuffer.allocateDirect; import static net.openhft.chronicle.map.Asserts.assertNotNull; +import static net.openhft.chronicle.map.ChronicleMapBuilder.builtInType; +import static net.openhft.chronicle.map.ChronicleMapBuilder.offHeapReference; import static net.openhft.lang.MemoryUnit.*; class VanillaChronicleMap, @@ -559,7 +562,7 @@ class VanillaChronicleMap, } @Override - public V putMapped(K key, @NotNull UnaryOperator unaryOperator) { + public V putMapped(K key, @NotNull UnaryOperator unaryOperator) { final V using = (vClass.equals(CharSequence.class)) ? (V) new StringBuilder() : null; @@ -616,6 +619,36 @@ class VanillaChronicleMap, } } + @Override + public V newValueInstance() { + return newInstance(vClass, false); + } + + @Override + public K newKeyInstance() { + return newInstance(kClass, true); + } + + + static T newInstance(Class interfaceClass, boolean isKey) { + + + if (interfaceClass.isEnum()) + return isKey ? DataValueClasses.newDirectReference(interfaceClass) : DataValueClasses + .newDirectInstance(interfaceClass); + + else if (!offHeapReference(interfaceClass) && !interfaceClass.isInterface() && + !builtInType(interfaceClass)) { + + // if (()) + // interfaceClass = DataValueClasses.directClassFor(interfaceClass); + return DataValueClasses.newInstance(interfaceClass); + + } + return DataValueClasses.newDirectInstance(interfaceClass); + + } + private XStreamConverter xStreamConverter; /** diff --git a/src/test/java/net/openhft/chronicle/map/CHMUseCasesTest.java b/src/test/java/net/openhft/chronicle/map/CHMUseCasesTest.java index 616357008..4c8b3ddf3 100644 --- a/src/test/java/net/openhft/chronicle/map/CHMUseCasesTest.java +++ b/src/test/java/net/openhft/chronicle/map/CHMUseCasesTest.java @@ -156,10 +156,10 @@ public class CHMUseCasesTest { .of(StringValue.class, StringValue.class) .checkSerializedValues() // for testing purposes only .create()) { - StringValue key1 = ChronicleMapBuilder.newInstance(StringValue.class, true); - StringValue key2 = ChronicleMapBuilder.newInstance(StringValue.class, true); - StringValue value1 = ChronicleMapBuilder.newInstance(StringValue.class, false); - StringValue value2 = ChronicleMapBuilder.newInstance(StringValue.class, false); + StringValue key1 = map.newKeyInstance(); + StringValue key2 = map.newKeyInstance(); + StringValue value1 = map.newValueInstance(); + StringValue value2 = map.newValueInstance(); key1.setValue(new StringBuilder("1")); value1.setValue("11"); @@ -598,10 +598,15 @@ public class CHMUseCasesTest { .disableOversizedEntries() // disabled for testing purposes only. .entrySize(8) .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue value1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue value2 = ChronicleMapBuilder.newInstance(IntValue.class, false); + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + IntValue value1 = map.newValueInstance(); + IntValue value2 = map.newValueInstance(); + + + + + key1.setValue(1); value1.setValue(11); @@ -680,10 +685,13 @@ public class CHMUseCasesTest { .disableOversizedEntries() // disabled for testing purposes only. .entrySize(8) .create()) { - UnsignedIntValue key1 = ChronicleMapBuilder.newInstance(UnsignedIntValue.class, true); - UnsignedIntValue key2 = ChronicleMapBuilder.newInstance(UnsignedIntValue.class, true); - UnsignedIntValue value1 = ChronicleMapBuilder.newInstance(UnsignedIntValue.class, false); - UnsignedIntValue value2 = ChronicleMapBuilder.newInstance(UnsignedIntValue.class, false); + + + + UnsignedIntValue key1 = map.newKeyInstance(); + UnsignedIntValue key2 = map.newKeyInstance(); + UnsignedIntValue value1 = map.newValueInstance(); + UnsignedIntValue value2 = map.newValueInstance(); key1.setValue(1); value1.setValue(11); @@ -762,10 +770,10 @@ public class CHMUseCasesTest { .disableOversizedEntries() // disabled for testing purposes only. .entrySize(6) .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - ShortValue value1 = ChronicleMapBuilder.newInstance(ShortValue.class, false); - ShortValue value2 = ChronicleMapBuilder.newInstance(ShortValue.class, false); + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + ShortValue value1 = map.newValueInstance(); + ShortValue value2 = map.newValueInstance(); key1.setValue(1); value1.setValue((short) 11); @@ -844,10 +852,11 @@ public class CHMUseCasesTest { .entrySize(6) .disableOversizedEntries() // disabled for testing purposes only. .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - UnsignedShortValue value1 = ChronicleMapBuilder.newInstance(UnsignedShortValue.class, false); - UnsignedShortValue value2 = ChronicleMapBuilder.newInstance(UnsignedShortValue.class, false); + + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + UnsignedShortValue value1 = map.newValueInstance(); + UnsignedShortValue value2 = map.newValueInstance(); key1.setValue(1); value1.setValue(11); @@ -926,10 +935,11 @@ public class CHMUseCasesTest { .disableOversizedEntries() // disabled for testing purposes only. .entrySize(6) .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - CharValue value1 = ChronicleMapBuilder.newInstance(CharValue.class, false); - CharValue value2 = ChronicleMapBuilder.newInstance(CharValue.class, false); + + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + CharValue value1 = map.newValueInstance(); + CharValue value2 = map.newValueInstance(); key1.setValue(1); value1.setValue((char) 11); @@ -1008,10 +1018,14 @@ public class CHMUseCasesTest { .entrySize(5) .disableOversizedEntries() // disabled for testing purposes only. .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - UnsignedByteValue value1 = ChronicleMapBuilder.newInstance(UnsignedByteValue.class, false); - UnsignedByteValue value2 = ChronicleMapBuilder.newInstance(UnsignedByteValue.class, false); + + + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + UnsignedByteValue value1 = map.newValueInstance(); + UnsignedByteValue value2 = map.newValueInstance(); + + key1.setValue(1); value1.setValue(11); @@ -1090,10 +1104,14 @@ public class CHMUseCasesTest { .disableOversizedEntries() // disabled for testing purposes only. .entrySize(5) .create()) { - IntValue key1 = ChronicleMapBuilder.newInstance(IntValue.class, false); - IntValue key2 = ChronicleMapBuilder.newInstance(IntValue.class, false); - BooleanValue value1 = ChronicleMapBuilder.newInstance(BooleanValue.class, false); - BooleanValue value2 = ChronicleMapBuilder.newInstance(BooleanValue.class, false); + + + + IntValue key1 = map.newKeyInstance(); + IntValue key2 = map.newKeyInstance(); + BooleanValue value1 = map.newValueInstance(); + BooleanValue value2 = map.newValueInstance(); + key1.setValue(1); value1.setValue(true); @@ -1172,10 +1190,12 @@ public class CHMUseCasesTest { .entrySize(8) .disableOversizedEntries() // disabled for testing purposes only. .create()) { - FloatValue key1 = ChronicleMapBuilder.newInstance(FloatValue.class, false); - FloatValue key2 = ChronicleMapBuilder.newInstance(FloatValue.class, false); - FloatValue value1 = ChronicleMapBuilder.newInstance(FloatValue.class, false); - FloatValue value2 = ChronicleMapBuilder.newInstance(FloatValue.class, false); + + FloatValue key1 = map.newKeyInstance(); + FloatValue key2 = map.newKeyInstance(); + FloatValue value1 = map.newValueInstance(); + FloatValue value2 = map.newValueInstance(); + key1.setValue(1); value1.setValue(11); @@ -1254,10 +1274,10 @@ public class CHMUseCasesTest { .entrySize(16) .create()) { - DoubleValue key1 = ChronicleMapBuilder.newInstance(DoubleValue.class, false); - DoubleValue key2 = ChronicleMapBuilder.newInstance(DoubleValue.class, false); - DoubleValue value1 = ChronicleMapBuilder.newInstance(DoubleValue.class, false); - DoubleValue value2 = ChronicleMapBuilder.newInstance(DoubleValue.class, false); + DoubleValue key1 = map.newKeyInstance(); + DoubleValue key2 = map.newKeyInstance(); + DoubleValue value1 = map.newValueInstance(); + DoubleValue value2 = map.newValueInstance(); key1.setValue(1); @@ -1339,10 +1359,12 @@ public class CHMUseCasesTest { .entrySize(16) .disableOversizedEntries() // disabled for testing purposes only. .create()) { - LongValue key1 = ChronicleMapBuilder.newInstance(LongValue.class, false); - LongValue key2 = ChronicleMapBuilder.newInstance(LongValue.class, false); - LongValue value1 = ChronicleMapBuilder.newInstance(LongValue.class, false); - LongValue value2 = ChronicleMapBuilder.newInstance(LongValue.class, false); + + LongValue key1 = map.newKeyInstance(); + LongValue key2 = map.newKeyInstance(); + LongValue value1 = map.newValueInstance(); + LongValue value2 = map.newValueInstance(); + key1.setValue(1); diff --git a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java index 41c314780..a973809e1 100644 --- a/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java +++ b/src/test/java/net/openhft/chronicle/map/ReplicationCheckingMap.java @@ -237,6 +237,16 @@ public class ReplicationCheckingMap implements ChronicleMap { throw new UnsupportedOperationException(); } + @Override + public V newValueInstance() { + throw new UnsupportedOperationException(); + } + + @Override + public K newKeyInstance() { + throw new UnsupportedOperationException(); + } + @Override public V acquireUsing(@NotNull K key, V usingValue) { return map1.acquireUsing(key, usingValue); diff --git a/src/test/java/net/openhft/chronicle/map/jrs166/map/StatelessChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/jrs166/map/StatelessChronicleMapTest.java index e4ddc060f..7f5ddc084 100755 --- a/src/test/java/net/openhft/chronicle/map/jrs166/map/StatelessChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/jrs166/map/StatelessChronicleMapTest.java @@ -189,6 +189,16 @@ public class StatelessChronicleMapTest extends JSR166TestCase { d.putAll(fromFile); } + @Override + public V newValueInstance() { + throw new UnsupportedOperationException(); + } + + @Override + public K newKeyInstance() { + throw new UnsupportedOperationException(); + } + @Override public V putIfAbsent(K key, V value) { return d.putIfAbsent(key, value);