@SafeVarargs static <T> RedBlackTree<T> of(Comparator<? super T> comparator, T... values) { Objects.requireNonNull(comparator, "comparator is null"); Objects.requireNonNull(values, "values is null"); RedBlackTree<T> tree = empty(comparator); for (T value : values) { tree = tree.insert(value); } return tree; }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createTreeMap(EntryComparator<K, V> entryComparator, Iterable<? extends Tuple2<? extends K, ? extends V>> entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<K, V> entry : (Iterable<Tuple2<K, V>>) entries) { tree = tree.insert(entry); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createFromMap(EntryComparator<K, V> entryComparator, java.util.Map<? extends K, ? extends V> map) { Objects.requireNonNull(map, "map is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (java.util.Map.Entry<K, V> entry : ((java.util.Map<K, V>) map).entrySet()) { tree = tree.insert(Tuple.of(entry.getKey(), entry.getValue())); } return new TreeMap<>(tree); }
@SafeVarargs private static <K, V> TreeMap<K, V> createFromMapEntries(EntryComparator<K, V> entryComparator, java.util.Map.Entry<? extends K, ? extends V>... entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (java.util.Map.Entry<? extends K, ? extends V> entry : entries) { final K key = entry.getKey(); final V value = entry.getValue(); tree = tree.insert(Tuple.of(key, value)); } return new TreeMap<>(tree); }
private static <K, K2, V, V2> TreeMap<K2, V2> createTreeMap(EntryComparator<K2, V2> entryComparator, Iterable<Tuple2<K, V>> entries, Function<Tuple2<K, V>, Tuple2<K2, V2>> entryMapper) { RedBlackTree<Tuple2<K2, V2>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<K, V> entry : entries) { tree = tree.insert(entryMapper.apply(entry)); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createFromTuples(EntryComparator<K, V> entryComparator, Tuple2<? extends K, ? extends V>... entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<? extends K, ? extends V> entry : entries) { tree = tree.insert((Tuple2<K, V>) entry); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") static <T> RedBlackTree<T> ofAll(Comparator<? super T> comparator, Iterable<? extends T> values) { Objects.requireNonNull(comparator, "comparator is null"); Objects.requireNonNull(values, "values is null"); // function equality is not computable => same object check if (values instanceof RedBlackTree && ((RedBlackTree<T>) values).comparator() == comparator) { return (RedBlackTree<T>) values; } else { RedBlackTree<T> tree = empty(comparator); for (T value : values) { tree = tree.insert(value); } return tree; } }
@Override public TreeSet<T> addAll(Iterable<? extends T> elements) { Objects.requireNonNull(elements, "elements is null"); RedBlackTree<T> that = tree; for (T element : elements) { if (!that.contains(element)) { that = that.insert(element); } } if (tree == that) { return this; } else { return new TreeSet<>(that); } }
@Override public TreeSet<T> add(T element) { return contains(element) ? this : new TreeSet<>(tree.insert(element)); }
@Override public TreeSet<T> replace(T currentElement, T newElement) { if (tree.contains(currentElement)) { return new TreeSet<>(tree.delete(currentElement).insert(newElement)); } else { return this; } }
@Override public TreeMap<K, V> retainAll(Iterable<? extends Tuple2<K, V>> elements) { Objects.requireNonNull(elements, "elements is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entries.comparator()); for (Tuple2<K, V> entry : elements) { if (contains(entry)) { tree = tree.insert(entry); } } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createFromPairs(EntryComparator<K, V> entryComparator, Object... pairs) { RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (int i = 0; i < pairs.length; i += 2) { final K key = (K) pairs[i]; final V value = (V) pairs[i + 1]; tree = tree.insert(Tuple.of(key, value)); } return new TreeMap<>(tree); }
@Override public TreeMap<K, V> put(K key, V value) { return new TreeMap<>(entries.insert(new Tuple2<>(key, value))); }
static <T> RedBlackTree<T> join(RedBlackTree<T> t1, T value, RedBlackTree<T> t2) { if (t1.isEmpty()) { return t2.insert(value); } else if (t2.isEmpty()) { return t1.insert(value); } else { final Node<T> n1 = (Node<T>) t1; final Node<T> n2 = (Node<T>) t2; final int comparison = n1.blackHeight - n2.blackHeight; if (comparison < 0) { return Node.joinLT(n1, value, n2, n1.blackHeight).color(BLACK); } else if (comparison > 0) { return Node.joinGT(n1, value, n2, n2.blackHeight).color(BLACK); } else { return new Node<>(BLACK, n1.blackHeight + 1, n1, value, n2, n1.empty); } } }
private static <K, K2, V, V2> TreeMap<K2, V2> createTreeMap(EntryComparator<K2, V2> entryComparator, Iterable<Tuple2<K, V>> entries, Function<Tuple2<K, V>, Tuple2<K2, V2>> entryMapper) { RedBlackTree<Tuple2<K2, V2>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<K, V> entry : entries) { tree = tree.insert(entryMapper.apply(entry)); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createFromTuples(EntryComparator<K, V> entryComparator, Tuple2<? extends K, ? extends V>... entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<? extends K, ? extends V> entry : entries) { tree = tree.insert((Tuple2<K, V>) entry); } return new TreeMap<>(tree); }
@SafeVarargs private static <K, V> TreeMap<K, V> createFromMapEntries(EntryComparator<K, V> entryComparator, java.util.Map.Entry<? extends K, ? extends V>... entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (java.util.Map.Entry<? extends K, ? extends V> entry : entries) { final K key = entry.getKey(); final V value = entry.getValue(); tree = tree.insert(Tuple.of(key, value)); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createTreeMap(EntryComparator<K, V> entryComparator, Iterable<? extends Tuple2<? extends K, ? extends V>> entries) { Objects.requireNonNull(entries, "entries is null"); RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (Tuple2<K, V> entry : (Iterable<Tuple2<K, V>>) entries) { tree = tree.insert(entry); } return new TreeMap<>(tree); }
@SuppressWarnings("unchecked") private static <K, V> TreeMap<K, V> createFromPairs(EntryComparator<K, V> entryComparator, Object... pairs) { RedBlackTree<Tuple2<K, V>> tree = RedBlackTree.empty(entryComparator); for (int i = 0; i < pairs.length; i += 2) { final K key = (K) pairs[i]; final V value = (V) pairs[i + 1]; tree = tree.insert(Tuple.of(key, value)); } return new TreeMap<>(tree); }
@Override public TreeSet<T> replace(T currentElement, T newElement) { if (tree.contains(currentElement)) { return new TreeSet<>(tree.delete(currentElement).insert(newElement)); } else { return this; } }