diff options
author | Yohann Roussel <yroussel@google.com> | 2014-03-19 16:25:37 +0100 |
---|---|---|
committer | Yohann Roussel <yroussel@google.com> | 2014-03-20 15:13:33 +0100 |
commit | 4eceb95409e844fdc33c9c706e1dc307bfd40303 (patch) | |
tree | ee9f4f3fc79f757c79081c336bce4f1782c6ccd8 /guava/src/com/google/common/hash/AbstractCompositeHashFunction.java | |
parent | 3d2402901b1a6462e2cf47a6fd09711f327961c3 (diff) | |
download | toolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.zip toolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.tar.gz toolchain_jack-4eceb95409e844fdc33c9c706e1dc307bfd40303.tar.bz2 |
Initial Jack import.
Change-Id: I953cf0a520195a7187d791b2885848ad0d5a9b43
Diffstat (limited to 'guava/src/com/google/common/hash/AbstractCompositeHashFunction.java')
-rw-r--r-- | guava/src/com/google/common/hash/AbstractCompositeHashFunction.java | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java new file mode 100644 index 0000000..e0b074f --- /dev/null +++ b/guava/src/com/google/common/hash/AbstractCompositeHashFunction.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2011 The Guava Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.common.hash; + +import java.nio.charset.Charset; + +/** + * An abstract composition of multiple hash functions. {@linkplain #newHasher()} delegates to the + * {@code Hasher} objects of the delegate hash functions, and in the end, they are used by + * {@linkplain #makeHash(Hasher[])} that constructs the final {@code HashCode}. + * + * @author Dimitris Andreou + */ +abstract class AbstractCompositeHashFunction extends AbstractStreamingHashFunction { + final HashFunction[] functions; + + AbstractCompositeHashFunction(HashFunction... functions) { + this.functions = functions; + } + + /** + * Constructs a {@code HashCode} from the {@code Hasher} objects of the functions. Each of them + * has consumed the entire input and they are ready to output a {@code HashCode}. The order of + * the hashers are the same order as the functions given to the constructor. + */ + // this could be cleaner if it passed HashCode[], but that would create yet another array... + /* protected */ abstract HashCode makeHash(Hasher[] hashers); + + @Override + public Hasher newHasher() { + final Hasher[] hashers = new Hasher[functions.length]; + for (int i = 0; i < hashers.length; i++) { + hashers[i] = functions[i].newHasher(); + } + return new Hasher() { + @Override public Hasher putByte(byte b) { + for (Hasher hasher : hashers) { + hasher.putByte(b); + } + return this; + } + + @Override public Hasher putBytes(byte[] bytes) { + for (Hasher hasher : hashers) { + hasher.putBytes(bytes); + } + return this; + } + + @Override public Hasher putBytes(byte[] bytes, int off, int len) { + for (Hasher hasher : hashers) { + hasher.putBytes(bytes, off, len); + } + return this; + } + + @Override public Hasher putShort(short s) { + for (Hasher hasher : hashers) { + hasher.putShort(s); + } + return this; + } + + @Override public Hasher putInt(int i) { + for (Hasher hasher : hashers) { + hasher.putInt(i); + } + return this; + } + + @Override public Hasher putLong(long l) { + for (Hasher hasher : hashers) { + hasher.putLong(l); + } + return this; + } + + @Override public Hasher putFloat(float f) { + for (Hasher hasher : hashers) { + hasher.putFloat(f); + } + return this; + } + + @Override public Hasher putDouble(double d) { + for (Hasher hasher : hashers) { + hasher.putDouble(d); + } + return this; + } + + @Override public Hasher putBoolean(boolean b) { + for (Hasher hasher : hashers) { + hasher.putBoolean(b); + } + return this; + } + + @Override public Hasher putChar(char c) { + for (Hasher hasher : hashers) { + hasher.putChar(c); + } + return this; + } + + @Override public Hasher putString(CharSequence chars) { + for (Hasher hasher : hashers) { + hasher.putString(chars); + } + return this; + } + + @Override public Hasher putString(CharSequence chars, Charset charset) { + for (Hasher hasher : hashers) { + hasher.putString(chars, charset); + } + return this; + } + + @Override public <T> Hasher putObject(T instance, Funnel<? super T> funnel) { + for (Hasher hasher : hashers) { + hasher.putObject(instance, funnel); + } + return this; + } + + @Override public HashCode hash() { + return makeHash(hashers); + } + }; + } + + private static final long serialVersionUID = 0L; +} |