X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Futil%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Futil%2FOffsetMapCache.java;h=b7ba220379146dd6be14ca1d6eb30762fd9960b1;hb=24d06767f3a0ead8152a745fb05eda1d4a37ba77;hp=b9776e3421bab45dffdcaa6f0066d73e5a9be261;hpb=136f1755f17cfe70dfe854e9d886ac0eedf97c19;p=yangtools.git diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/OffsetMapCache.java b/common/util/src/main/java/org/opendaylight/yangtools/util/OffsetMapCache.java index b9776e3421..b7ba220379 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/OffsetMapCache.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/OffsetMapCache.java @@ -8,6 +8,7 @@ package org.opendaylight.yangtools.util; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Verify; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -15,7 +16,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.ImmutableSet; +import java.lang.reflect.Array; import java.util.Collection; +import java.util.Iterator; +import java.util.List; import java.util.Map; final class OffsetMapCache { @@ -63,4 +67,35 @@ final class OffsetMapCache { return offsets(ImmutableSet.copyOf(args)); } + + private static V[] adjustArray(final Map offsets, final List keys, final V[] array) { + @SuppressWarnings("unchecked") + final V[] ret = (V[]) Array.newInstance(array.getClass().getComponentType(), array.length); + + int i = 0; + for (final K k : keys) { + final Integer o = Verify.verifyNotNull(offsets.get(k), "Key %s not present in offsets %s", k, offsets); + ret[o] = array[i++]; + } + + return ret; + } + + static V[] adjustedArray(final Map offsets, final List keys, final V[] array) { + Verify.verify(offsets.size() == keys.size(), "Offsets %s do not match keys %s", offsets, keys); + + // This relies on the fact that offsets has an ascending iterator + final Iterator oi = offsets.keySet().iterator(); + final Iterator ki = keys.iterator(); + + while (oi.hasNext()) { + final K o = oi.next(); + final K k = ki.next(); + if (!k.equals(o)) { + return adjustArray(offsets, keys, array); + } + } + + return array; + } }