package org.infinispan.commons.util;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.infinispan.commons.equivalence.Equivalence;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
/**
* A factory for ConcurrentMaps.
*
* @author Manik Surtani
* @author Galder ZamarreƱo
* @since 5.1
*/
public class CollectionFactory {
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
public static int computeCapacity(int expectedSize) {
return computeCapacity(expectedSize, DEFAULT_LOAD_FACTOR);
}
public static int computeCapacity(int expectedSize, float loadFactor) {
return (int) (expectedSize / loadFactor + 1.0f);
}
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap() {
return new ConcurrentHashMap<>();
}
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(int initCapacity) {
return new ConcurrentHashMap<>(initCapacity);
}
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(int initCapacity, int concurrencyLevel) {
return new ConcurrentHashMap<>(initCapacity, 0.75f, concurrencyLevel);
}
public static <K, V> ConcurrentMap<K, V> makeConcurrentParallelMap(int initCapacity, int concurrencyLevel) {
return new ConcurrentHashMap<>(initCapacity);
}
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(int initCapacity, float loadFactor, int concurrencyLevel) {
return new ConcurrentHashMap<>(initCapacity, loadFactor, concurrencyLevel);
}
public static <K, V> Map<K, V> makeMap() {
return new HashMap<>();
}
public static <K, V> Map<K, V> makeMap(int initialCapacity) {
return new HashMap<>(initialCapacity);
}
public static <K, V> Map<K, V> makeMap(Map<? extends K, ? extends V> entries) {
return new HashMap<>(entries);
}
public static <K, V> Map<K, V> makeLinkedMap(int initialCapacity, float loadFactor, boolean accessOrder) {
return new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
}
public static <T> Set<T> makeSet() {
return new HashSet<>();
}
public static <T> Set<T> makeSet(int initialCapacity) {
return new HashSet<>(initialCapacity);
}
/**
* @deprecated Since 9.0, please use {@link #makeConcurrentMap()} instead.
*/
@Deprecated
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(
Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return makeConcurrentMap();
}
/**
* @deprecated Since 9.0, please use {@link #makeConcurrentMap(int)} instead.
*/
@Deprecated
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(
int initCapacity, Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return makeConcurrentMap(initCapacity);
}
/**
* @deprecated Since 9.0, please use {@link #makeConcurrentMap(int, int)} instead.
*/
@Deprecated
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(
int initCapacity, int concurrencyLevel, Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return makeConcurrentMap(initCapacity, concurrencyLevel);
}
/**
* @deprecated Since 9.0, please use {@link #makeConcurrentParallelMap(int, int)} instead.
*/
@Deprecated
public static <K, V> ConcurrentMap<K, V> makeConcurrentParallelMap(
int initCapacity, int concurrencyLevel, Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return makeConcurrentParallelMap(initCapacity, concurrencyLevel);
}
/**
* @deprecated Since 9.0, please use {@link #makeConcurrentMap(int, float, int)} instead.
*/
@Deprecated
public static <K, V> ConcurrentMap<K, V> makeConcurrentMap(
int initCapacity, float loadFactor, int concurrencyLevel,
Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return makeConcurrentMap(initCapacity, loadFactor, concurrencyLevel);
}
public static <K, V> ConcurrentMap<K, V> makeBoundedConcurrentMap(int maxSize) {
Cache<K, V> cache = Caffeine.newBuilder().maximumSize(maxSize).build();
return cache.asMap();
}
/**
* @deprecated Since 9.0, please use {@link #makeMap()} instead.
*/
@Deprecated
public static <K, V> Map<K, V> makeMap(
Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return new HashMap<>();
}
/**
* @deprecated Since 9.0, please use {@link #makeMap(int)} instead.
*/
@Deprecated
public static <K, V> Map<K, V> makeMap(
int initialCapacity, Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return new HashMap<>(initialCapacity);
}
/**
* @deprecated Since 9.0, please use {@link #makeMap(Map)} instead.
*/
@Deprecated
public static <K, V> Map<K, V> makeMap(
Map<? extends K, ? extends V> entries, Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return new HashMap<>(entries);
}
/**
* @deprecated Since 9.0, please use {@link #makeSet(int)} instead.
*/
@Deprecated
public static <K, V> Map<K, V> makeLinkedMap(int initialCapacity,
float loadFactor, boolean accessOrder,
Equivalence<? super K> keyEq, Equivalence<? super V> valueEq) {
return new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
}
/**
* @deprecated Since 9.0, please use {@link #makeSet()} instead.
*/
@Deprecated
public static <T> Set<T> makeSet(Equivalence<? super T> entryEq) {
return new HashSet<>();
}
/**
* @deprecated Since 9.0, please use {@link #makeSet(int)} instead.
*/
@Deprecated
public static <T> Set<T> makeSet(int initialCapacity, Equivalence<? super T> entryEq) {
return new HashSet<>(initialCapacity);
}
/**
* Create a Set backed by the specified array.
*
* @param entries the array by which the list will be backed
* @param <T> type of elements
* @return a set view of the specified array
*/
@SafeVarargs
public static <T> Set<T> makeSet(T... entries) {
return new HashSet<>(Arrays.asList(entries));
}
}