@SuppressWarnings("unchecked")
  public static <V> CharArrayMap<V> copy(final Map<?,? extends V> map) {
    if(map == EMPTY_MAP)
      return emptyMap();
    if(map instanceof CharArrayMap) {
      CharArrayMap<V> m = (CharArrayMap<V>) map;
      // use fast path instead of iterating all values
      // this is even on very small sets ~10 times faster than iterating
      final char[][] keys = new char[m.keys.length][];
      System.arraycopy(m.keys, 0, keys, 0, keys.length);
      final V[] values = (V[]) new Object[m.values.length];
      System.arraycopy(m.values, 0, values, 0, values.length);
      m = new CharArrayMap<>(m);
      m.keys = keys;
      m.values = values;
      return m;
    }
    // In jdk-9b54 or later, a plain diamond causes compile error with "-source 1.7":
    return new CharArrayMap<V>(map, false);
  }
Returns a copy of the given map as a {@link CharArrayMap}. If the given map
is a {@link CharArrayMap} the ignoreCase property will be preserved.

@param map
         a map to copy
@return a copy of the given map as a {@link CharArrayMap}. If the given map
        is a {@link CharArrayMap} the ignoreCase property as well as the
        matchVersion will be of the given map will be preserved.
linguistics/src/main/java/com/yahoo/language/simple/kstem/CharArrayMap.java