diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java
new file mode 100644
index 000000000..fe1c0c5a9
--- /dev/null
+++ b/src/main/java/net/openhft/chronicle/map/ChronicleMap.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.chronicle.map;
+
+import net.openhft.collections.SharedHashMap;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+/**
+ * @author Rob Austin.
+ */
+public interface ChronicleMap extends SharedHashMap { // }, ConcurrentHashMap3 {
+
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws ClassCastException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @implNote This implementation assumes that the ConcurrentMap cannot contain null values and {@code
+ * get()} returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+ default V getOrDefault(Object key, V defaultValue) {
+ V v;
+ return ((v = get(key)) != null) ? v : defaultValue;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws NullPointerException {@inheritDoc}
+ * @implSpec The default implementation is equivalent to, for this {@code map}:
+ *
+ * @implNote The default implementation assumes that {@code IllegalStateException} thrown by {@code
+ * getKey()} or {@code getValue()} indicates that the entry has been removed and cannot be processed.
+ * Operation continues for subsequent entries.
+ * @since 1.8
+ */
+ default void forEach(BiConsumer super K, ? super V> action) {
+ Objects.requireNonNull(action);
+ for (Map.Entry entry : entrySet()) {
+ K k;
+ V v;
+ try {
+ k = entry.getKey();
+ v = entry.getValue();
+ } catch (IllegalStateException ise) {
+ // this usually means the entry is no longer in the map.
+ continue;
+ }
+ action.accept(k, v);
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws UnsupportedOperationException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @throws ClassCastException {@inheritDoc}
+ * @throws IllegalArgumentException {@inheritDoc}
+ * @implSpec
The default implementation is equivalent to, for this {@code map}:
+ *
{@code
+ * for ((Map.Entry entry : map.entrySet())
+ * do {
+ * K k = entry.getKey();
+ * V v = entry.getValue();
+ * } while(!replace(k, v, function.apply(k, v)));
+ * }
+ *
+ * The default implementation may retry these steps when multiple threads attempt updates including
+ * potentially calling the function repeatedly for a given key.
+ *
+ *
This implementation assumes that the ConcurrentMap cannot contain null values and {@code get()}
+ * returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+ default void replaceAll(BiFunction super K, ? super V, ? extends V> function) {
+ Objects.requireNonNull(function);
+ forEach((k, v) -> {
+ while (!replace(k, v, function.apply(k, v))) {
+ // v changed or k is gone
+ if ((v = get(k)) == null) {
+ // k is no longer in the map.
+ break;
+ }
+ }
+ });
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws UnsupportedOperationException {@inheritDoc}
+ * @throws ClassCastException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @implSpec The default implementation is equivalent to the following steps for this {@code map}, then
+ * returning the current value or {@code null} if now absent:
+ *
+ *
+ *
+ * The default implementation may retry these steps when multiple threads attempt updates including
+ * potentially calling the mapping function multiple times.
+ *
+ *
This implementation assumes that the ConcurrentMap cannot contain null values and {@code get()}
+ * returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+
+ default V computeIfAbsent(K key,
+ Function super K, ? extends V> mappingFunction) {
+ Objects.requireNonNull(mappingFunction);
+ V v, newValue;
+ return ((v = get(key)) == null &&
+ (newValue = mappingFunction.apply(key)) != null &&
+ (v = putIfAbsent(key, newValue)) == null) ? newValue : v;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws UnsupportedOperationException {@inheritDoc}
+ * @throws ClassCastException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @implSpec The default implementation is equivalent to performing the following steps for this {@code
+ * map}, then returning the current value or {@code null} if now absent. :
+ *
+ *
+ *
+ * The default implementation may retry these steps when multiple threads attempt updates including
+ * potentially calling the remapping function multiple times.
+ *
+ *
This implementation assumes that the ConcurrentMap cannot contain null values and {@code get()}
+ * returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+ default V computeIfPresent(K key,
+ BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
+ V oldValue;
+ while ((oldValue = get(key)) != null) {
+ V newValue = remappingFunction.apply(key, oldValue);
+ if (newValue != null) {
+ if (replace(key, oldValue, newValue))
+ return newValue;
+ } else if (remove(key, oldValue))
+ return null;
+ }
+ return oldValue;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws UnsupportedOperationException {@inheritDoc}
+ * @throws ClassCastException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @implSpec The default implementation is equivalent to performing the following steps for this {@code
+ * map}, then returning the current value or {@code null} if absent:
+ *
+ *
+ *
+ * The default implementation may retry these steps when multiple threads attempt updates including
+ * potentially calling the remapping function multiple times.
+ *
+ *
This implementation assumes that the ConcurrentMap cannot contain null values and {@code get()}
+ * returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+ default V compute(K key,
+ BiFunction super K, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
+ V oldValue = get(key);
+ for (; ; ) {
+ V newValue = remappingFunction.apply(key, oldValue);
+ if (newValue == null) {
+ // delete mapping
+ if (oldValue != null || containsKey(key)) {
+ // something to remove
+ if (remove(key, oldValue)) {
+ // removed the old value as expected
+ return null;
+ }
+
+ // some other value replaced old value. try again.
+ oldValue = get(key);
+ } else {
+ // nothing to do. Leave things as they were.
+ return null;
+ }
+ } else {
+ // add or replace old mapping
+ if (oldValue != null) {
+ // replace
+ if (replace(key, oldValue, newValue)) {
+ // replaced as expected.
+ return newValue;
+ }
+
+ // some other value replaced old value. try again.
+ oldValue = get(key);
+ } else {
+ // add (replace if oldValue was null)
+ if ((oldValue = putIfAbsent(key, newValue)) == null) {
+ // replaced
+ return newValue;
+ }
+
+ // some other value replaced old value. try again.
+ }
+ }
+ }
+ }
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @throws UnsupportedOperationException {@inheritDoc}
+ * @throws ClassCastException {@inheritDoc}
+ * @throws NullPointerException {@inheritDoc}
+ * @implSpec The default implementation is equivalent to performing the following steps for this {@code
+ * map}, then returning the current value or {@code null} if absent:
+ *
+ *
The default implementation may retry these steps when multiple threads attempt updates including
+ * potentially calling the remapping function multiple times.
+ *
+ *
This implementation assumes that the ConcurrentMap cannot contain null values and {@code get()}
+ * returning null unambiguously means the key is absent. Implementations which support null values
+ * must override this default implementation.
+ * @since 1.8
+ */
+ default V merge(K key, V value,
+ BiFunction super V, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
+ Objects.requireNonNull(value);
+ V oldValue = get(key);
+ for (; ; ) {
+ if (oldValue != null) {
+ V newValue = remappingFunction.apply(oldValue, value);
+ if (newValue != null) {
+ if (replace(key, oldValue, newValue))
+ return newValue;
+ } else if (remove(key, oldValue)) {
+ return null;
+ }
+ oldValue = get(key);
+ } else {
+ if ((oldValue = putIfAbsent(key, value)) == null) {
+ return value;
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java
new file mode 100644
index 000000000..a70b77439
--- /dev/null
+++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.chronicle.map;
+
+import net.openhft.collections.ChronicleMapBuilder0;
+
+/**
+ * @author Rob Austin.
+ */
+public class ChronicleMapBuilder extends ChronicleMapBuilder0 {
+ public ChronicleMapBuilder(Class aClass, Class aClass2) {
+ super(aClass, aClass2);
+ }
+}
diff --git a/src/main/java/net/openhft/collections/ChronicleMapBuilder0.java b/src/main/java/net/openhft/collections/ChronicleMapBuilder0.java
new file mode 100644
index 000000000..c94499931
--- /dev/null
+++ b/src/main/java/net/openhft/collections/ChronicleMapBuilder0.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.collections;
+
+import net.openhft.chronicle.map.ChronicleMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+/**
+ * @author Rob Austin.
+ */
+public class ChronicleMapBuilder0 extends SharedHashMapBuilder implements Cloneable {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ChronicleMapBuilder0.class.getName());
+
+ public ChronicleMapBuilder0(Class kClass, Class vClass) {
+ super(kClass, vClass);
+ }
+
+ public static ChronicleMapBuilder0 of(Class kClass, Class vClass) {
+ return new ChronicleMapBuilder0(kClass, vClass);
+ }
+
+
+ /**
+ * Not supported yet.
+ *
+ * @param transactional if the built map should be transactional
+ * @return this {@code SharedHashMapBuilder} back
+ */
+ public ChronicleMapBuilder0 transactional(boolean transactional) {
+ this.transactional = transactional;
+ return this;
+ }
+
+ public boolean transactional() {
+ return transactional;
+ }
+
+
+ public ChronicleMapBuilder0 kClass(Class kClass) {
+ this.kClass = kClass;
+ return this;
+ }
+
+ public ChronicleMapBuilder0 vClass(Class vClass) {
+ this.vClass = vClass;
+ return this;
+ }
+
+ public ChronicleMapBuilder0 file(File file) {
+ this.file = file;
+ return this;
+ }
+
+
+ public ChronicleMap create() throws IOException {
+ super.create();
+
+ if (kClass == null)
+ throw new IllegalArgumentException("missing mandatory parameter kClass");
+
+ if (vClass == null)
+ throw new IllegalArgumentException("missing mandatory parameter vClass");
+
+ if (file == null)
+ throw new IllegalArgumentException("missing mandatory parameter file");
+
+
+ ChronicleMapBuilder0 builder = toBuilder();
+
+ if (!canReplicate())
+ return new ChronicleMap0(builder, file, kClass, vClass);
+
+ if (identifier <= 0)
+ throw new IllegalArgumentException("Identifier must be positive, " + identifier + " given");
+
+ final ChronicleReplicatedHashMap result =
+ new ChronicleReplicatedHashMap(builder, kClass, vClass);
+
+ if (externalReplicatorBuilder != null)
+ externalReplicator = applyExternalReplicator(result, externalReplicatorBuilder, kClass, vClass);
+
+ if (tcpReplicatorBuilder != null)
+ applyTcpReplication(result, tcpReplicatorBuilder);
+
+ if (udpReplicatorBuilder != null) {
+ if (tcpReplicatorBuilder == null)
+ LOG.warn("MISSING TCP REPLICATION : The UdpReplicator only attempts to read data (" +
+ "it does not enforce or guarantee delivery), you should use the UdpReplicator if " +
+ "you have a large number of nodes, and you wish to receive the data before it " +
+ "becomes available on TCP/IP. Since data delivery is not guaranteed, it is " +
+ "recommended that you only use the UDP" +
+ " " +
+ "Replicator " +
+ "in conjunction with a TCP Replicator");
+ applyUdpReplication(result, udpReplicatorBuilder);
+ }
+ return result;
+ }
+
+ ChronicleMapBuilder0 toBuilder() throws IOException {
+ ChronicleMapBuilder0 builder = clone();
+
+ for (int i = 0; i < 10; i++) {
+ if (file.exists() && file.length() > 0) {
+ readFile(file, builder);
+ break;
+ }
+ if (file.createNewFile() || file.length() == 0) {
+ newFile(file);
+ break;
+ }
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new IOException(e);
+ }
+ }
+ if (builder == null || !file.exists())
+ throw new FileNotFoundException("Unable to create " + file);
+ return builder;
+ }
+
+ @Override
+ public ChronicleMapBuilder0 clone() {
+ return (ChronicleMapBuilder0) super.clone();
+ }
+
+}
diff --git a/src/main/java/net/openhft/collections/ChronicleReplicatedHashMap.java b/src/main/java/net/openhft/collections/ChronicleReplicatedHashMap.java
new file mode 100644
index 000000000..e1eb5b152
--- /dev/null
+++ b/src/main/java/net/openhft/collections/ChronicleReplicatedHashMap.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.collections;
+
+import net.openhft.chronicle.map.ChronicleMap;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+/**
+ * @author Rob Austin.
+ */
+public class ChronicleReplicatedHashMap extends VanillaSharedReplicatedHashMap implements ChronicleMap {
+
+ public ChronicleReplicatedHashMap(@NotNull SharedHashMapBuilder builder, @NotNull Class aClass, @NotNull Class aClass2) throws IOException {
+ super(builder, aClass, aClass2);
+ }
+
+}
diff --git a/src/main/java/net/openhft/collections/ConcurrentHashMap2.java b/src/main/java/net/openhft/collections/ConcurrentHashMap2.java
new file mode 100644
index 000000000..07611ecac
--- /dev/null
+++ b/src/main/java/net/openhft/collections/ConcurrentHashMap2.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.collections;
+
+/**
+ * @author Rob Austin.
+ */
+public interface ConcurrentHashMap2 {
+}
diff --git a/src/main/java/net/openhft/collections/ConcurrentHashMap3.java b/src/main/java/net/openhft/collections/ConcurrentHashMap3.java
new file mode 100644
index 000000000..cb4052002
--- /dev/null
+++ b/src/main/java/net/openhft/collections/ConcurrentHashMap3.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.collections;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.*;
+
+/**
+ * @author Rob Austin.
+ */
+public interface ConcurrentHashMap3 {
+
+
+ long mappingCount();
+
+ ConcurrentHashMap.KeySetView keySet(V mappedValue);
+
+ void forEach(long parallelismThreshold,
+ BiConsumer super K, ? super V> action);
+
+ void forEach(long parallelismThreshold,
+ BiFunction super K, ? super V, ? extends U> transformer,
+ Consumer super U> action);
+
+ U search(long parallelismThreshold,
+ BiFunction super K, ? super V, ? extends U> searchFunction);
+
+ U reduce(long parallelismThreshold,
+ BiFunction super K, ? super V, ? extends U> transformer,
+ BiFunction super U, ? super U, ? extends U> reducer);
+
+ double reduceToDouble(long parallelismThreshold,
+ ToDoubleBiFunction super K, ? super V> transformer,
+ double basis,
+ DoubleBinaryOperator reducer);
+
+ long reduceToLong(long parallelismThreshold,
+ ToLongBiFunction super K, ? super V> transformer,
+ long basis,
+ LongBinaryOperator reducer);
+
+ int reduceToInt(long parallelismThreshold,
+ ToIntBiFunction super K, ? super V> transformer,
+ int basis,
+ IntBinaryOperator reducer);
+
+ void forEachKey(long parallelismThreshold,
+ Consumer super K> action);
+
+ void forEachKey(long parallelismThreshold,
+ Function super K, ? extends U> transformer,
+ Consumer super U> action);
+
+ U searchKeys(long parallelismThreshold,
+ Function super K, ? extends U> searchFunction);
+
+ K reduceKeys(long parallelismThreshold,
+ BiFunction super K, ? super K, ? extends K> reducer);
+
+ U reduceKeys(long parallelismThreshold,
+ Function super K, ? extends U> transformer,
+ BiFunction super U, ? super U, ? extends U> reducer);
+
+ double reduceKeysToDouble(long parallelismThreshold,
+ ToDoubleFunction super K> transformer,
+ double basis,
+ DoubleBinaryOperator reducer);
+
+ long reduceKeysToLong(long parallelismThreshold,
+ ToLongFunction super K> transformer,
+ long basis,
+ LongBinaryOperator reducer);
+
+ int reduceKeysToInt(long parallelismThreshold,
+ ToIntFunction super K> transformer,
+ int basis,
+ IntBinaryOperator reducer);
+
+ void forEachValue(long parallelismThreshold,
+ Consumer super V> action);
+
+ void forEachValue(long parallelismThreshold,
+ Function super V, ? extends U> transformer,
+ Consumer super U> action);
+
+ U searchValues(long parallelismThreshold,
+ Function super V, ? extends U> searchFunction);
+
+ V reduceValues(long parallelismThreshold,
+ BiFunction super V, ? super V, ? extends V> reducer);
+
+ U reduceValues(long parallelismThreshold,
+ Function super V, ? extends U> transformer,
+ BiFunction super U, ? super U, ? extends U> reducer);
+
+ double reduceValuesToDouble(long parallelismThreshold,
+ ToDoubleFunction super V> transformer,
+ double basis,
+ DoubleBinaryOperator reducer);
+
+ long reduceValuesToLong(long parallelismThreshold,
+ ToLongFunction super V> transformer,
+ long basis,
+ LongBinaryOperator reducer);
+
+ int reduceValuesToInt(long parallelismThreshold,
+ ToIntFunction super V> transformer,
+ int basis,
+ IntBinaryOperator reducer);
+
+ void forEachEntry(long parallelismThreshold,
+ Consumer super Map.Entry> action);
+
+ void forEachEntry(long parallelismThreshold,
+ Function, ? extends U> transformer,
+ Consumer super U> action);
+
+ U searchEntries(long parallelismThreshold,
+ Function, ? extends U> searchFunction);
+
+ Map.Entry reduceEntries(long parallelismThreshold,
+ BiFunction, Map.Entry, ? extends Map.Entry> reducer);
+
+ U reduceEntries(long parallelismThreshold,
+ Function, ? extends U> transformer,
+ BiFunction super U, ? super U, ? extends U> reducer);
+
+ double reduceEntriesToDouble(long parallelismThreshold,
+ ToDoubleFunction> transformer,
+ double basis,
+ DoubleBinaryOperator reducer);
+
+ long reduceEntriesToLong(long parallelismThreshold,
+ ToLongFunction> transformer,
+ long basis,
+ LongBinaryOperator reducer);
+
+ int reduceEntriesToInt(long parallelismThreshold,
+ ToIntFunction> transformer,
+ int basis,
+ IntBinaryOperator reducer);
+}
diff --git a/src/main/java/net/openhft/collections/VSHM.java b/src/main/java/net/openhft/collections/VSHM.java
new file mode 100644
index 000000000..e55d80c56
--- /dev/null
+++ b/src/main/java/net/openhft/collections/VSHM.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2014 Higher Frequency Trading
+ *
+ * http://www.higherfrequencytrading.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.openhft.collections;
+
+import net.openhft.chronicle.map.ChronicleMap;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author Rob Austin.
+ */
+class ChronicleMap0 extends VanillaSharedHashMap implements ChronicleMap {
+ public ChronicleMap0(ChronicleMapBuilder0 builder, File file, Class kClass, Class vClass)
+ throws IOException {
+ super(builder, file, kClass, vClass);
+ }
+
+
+}
diff --git a/src/test/java/net/openhft/chronicle/map/ConcurrentHashMap8Test.java b/src/test/java/net/openhft/chronicle/map/ConcurrentHashMap8Test.java
index 969de12f4..c1a2f39aa 100644
--- a/src/test/java/net/openhft/chronicle/map/ConcurrentHashMap8Test.java
+++ b/src/test/java/net/openhft/chronicle/map/ConcurrentHashMap8Test.java
@@ -30,9 +30,8 @@ import org.junit.Test;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentHashMap.KeySetView;
import java.util.concurrent.atomic.LongAdder;
-import java.util.function.BiFunction;
+import java.util.function.*;
import static java.util.Spliterator.*;
import static org.junit.Assert.*;
@@ -42,11 +41,56 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
private static final double EPSILON = 1E-5;
+ private static ConcurrentHashMap newLongMap() {
+ //First create (or access if already created) the shared map
+
+/* final ConcurrentHashMapBuilder0 builder = ConcurrentHashMapBuilder0.of(Long.class, Long.class);
+
+
+ //// don't include this, just to check it is as expected.
+ assertEquals(8, builder.minSegments());
+ //// end of test
+
+ String shmPath = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + "SHMTest" + System.nanoTime();
+ try {
+ return builder.file(new File(shmPath)).create();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }*/
+
+
+ return new ConcurrentHashMap(5);
+
+ }
+
+ private static ConcurrentHashMap newIntegerStringMap() {
+
+
+/* final ConcurrentHashMapBuilder0 builder = ConcurrentHashMapBuilder0.of(Long.class, String.class);
+
+
+ //// don't include this, just to check it is as expected.
+ assertEquals(8, builder.minSegments());
+ //// end of test
+
+ String shmPath = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") +
+ "SHMTest" + System.nanoTime();
+ try {
+ return builder.file(new File(shmPath)).create();
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }*/
+
+
+ return new ConcurrentHashMap(5);
+
+ }
+
/**
* Returns a new map from Integers 1-5 to Strings "A"-"E".
*/
private static ConcurrentHashMap map5() {
- ConcurrentHashMap map = new ConcurrentHashMap(5);
+ ConcurrentHashMap map = newIntegerStringMap();
assertTrue(map.isEmpty());
map.put(one, "A");
map.put(two, "B");
@@ -58,6 +102,7 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
return map;
}
+
/**
* getOrDefault returns value if present, else default
*/
@@ -236,8 +281,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
Set set1 = map.keySet();
Set set2 = map.keySet(true);
set2.add(six);
- assertTrue(((KeySetView) set2).getMap() == map);
- assertTrue(((KeySetView) set1).getMap() == map);
+ assertTrue(((ConcurrentHashMap.KeySetView) set2).getMap() == map);
+ assertTrue(((ConcurrentHashMap.KeySetView) set1).getMap() == map);
assertEquals(set2.size(), map.size());
assertEquals(set1.size(), map.size());
assertTrue((Boolean) map.get(six));
@@ -336,7 +381,7 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
shouldThrow();
} catch (NullPointerException e) {
}
- KeySetView set = map.keySet(one);
+ final ConcurrentHashMap.KeySetView set = map.keySet(one);
set.add(one);
set.add(six);
set.add(seven);
@@ -608,13 +653,15 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
static ConcurrentHashMap longMap() {
if (longMap == null) {
- longMap = new ConcurrentHashMap(SIZE);
+ longMap = newLongMap();
for (int i = 0; i < SIZE; ++i)
longMap.put(Long.valueOf(i), Long.valueOf(2 * i));
}
+
return longMap;
}
+
// explicit function class to avoid type inference problems
static class AddKeys implements BiFunction, Map.Entry, Map.Entry> {
public Map.Entry apply(Map.Entry x, Map.Entry y) {
@@ -631,7 +678,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachKeySequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachKey(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
+ final Consumer consumer = (Long x) -> adder.add(x.longValue());
+ m.forEachKey(Long.MAX_VALUE, consumer);
assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
}
@@ -641,8 +689,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testForEachValueSequentially() {
LongAdder adder = new LongAdder();
- ConcurrentHashMap m = longMap();
- m.forEachValue(Long.MAX_VALUE, (Long x) -> adder.add(x.longValue()));
+ ConcurrentHashMap m = (ConcurrentHashMap) longMap();
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachValue(Long.MAX_VALUE, action);
assertEquals(adder.sum(), SIZE * (SIZE - 1));
}
@@ -653,7 +702,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachSequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEach(Long.MAX_VALUE, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
+ final BiConsumer action = (Long x, Long y) -> adder.add(x.longValue() + y.longValue());
+ m.forEach(Long.MAX_VALUE, action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -664,7 +714,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachEntrySequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachEntry(Long.MAX_VALUE, (Map.Entry e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
+ final Consumer> action = (Map.Entry e) -> adder.add(e.getKey().longValue() + e.getValue().longValue());
+ m.forEachEntry(Long.MAX_VALUE, action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -675,7 +726,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachKeyInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachKey(1L, (Long x) -> adder.add(x.longValue()));
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+
+ m.forEachKey(1L, action);
assertEquals(adder.sum(), SIZE * (SIZE - 1) / 2);
}
@@ -686,7 +739,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachValueInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachValue(1L, (Long x) -> adder.add(x.longValue()));
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachValue(1L, action);
assertEquals(adder.sum(), SIZE * (SIZE - 1));
}
@@ -697,7 +751,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEach(1L, (Long x, Long y) -> adder.add(x.longValue() + y.longValue()));
+ final BiConsumer action = (Long x, Long y) -> adder.add(x.longValue() + y.longValue());
+ m.forEach(1L, action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -708,7 +763,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testForEachEntryInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachEntry(1L, (Map.Entry e) -> adder.add(e.getKey().longValue() + e.getValue().longValue()));
+ final Consumer> action = (Map.Entry e) -> adder.add(e.getKey().longValue() + e.getValue().longValue());
+ m.forEachEntry(1L, action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -719,8 +775,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachKeySequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachKey(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachKey(Long.MAX_VALUE, transformer,
+ action);
assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
}
@@ -731,8 +789,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachValueSequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachValue(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachValue(Long.MAX_VALUE, transformer,
+ action);
assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
}
@@ -743,8 +803,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachSequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEach(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final BiFunction transformer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEach(Long.MAX_VALUE, transformer,
+ action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -755,8 +817,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachEntrySequentially() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachEntry(Long.MAX_VALUE, (Map.Entry e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function, Long> transformer = (Map.Entry e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachEntry(Long.MAX_VALUE, transformer,
+ action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -767,8 +831,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachKeyInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachKey(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachKey(1L, transformer,
+ action);
assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1) / 2);
}
@@ -779,8 +845,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachValueInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachValue(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachValue(1L, transformer,
+ action);
assertEquals(adder.sum(), 4 * SIZE * (SIZE - 1));
}
@@ -791,8 +859,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEach(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final BiFunction transformer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEach(1L, transformer,
+ action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -803,8 +873,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedForEachEntryInParallel() {
LongAdder adder = new LongAdder();
ConcurrentHashMap m = longMap();
- m.forEachEntry(1L, (Map.Entry e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue()),
- (Long x) -> adder.add(x.longValue()));
+ final Function, Long> transformer = (Map.Entry e) -> Long.valueOf(e.getKey().longValue() + e.getValue().longValue());
+ final Consumer action = (Long x) -> adder.add(x.longValue());
+ m.forEachEntry(1L, transformer,
+ action);
assertEquals(adder.sum(), 3 * SIZE * (SIZE - 1) / 2);
}
@@ -815,7 +887,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testReduceKeysSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ r = m.reduceKeys(Long.MAX_VALUE, reducer);
assertEquals((long) r, (long) SIZE * (SIZE - 1) / 2);
}
@@ -826,7 +899,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testReduceValuesSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.reduceKeys(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ r = m.reduceKeys(Long.MAX_VALUE, reducer);
assertEquals((long) r, (long) SIZE * (SIZE - 1) / 2);
}
@@ -837,7 +911,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testReduceEntriesSequentially() {
ConcurrentHashMap m = longMap();
Map.Entry r;
- r = m.reduceEntries(Long.MAX_VALUE, new AddKeys());
+ final AddKeys reducer = new AddKeys();
+ r = m.reduceEntries(Long.MAX_VALUE, reducer);
assertEquals(r.getKey().longValue(), (long) SIZE * (SIZE - 1) / 2);
}
@@ -848,7 +923,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testReduceKeysInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.reduceKeys(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ r = m.reduceKeys(1L, reducer);
assertEquals((long) r, (long) SIZE * (SIZE - 1) / 2);
}
@@ -859,7 +935,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testReduceValuesInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.reduceValues(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ r = m.reduceValues(1L, reducer);
assertEquals((long) r, (long) SIZE * (SIZE - 1));
}
@@ -880,8 +957,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testMapReduceKeysSequentially() {
ConcurrentHashMap m = longMap();
- Long r = m.reduceKeys(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ Long r = m.reduceKeys(Long.MAX_VALUE, transformer,
+ reducer);
assertEquals((long) r, (long) 4 * SIZE * (SIZE - 1) / 2);
}
@@ -891,8 +970,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testMapReduceValuesSequentially() {
ConcurrentHashMap m = longMap();
- Long r = m.reduceValues(Long.MAX_VALUE, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ Long r = m.reduceValues(Long.MAX_VALUE, transformer,
+ reducer);
assertEquals((long) r, (long) 4 * SIZE * (SIZE - 1));
}
@@ -902,8 +983,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testMappedReduceSequentially() {
ConcurrentHashMap m = longMap();
- Long r = m.reduce(Long.MAX_VALUE, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction transformer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ Long r = m.reduce(Long.MAX_VALUE, transformer,
+ reducer);
assertEquals((long) r, (long) 3 * SIZE * (SIZE - 1) / 2);
}
@@ -914,8 +997,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testMapReduceKeysInParallel() {
ConcurrentHashMap m = longMap();
- Long r = m.reduceKeys(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ Long r = m.reduceKeys(1L, transformer,
+ reducer);
assertEquals((long) r, (long) 4 * SIZE * (SIZE - 1) / 2);
}
@@ -925,8 +1010,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testMapReduceValuesInParallel() {
ConcurrentHashMap m = longMap();
- Long r = m.reduceValues(1L, (Long x) -> Long.valueOf(4 * x.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final Function transformer = (Long x) -> Long.valueOf(4 * x.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ Long r = m.reduceValues(1L, transformer,
+ reducer);
assertEquals((long) r, (long) 4 * SIZE * (SIZE - 1));
}
@@ -937,8 +1024,10 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testMappedReduceInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.reduce(1L, (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()),
- (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue()));
+ final BiFunction transformer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ final BiFunction reducer = (Long x, Long y) -> Long.valueOf(x.longValue() + y.longValue());
+ r = m.reduce(1L, transformer,
+ reducer);
assertEquals((long) r, (long) 3 * SIZE * (SIZE - 1) / 2);
}
@@ -948,7 +1037,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToLongSequentially() {
ConcurrentHashMap m = longMap();
- long lr = m.reduceKeysToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
+ final ToLongFunction transformer = (Long x) -> x.longValue();
+ final LongBinaryOperator sum = Long::sum;
+ long lr = m.reduceKeysToLong(Long.MAX_VALUE, transformer, 0L, sum);
assertEquals(lr, (long) SIZE * (SIZE - 1) / 2);
}
@@ -958,7 +1049,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToIntSequentially() {
ConcurrentHashMap m = longMap();
- int ir = m.reduceKeysToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
+ final ToIntFunction transformer = (Long x) -> x.intValue();
+ final IntBinaryOperator sum = Integer::sum;
+ int ir = m.reduceKeysToInt(Long.MAX_VALUE, transformer, 0, sum);
assertEquals(ir, SIZE * (SIZE - 1) / 2);
}
@@ -968,8 +1061,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToDoubleSequentially() {
ConcurrentHashMap m = longMap();
- double dr = m.reduceKeysToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
- assertEquals(dr, (double) SIZE * (SIZE - 1) / 2,EPSILON);
+ final ToDoubleFunction transformer = (Long x) -> x.doubleValue();
+ double dr = m.reduceKeysToDouble(Long.MAX_VALUE, transformer, 0.0, Double::sum);
+ assertEquals(dr, (double) SIZE * (SIZE - 1) / 2, EPSILON);
}
/**
@@ -978,7 +1072,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToLongSequentially() {
ConcurrentHashMap m = longMap();
- long lr = m.reduceValuesToLong(Long.MAX_VALUE, (Long x) -> x.longValue(), 0L, Long::sum);
+ final ToLongFunction transformer = (Long x) -> x.longValue();
+ long lr = m.reduceValuesToLong(Long.MAX_VALUE, transformer, 0L, Long::sum);
assertEquals(lr, (long) SIZE * (SIZE - 1));
}
@@ -988,7 +1083,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToIntSequentially() {
ConcurrentHashMap m = longMap();
- int ir = m.reduceValuesToInt(Long.MAX_VALUE, (Long x) -> x.intValue(), 0, Integer::sum);
+ final ToIntFunction transformer = (Long x) -> x.intValue();
+ int ir = m.reduceValuesToInt(Long.MAX_VALUE, transformer, 0, Integer::sum);
assertEquals(ir, SIZE * (SIZE - 1));
}
@@ -998,8 +1094,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToDoubleSequentially() {
ConcurrentHashMap m = longMap();
- double dr = m.reduceValuesToDouble(Long.MAX_VALUE, (Long x) -> x.doubleValue(), 0.0, Double::sum);
- assertEquals(dr, (double) SIZE * (SIZE - 1),EPSILON);
+ final ToDoubleFunction transformer = (Long x) -> x.doubleValue();
+ double dr = m.reduceValuesToDouble(Long.MAX_VALUE, transformer, 0.0, Double::sum);
+ assertEquals(dr, (double) SIZE * (SIZE - 1), EPSILON);
}
/**
@@ -1008,7 +1105,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToLongInParallel() {
ConcurrentHashMap m = longMap();
- long lr = m.reduceKeysToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
+ final ToLongFunction transformer = (Long x) -> x.longValue();
+ long lr = m.reduceKeysToLong(1L, transformer, 0L, Long::sum);
assertEquals(lr, (long) SIZE * (SIZE - 1) / 2);
}
@@ -1018,7 +1116,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToIntInParallel() {
ConcurrentHashMap m = longMap();
- int ir = m.reduceKeysToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
+ final ToIntFunction transformer = (Long x) -> x.intValue();
+ int ir = m.reduceKeysToInt(1L, transformer, 0, Integer::sum);
assertEquals(ir, SIZE * (SIZE - 1) / 2);
}
@@ -1028,7 +1127,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceKeysToDoubleInParallel() {
ConcurrentHashMap m = longMap();
- double dr = m.reduceKeysToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
+ final ToDoubleFunction transformer = (Long x) -> x.doubleValue();
+ double dr = m.reduceKeysToDouble(1L, transformer, 0.0, Double::sum);
assertEquals(dr, (double) SIZE * (SIZE - 1) / 2, 0.01);
}
@@ -1038,7 +1138,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToLongInParallel() {
ConcurrentHashMap m = longMap();
- long lr = m.reduceValuesToLong(1L, (Long x) -> x.longValue(), 0L, Long::sum);
+ final ToLongFunction transformer = (Long x) -> x.longValue();
+ long lr = m.reduceValuesToLong(1L, transformer, 0L, Long::sum);
assertEquals(lr, (long) SIZE * (SIZE - 1));
}
@@ -1048,7 +1149,8 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToIntInParallel() {
ConcurrentHashMap m = longMap();
- int ir = m.reduceValuesToInt(1L, (Long x) -> x.intValue(), 0, Integer::sum);
+ final ToIntFunction transformer = (Long x) -> x.intValue();
+ int ir = m.reduceValuesToInt(1L, transformer, 0, Integer::sum);
assertEquals(ir, SIZE * (SIZE - 1));
}
@@ -1058,8 +1160,9 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
@Test
public void testReduceValuesToDoubleInParallel() {
ConcurrentHashMap m = longMap();
- double dr = m.reduceValuesToDouble(1L, (Long x) -> x.doubleValue(), 0.0, Double::sum);
- assertEquals(dr, (double) SIZE * (SIZE - 1),EPSILON);
+ final ToDoubleFunction transformer = (Long x) -> x.doubleValue();
+ double dr = m.reduceValuesToDouble(1L, transformer, 0.0, Double::sum);
+ assertEquals(dr, (double) SIZE * (SIZE - 1), EPSILON);
}
/**
@@ -1069,9 +1172,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchKeysSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final Function searchFunction = (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.searchKeys(Long.MAX_VALUE, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchKeys(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
+ final Function searchFunction1 = (Long x) -> x.longValue() < 0L ? x : null;
+ r = m.searchKeys(Long.MAX_VALUE, searchFunction1);
assertNull(r);
}
@@ -1082,9 +1187,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchValuesSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchValues(Long.MAX_VALUE, (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final Function searchFunction = (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.searchValues(Long.MAX_VALUE, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchValues(Long.MAX_VALUE, (Long x) -> x.longValue() < 0L ? x : null);
+ final Function searchFunction1 = (Long x) -> x.longValue() < 0L ? x : null;
+ r = m.searchValues(Long.MAX_VALUE, searchFunction1);
assertNull(r);
}
@@ -1095,9 +1202,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final BiFunction searchFunction = (Long x, Long y) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.search(Long.MAX_VALUE, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.search(Long.MAX_VALUE, (Long x, Long y) -> x.longValue() < 0L ? x : null);
+ final BiFunction searchFunction1 = (Long x, Long y) -> x.longValue() < 0L ? x : null;
+ r = m.search(Long.MAX_VALUE, searchFunction1);
assertNull(r);
}
@@ -1108,9 +1217,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchEntriesSequentially() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchEntries(Long.MAX_VALUE, (Map.Entry e) -> e.getKey().longValue() == (long) (SIZE / 2) ? e.getKey() : null);
+ final Function, Long> searchFunction = (Map.Entry e) -> e.getKey().longValue() == (long) (SIZE / 2) ? e.getKey() : null;
+ r = m.searchEntries(Long.MAX_VALUE, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchEntries(Long.MAX_VALUE, (Map.Entry e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
+ final Function, Long> searchFunction1 = (Map.Entry e) -> e.getKey().longValue() < 0L ? e.getKey() : null;
+ r = m.searchEntries(Long.MAX_VALUE, searchFunction1);
assertNull(r);
}
@@ -1121,9 +1232,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchKeysInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchKeys(1L, (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final Function searchFunction = (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.searchKeys(1L, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchKeys(1L, (Long x) -> x.longValue() < 0L ? x : null);
+ final Function searchFunction1 = (Long x) -> x.longValue() < 0L ? x : null;
+ r = m.searchKeys(1L, searchFunction1);
assertNull(r);
}
@@ -1134,9 +1247,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchValuesInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchValues(1L, (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final Function searchFunction = (Long x) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.searchValues(1L, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchValues(1L, (Long x) -> x.longValue() < 0L ? x : null);
+ final Function searchFunction1 = (Long x) -> x.longValue() < 0L ? x : null;
+ r = m.searchValues(1L, searchFunction1);
assertNull(r);
}
@@ -1147,9 +1262,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.search(1L, (Long x, Long y) -> x.longValue() == (long) (SIZE / 2) ? x : null);
+ final BiFunction searchFunction = (Long x, Long y) -> x.longValue() == (long) (SIZE / 2) ? x : null;
+ r = m.search(1L, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.search(1L, (Long x, Long y) -> x.longValue() < 0L ? x : null);
+ final BiFunction searchFunction1 = (Long x, Long y) -> x.longValue() < 0L ? x : null;
+ r = m.search(1L, searchFunction1);
assertNull(r);
}
@@ -1160,9 +1277,11 @@ public class ConcurrentHashMap8Test extends JSR166TestCase {
public void testSearchEntriesInParallel() {
ConcurrentHashMap m = longMap();
Long r;
- r = m.searchEntries(1L, (Map.Entry e) -> e.getKey().longValue() == (long) (SIZE / 2) ? e.getKey() : null);
+ final Function, Long> searchFunction = (Map.Entry e) -> e.getKey().longValue() == (long) (SIZE / 2) ? e.getKey() : null;
+ r = m.searchEntries(1L, searchFunction);
assertEquals((long) r, (long) (SIZE / 2));
- r = m.searchEntries(1L, (Map.Entry e) -> e.getKey().longValue() < 0L ? e.getKey() : null);
+ final Function, Long> searchFunction1 = (Map.Entry e) -> e.getKey().longValue() < 0L ? e.getKey() : null;
+ r = m.searchEntries(1L, searchFunction1);
assertNull(r);
}
diff --git a/src/test/java/net/openhft/chronicle/map/others/ConcurrentAssociateTest.java b/src/test/java/net/openhft/chronicle/map/others/ConcurrentAssociateTest.java
deleted file mode 100644
index dc881cc7c..000000000
--- a/src/test/java/net/openhft/chronicle/map/others/ConcurrentAssociateTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2014 Higher Frequency Trading
- *
- * http://www.higherfrequencytrading.com
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.openhft.chronicle.map.others;/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import org.testng.annotations.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionException;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.function.BiConsumer;
-import java.util.function.Supplier;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-/**
- * @test
- * @bug 8028564
- * @run testng ConcurrentAssociateTest
- * @summary Test that association operations, such as put and compute,
- * place entries in the map
- */
-@Test
-public class ConcurrentAssociateTest {
-
- // The number of entries for each thread to place in a map
- private static final int N = Integer.getInteger("n", 128);
- // The number of iterations of the test
- private static final int I = Integer.getInteger("i", 256);
-
- // Object to be placed in the concurrent map
- static class X {
- // Limit the hash code to trigger collisions
- int hc = ThreadLocalRandom.current().nextInt(1, 9);
-
- public int hashCode() { return hc; }
- }
-
- @Test
- public void testPut() {
- test("CHM.put", (m, o) -> m.put(o, o));
- }
-
- @Test
- public void testCompute() {
- test("CHM.compute", (m, o) -> m.compute(o, (k, v) -> o));
- }
-
- @Test
- public void testComputeIfAbsent() {
- test("CHM.computeIfAbsent", (m, o) -> m.computeIfAbsent(o, (k) -> o));
- }
-
- @Test
- public void testMerge() {
- test("CHM.merge", (m, o) -> m.merge(o, o, (v1, v2) -> v1));
- }
-
- @Test
- public void testPutAll() {
- test("CHM.putAll", (m, o) -> {
- Map