001package com.google.common.cache;
002
003import java.util.Arrays;
004import java.util.Objects;
005
006import com.google.common.base.Equivalence;
007
008public class DeepCacheBuilder {
009        public static final Equivalence<Object> DEEP_EQUIVALENCE = new Equivalence<Object>(){
010
011                @Override
012                protected boolean doEquivalent(Object a, Object b) {
013                        return Objects.deepEquals(a, b);
014                }
015
016                @Override
017                protected int doHash(Object object) {
018                        return deepHashCode(object);
019                }};
020                
021        public static final int deepHashCode(Object a){
022                if (a == null){
023            return 0;
024                }else if (a instanceof Object[]) {
025                        return Arrays.deepHashCode((Object[]) a);
026                } else if (a instanceof byte[]) {
027                        return Arrays.hashCode((byte[]) a);
028                } else if (a instanceof short[]) {
029                        return Arrays.hashCode((short[]) a);
030                } else if (a instanceof int[]) {
031                        return Arrays.hashCode((int[]) a);
032                } else if (a instanceof long[]) {
033                        return Arrays.hashCode((long[]) a);
034                } else if (a instanceof char[]) {
035                        return Arrays.hashCode((char[]) a);
036                } else if (a instanceof float[]) {
037                        return Arrays.hashCode((float[]) a);
038                } else if (a instanceof double[]) {
039                        return Arrays.hashCode((double[]) a);
040                } else if (a instanceof boolean[]) {
041                        return Arrays.hashCode((boolean[]) a);
042                } 
043                return a.hashCode();
044        }
045        public static final CacheBuilder<Object, Object> newBuilder(){
046                return newBuilder(DEEP_EQUIVALENCE,DEEP_EQUIVALENCE);
047        }
048        public static final CacheBuilder<Object, Object> newBuilder(
049                        Equivalence<Object> keyEquivalence,
050                        Equivalence<Object> valueEquivalence){
051                CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder();
052                if(keyEquivalence != null){
053                        builder.keyEquivalence(keyEquivalence);
054                }
055                if(valueEquivalence != null){
056                        builder.valueEquivalence(valueEquivalence);     
057                }
058                return builder;
059        }
060}