private void expand(int newCapacity) { byte[][] newNamesAndValues = new byte[newCapacity][]; if (!isEmpty()) { System.arraycopy(namesAndValues, 0, newNamesAndValues, 0, len()); } namesAndValues = newNamesAndValues; }
private void expand(int newCapacity) { byte[][] newNamesAndValues = new byte[newCapacity][]; if (!isEmpty()) { System.arraycopy(namesAndValues, 0, newNamesAndValues, 0, len()); } namesAndValues = newNamesAndValues; }
/** * Returns set of all keys in store. * * @return unmodifiable Set of keys */ @SuppressWarnings("deprecation") // The String ctor is deprecated, but fast. public Set<String> keys() { if (isEmpty()) { return Collections.emptySet(); } Set<String> ks = new HashSet<String>(size); for (int i = 0; i < size; i++) { ks.add(new String(name(i), 0 /* hibyte */)); } // immutable in case we decide to change the implementation later. return Collections.unmodifiableSet(ks); }
/** * Returns set of all keys in store. * * @return unmodifiable Set of keys */ @SuppressWarnings("deprecation") // The String ctor is deprecated, but fast. public Set<String> keys() { if (isEmpty()) { return Collections.emptySet(); } Set<String> ks = new HashSet<String>(size); for (int i = 0; i < size; i++) { ks.add(new String(name(i), 0 /* hibyte */)); } // immutable in case we decide to change the implementation later. return Collections.unmodifiableSet(ks); }
/** * Perform a simple merge of two sets of metadata. * * <p>This is a purely additive operation, because a single key can be associated with multiple * values. */ public void merge(Metadata other) { if (other.isEmpty()) { return; } int remaining = cap() - len(); if (isEmpty() || remaining < other.len()) { expand(len() + other.len()); } System.arraycopy(other.namesAndValues, 0, namesAndValues, len(), other.len()); size += other.size; }
/** * Perform a simple merge of two sets of metadata. * * <p>This is a purely additive operation, because a single key can be associated with multiple * values. */ public void merge(Metadata other) { if (other.isEmpty()) { return; } int remaining = cap() - len(); if (isEmpty() || remaining < other.len()) { expand(len() + other.len()); } System.arraycopy(other.namesAndValues, 0, namesAndValues, len(), other.len()); size += other.size; }
/** Remove all values for the given key. If there were no values, {@code null} is returned. */ public <T> Iterable<T> removeAll(Key<T> key) { if (isEmpty()) { return null; } int writeIdx = 0; int readIdx = 0; List<T> ret = null; for (; readIdx < size; readIdx++) { if (bytesEqual(key.asciiName(), name(readIdx))) { ret = ret != null ? ret : new ArrayList<T>(); ret.add(key.parseBytes(value(readIdx))); continue; } name(writeIdx, name(readIdx)); value(writeIdx, value(readIdx)); writeIdx++; } int newSize = writeIdx; // Multiply by two since namesAndValues is interleaved. Arrays.fill(namesAndValues, writeIdx * 2, len(), null); size = newSize; return ret; }
/** Remove all values for the given key. If there were no values, {@code null} is returned. */ public <T> Iterable<T> removeAll(Key<T> key) { if (isEmpty()) { return null; } int writeIdx = 0; int readIdx = 0; List<T> ret = null; for (; readIdx < size; readIdx++) { if (bytesEqual(key.asciiName(), name(readIdx))) { ret = ret != null ? ret : new ArrayList<T>(); ret.add(key.parseBytes(value(readIdx))); continue; } name(writeIdx, name(readIdx)); value(writeIdx, value(readIdx)); writeIdx++; } int newSize = writeIdx; // Multiply by two since namesAndValues is interleaved. Arrays.fill(namesAndValues, writeIdx * 2, len(), null); size = newSize; return ret; }
/** * Remove all values for the given key without returning them. This is a minor performance * optimization if you do not need the previous values. */ @ExperimentalApi("https://github.com/grpc/grpc-java/issues/4691") public <T> void discardAll(Key<T> key) { if (isEmpty()) { return; } int writeIdx = 0; int readIdx = 0; for (; readIdx < size; readIdx++) { if (bytesEqual(key.asciiName(), name(readIdx))) { continue; } name(writeIdx, name(readIdx)); value(writeIdx, value(readIdx)); writeIdx++; } int newSize = writeIdx; // Multiply by two since namesAndValues is interleaved. Arrays.fill(namesAndValues, writeIdx * 2, len(), null); size = newSize; }
/** * Remove all values for the given key without returning them. This is a minor performance * optimization if you do not need the previous values. */ @ExperimentalApi public <T> void discardAll(Key<T> key) { if (isEmpty()) { return; } int writeIdx = 0; int readIdx = 0; for (; readIdx < size; readIdx++) { if (bytesEqual(key.asciiName(), name(readIdx))) { continue; } name(writeIdx, name(readIdx)); value(writeIdx, value(readIdx)); writeIdx++; } int newSize = writeIdx; // Multiply by two since namesAndValues is interleaved. Arrays.fill(namesAndValues, writeIdx * 2, len(), null); size = newSize; }