X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Futil%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Futil%2FMutableOffsetMap.java;h=2c3ea479a247f4f932aedcc71c6ead4e00676bc8;hb=24d06767f3a0ead8152a745fb05eda1d4a37ba77;hp=b49b51d493802f437b3cf7fd19140a2e737097ed;hpb=136f1755f17cfe70dfe854e9d886ac0eedf97c19;p=yangtools.git diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/MutableOffsetMap.java b/common/util/src/main/java/org/opendaylight/yangtools/util/MutableOffsetMap.java index b49b51d493..2c3ea479a2 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/MutableOffsetMap.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/MutableOffsetMap.java @@ -69,6 +69,46 @@ public abstract class MutableOffsetMap extends AbstractMap implement UnmodifiableMapPhase unmodifiedMap(final Map offsets, final V[] objects) { return new ImmutableOffsetMap.Ordered<>(offsets, objects); } + + @Override + SharedSingletonMap singletonMap() { + return SharedSingletonMap.orderedCopyOf(this); + } + } + + static final class Unordered extends MutableOffsetMap { + Unordered() { + super(new HashMap()); + } + + Unordered(final Map source) { + super(OffsetMapCache.unorderedOffsets(source.keySet()), source, new HashMap()); + } + + Unordered(final Map offsets, final V[] objects) { + super(offsets, objects, new HashMap()); + } + + @Override + Object removedObject() { + return null; + } + + @Override + UnmodifiableMapPhase modifiedMap(final List keys, final V[] objects) { + final Map offsets = OffsetMapCache.unorderedOffsets(keys); + return new ImmutableOffsetMap.Unordered<>(offsets, OffsetMapCache.adjustedArray(offsets, keys, objects)); + } + + @Override + UnmodifiableMapPhase unmodifiedMap(final Map offsets, final V[] objects) { + return new ImmutableOffsetMap.Unordered<>(offsets, objects); + } + + @Override + SharedSingletonMap singletonMap() { + return SharedSingletonMap.unorderedCopyOf(this); + } } private static final Object[] EMPTY_ARRAY = new Object[0]; @@ -103,25 +143,58 @@ public abstract class MutableOffsetMap extends AbstractMap implement this.needClone = false; } + /** + * @deprecated Use {@link #orderedCopyOf(Map)} or {@link #unorderedCopyOf(Map)} instead. + */ + @Deprecated public static MutableOffsetMap copyOf(final Map m) { - if (m instanceof MutableOffsetMap) { - return ((MutableOffsetMap) m).clone(); + return orderedCopyOf(m); + } + + public static MutableOffsetMap orderedCopyOf(final Map m) { + if (m instanceof Ordered) { + return ((Ordered) m).clone(); } if (m instanceof ImmutableOffsetMap) { final ImmutableOffsetMap om = (ImmutableOffsetMap) m; - return new MutableOffsetMap.Ordered<>(om.offsets(), om.objects()); + return new Ordered<>(om.offsets(), om.objects()); } - return new MutableOffsetMap.Ordered<>(m); + return new Ordered<>(m); } + public static MutableOffsetMap unorderedCopyOf(final Map m) { + if (m instanceof Unordered) { + return ((Unordered) m).clone(); + } + if (m instanceof ImmutableOffsetMap) { + final ImmutableOffsetMap om = (ImmutableOffsetMap) m; + return new Unordered<>(om.offsets(), om.objects()); + } + + return new Unordered<>(m); + } + + /** + * @deprecated Use {@link #ordered()} or {@link #unordered()} instead. + */ + @Deprecated public static MutableOffsetMap of() { + return ordered(); + } + + public static MutableOffsetMap ordered() { return new MutableOffsetMap.Ordered<>(); } + public static MutableOffsetMap unordered() { + return new MutableOffsetMap.Unordered<>(); + } + abstract Object removedObject(); abstract UnmodifiableMapPhase modifiedMap(List keys, V[] objects); abstract UnmodifiableMapPhase unmodifiedMap(Map offsets, V[] objects); + abstract SharedSingletonMap singletonMap(); @Override public final int size() { @@ -280,7 +353,7 @@ public abstract class MutableOffsetMap extends AbstractMap implement return ImmutableMap.of(); } if (s == 1) { - return SharedSingletonMap.copyOf(this); + return singletonMap(); } // Construct the set of keys