Skip to content

Commit

Permalink
Enhance API of read-only and immutable collection interfaces.
Browse files Browse the repository at this point in the history
  • Loading branch information
wrandelshofer committed Dec 22, 2023
1 parent 42a102a commit cb05ab0
Show file tree
Hide file tree
Showing 18 changed files with 327 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,5 @@
exports org.jhotdraw8.collection.reflect;
exports org.jhotdraw8.collection.pair;
exports org.jhotdraw8.collection.spliterator;
exports org.jhotdraw8.collection.transform;
exports org.jhotdraw8.collection.util;
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@
exports org.jhotdraw8.icollection.immutable;
exports org.jhotdraw8.icollection.readonly;
exports org.jhotdraw8.icollection.sequenced;
exports org.jhotdraw8.icollection.transform;
exports org.jhotdraw8.icollection;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,26 @@
import org.jhotdraw8.annotation.Nullable;
import org.jhotdraw8.icollection.facade.ReadOnlySetFacade;
import org.jhotdraw8.icollection.immutable.ImmutableMap;
import org.jhotdraw8.icollection.impl.champ.*;
import org.jhotdraw8.icollection.impl.champ.BitmapIndexedNode;
import org.jhotdraw8.icollection.impl.champ.ChampIterator;
import org.jhotdraw8.icollection.impl.champ.ChampSpliterator;
import org.jhotdraw8.icollection.impl.champ.ChangeEvent;
import org.jhotdraw8.icollection.impl.champ.Node;
import org.jhotdraw8.icollection.readonly.ReadOnlyMap;
import org.jhotdraw8.icollection.readonly.ReadOnlySet;
import org.jhotdraw8.icollection.serialization.MapSerializationProxy;
import org.jhotdraw8.icollection.transform.Transformer;

import java.io.ObjectStreamException;
import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.Spliterator;
import java.util.function.Function;

/**
* Implements the {@link ImmutableMap} interface using a Compressed Hash-Array
Expand Down Expand Up @@ -285,6 +295,15 @@ public int size() {
return new MutableChampMap<>(this);
}

@Override
public Transformer<ChampMap<K, V>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super ChampMap<K, V>, ? extends R> f) {
return f.apply(this);
}

@Override
public @NonNull MutableChampMap<K, V> asMap() {
return new MutableChampMap<>(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,25 @@
import org.jhotdraw8.annotation.NonNull;
import org.jhotdraw8.annotation.Nullable;
import org.jhotdraw8.icollection.immutable.ImmutableSet;
import org.jhotdraw8.icollection.impl.champ.*;
import org.jhotdraw8.icollection.impl.champ.BitmapIndexedNode;
import org.jhotdraw8.icollection.impl.champ.ChampIterator;
import org.jhotdraw8.icollection.impl.champ.ChampSpliterator;
import org.jhotdraw8.icollection.impl.champ.ChangeEvent;
import org.jhotdraw8.icollection.impl.champ.Node;
import org.jhotdraw8.icollection.readonly.ReadOnlyCollection;
import org.jhotdraw8.icollection.readonly.ReadOnlySet;
import org.jhotdraw8.icollection.serialization.SetSerializationProxy;
import org.jhotdraw8.icollection.transform.Transformer;

import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
import java.util.Random;
import java.util.Set;
import java.util.Spliterator;
import java.util.function.Function;


/**
Expand Down Expand Up @@ -249,6 +260,15 @@ public int size() {
return ReadOnlyCollection.iterableToString(this);
}

@Override
public Transformer<ChampSet<E>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super ChampSet<E>, ? extends R> f) {
return f.apply(this);
}

@Serial
private @NonNull Object writeReplace() {
return new SerializationProxy<>(this.toMutable());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,19 @@
import org.jhotdraw8.icollection.readonly.ReadOnlyList;
import org.jhotdraw8.icollection.readonly.ReadOnlySequencedCollection;
import org.jhotdraw8.icollection.serialization.ListSerializationProxy;
import org.jhotdraw8.icollection.transform.Transformer;

import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.AbstractList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Spliterator;
import java.util.function.Function;

/**
* Implements the {@link ImmutableList} interface using a bit-mapped trie
Expand Down Expand Up @@ -59,6 +68,7 @@
* @param <E> the element type
*/
public class VectorList<E> implements ImmutableList<E>, Serializable {
private static final VectorList<?> EMPTY = new VectorList<>();
final @NonNull BitMappedTrie<E> trie;
final int size;

Expand All @@ -70,23 +80,20 @@ private VectorList() {
size = 0;
}


VectorList(BitMappedTrie<E> trie, int size) {
this.trie = trie;
this.size = size;
}


private static final VectorList<?> EMPTY = new VectorList<>();

@SuppressWarnings("unchecked")
public static <T> VectorList<T> of() {
return (VectorList<T>) EMPTY;
}

@SuppressWarnings("unchecked")
@SafeVarargs
public static <T> VectorList<T> of(T... t) {
return new VectorList<T>(BitMappedTrie.ofAll(t), t.length);
return new VectorList<>(BitMappedTrie.ofAll(t), t.length);

}

Expand All @@ -104,10 +111,10 @@ public static <T> VectorList<T> copyOf(Iterable<? extends T> iterable) {
return (VectorList<T>) mc.toImmutable();
}
if (iterable instanceof Collection<?> c) {
return new VectorList<T>(BitMappedTrie.ofAll(c.toArray()), c.size());
return new VectorList<>(BitMappedTrie.ofAll(c.toArray()), c.size());
}
BitMappedTrie<T> root = BitMappedTrie.<T>empty().appendAll(iterable);
return root.length() == 0 ? of() : new VectorList<T>(root, root.length);
return root.length() == 0 ? of() : new VectorList<>(root, root.length);
}

@Override
Expand Down Expand Up @@ -317,6 +324,11 @@ public boolean contains(Object o) {
return false;
}

@Override
public int hashCode() {
return ReadOnlyList.iteratorToHashCode(iterator());
}

@Override
public @NonNull MutableVectorList<E> toMutable() {
return new MutableVectorList<>(this);
Expand All @@ -337,24 +349,13 @@ public boolean contains(Object o) {
return trie.spliterator(0, size(), Spliterator.SIZED | Spliterator.ORDERED | Spliterator.SUBSIZED);
}

private static class SerializationProxy<E> extends ListSerializationProxy<E> {
@Serial
private static final long serialVersionUID = 0L;

protected SerializationProxy(@NonNull List<E> target) {
super(target);
}

@Serial
@Override
protected @NonNull Object readResolve() {
return VectorList.of().addAll(deserialized);
}
@Override
public Transformer<VectorList<E>> transformed() {
return this::transform;
}

@Override
public int hashCode() {
return ReadOnlyList.iteratorToHashCode(iterator());
private <R> R transform(Function<? super VectorList<E>, ? extends R> f) {
return f.apply(this);
}

@Override
Expand All @@ -375,5 +376,20 @@ public String toString() {
return ReadOnlyCollection.iterableToString(this);
}

private static class SerializationProxy<E> extends ListSerializationProxy<E> {
@Serial
private static final long serialVersionUID = 0L;

protected SerializationProxy(@NonNull List<E> target) {
super(target);
}

@Serial
@Override
protected @NonNull Object readResolve() {
return VectorList.of().addAll(deserialized);
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,28 @@
import org.jhotdraw8.icollection.facade.ReadOnlySequencedMapFacade;
import org.jhotdraw8.icollection.immutable.ImmutableSequencedMap;
import org.jhotdraw8.icollection.impl.IdentityObject;
import org.jhotdraw8.icollection.impl.champ.*;
import org.jhotdraw8.icollection.impl.champ.BitmapIndexedNode;
import org.jhotdraw8.icollection.impl.champ.ChangeEvent;
import org.jhotdraw8.icollection.impl.champ.Node;
import org.jhotdraw8.icollection.impl.champ.ReverseTombSkippingVectorSpliterator;
import org.jhotdraw8.icollection.impl.champ.SequencedData;
import org.jhotdraw8.icollection.impl.champ.SequencedEntry;
import org.jhotdraw8.icollection.impl.champ.TombSkippingVectorSpliterator;
import org.jhotdraw8.icollection.readonly.ReadOnlyMap;
import org.jhotdraw8.icollection.readonly.ReadOnlySequencedMap;
import org.jhotdraw8.icollection.serialization.MapSerializationProxy;
import org.jhotdraw8.icollection.transform.Transformer;

import java.io.ObjectStreamException;
import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.AbstractMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Function;

/**
* Implements the {@link ImmutableSequencedMap} interface using a Compressed
Expand Down Expand Up @@ -428,6 +441,15 @@ public int size() {
return new MutableVectorMap<>(this);
}

@Override
public Transformer<VectorMap<K, V>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super VectorMap<K, V>, ? extends R> f) {
return f.apply(this);
}

@Override
public @NonNull MutableVectorMap<K, V> asMap() {
return new MutableVectorMap<>(this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,29 @@
import org.jhotdraw8.icollection.facade.ReadOnlySequencedSetFacade;
import org.jhotdraw8.icollection.immutable.ImmutableSequencedSet;
import org.jhotdraw8.icollection.impl.IdentityObject;
import org.jhotdraw8.icollection.impl.champ.*;
import org.jhotdraw8.icollection.impl.champ.BitmapIndexedNode;
import org.jhotdraw8.icollection.impl.champ.ChangeEvent;
import org.jhotdraw8.icollection.impl.champ.Node;
import org.jhotdraw8.icollection.impl.champ.ReverseTombSkippingVectorSpliterator;
import org.jhotdraw8.icollection.impl.champ.SequencedData;
import org.jhotdraw8.icollection.impl.champ.SequencedElement;
import org.jhotdraw8.icollection.impl.champ.TombSkippingVectorSpliterator;
import org.jhotdraw8.icollection.readonly.ReadOnlyCollection;
import org.jhotdraw8.icollection.readonly.ReadOnlySequencedSet;
import org.jhotdraw8.icollection.readonly.ReadOnlySet;
import org.jhotdraw8.icollection.serialization.SetSerializationProxy;
import org.jhotdraw8.icollection.transform.Transformer;

import java.io.Serial;
import java.io.Serializable;
import java.util.*;
import java.util.AbstractSet;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Function;


/**
Expand Down Expand Up @@ -436,6 +450,15 @@ public int size() {
return ReadOnlyCollection.iterableToString(this);
}

@Override
public Transformer<VectorSet<E>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super VectorSet<E>, ? extends R> f) {
return f.apply(this);
}

@Serial
private @NonNull Object writeReplace() {
return new SerializationProxy<>(toMutable());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,13 @@
import org.jhotdraw8.icollection.impl.iteration.Iterators;
import org.jhotdraw8.icollection.readonly.AbstractReadOnlyMap;
import org.jhotdraw8.icollection.readonly.ReadOnlyCollection;
import org.jhotdraw8.icollection.transform.Transformer;

import java.util.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;

/**
Expand Down Expand Up @@ -148,4 +153,15 @@ public boolean containsKey(@Nullable Object key) {
public @NonNull Map<K, V> toMutable() {
return cloneFunction.apply(target);
}

@Override
public Transformer<ImmutableMapFacade<K, V>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super ImmutableMapFacade<K, V>, ? extends R> f) {
return f.apply(this);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.jhotdraw8.icollection.impl.iteration.Iterators;
import org.jhotdraw8.icollection.readonly.AbstractReadOnlySet;
import org.jhotdraw8.icollection.readonly.ReadOnlyCollection;
import org.jhotdraw8.icollection.transform.Transformer;

import java.util.Collection;
import java.util.HashSet;
Expand Down Expand Up @@ -109,4 +110,15 @@ public boolean contains(Object o) {
public @NonNull Set<E> toMutable() {
return cloneFunction.apply(target);
}

@Override
public Transformer<ImmutableSetFacade<E>> transformed() {
return this::transform;
}

private <R> R transform(Function<? super ImmutableSetFacade<E>, ? extends R> f) {
return f.apply(this);
}


}
Loading

0 comments on commit cb05ab0

Please sign in to comment.