+
+ private static <T> Map<T, Integer> createMap(final Collection<T> keys) {
+ final Builder<T, Integer> b = ImmutableMap.builder();
+ int i = 0;
+
+ for (T arg : keys) {
+ b.put(arg, i++);
+ }
+
+ return b.build();
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T> Map<T, Integer> unorderedOffsets(final Set<T> args) {
+ final Map<T, Integer> existing = (Map<T, Integer>) UNORDERED_CACHE.getIfPresent(args);
+ if (existing != null) {
+ return existing;
+ }
+
+ final Map<T, Integer> newMap = createMap(args);
+ final Map<?, Integer> raced = UNORDERED_CACHE.asMap().putIfAbsent(newMap.keySet(), newMap);
+ return raced == null ? newMap : (Map<T, Integer>)raced;
+ }
+
+ private static <K, V> V[] adjustArray(final Map<K, Integer> offsets, final List<K> 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;
+ }