Remove Indexed.cast()
[controller.git] / third-party / atomix / utils / src / main / java / io / atomix / utils / misc / ArraySizeHashPrinter.java
1 /*
2  * Copyright 2014-present Open Networking Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package io.atomix.utils.misc;
18
19 import com.google.common.base.MoreObjects;
20 import com.google.common.base.MoreObjects.ToStringHelper;
21
22 import java.lang.reflect.Array;
23 import java.util.Arrays;
24
25 /**
26  * Helper to print Object[] length and hashCode.
27  */
28 public final class ArraySizeHashPrinter {
29
30   /**
31    * Returns ByteArraySizeHashPrinter wrapping given short[].
32    *
33    * @param array arrays to wrap around
34    * @return ObjectArraySizeHashPrinter
35    */
36   public static ArraySizeHashPrinter of(byte[] array) {
37     return new ArraySizeHashPrinter(toObjectArray(array), byte[].class);
38   }
39
40   /**
41    * Returns ByteArraySizeHashPrinter wrapping given short[].
42    *
43    * @param array arrays to wrap around
44    * @return ObjectArraySizeHashPrinter
45    */
46   public static ArraySizeHashPrinter of(short[] array) {
47     return new ArraySizeHashPrinter(toObjectArray(array), short[].class);
48   }
49
50   /**
51    * Returns ByteArraySizeHashPrinter wrapping given int[].
52    *
53    * @param array arrays to wrap around
54    * @return ObjectArraySizeHashPrinter
55    */
56   public static ArraySizeHashPrinter of(int[] array) {
57     return new ArraySizeHashPrinter(toObjectArray(array), int[].class);
58   }
59
60   /**
61    * Returns ByteArraySizeHashPrinter wrapping given long[].
62    *
63    * @param array arrays to wrap around
64    * @return ObjectArraySizeHashPrinter
65    */
66   public static ArraySizeHashPrinter of(long[] array) {
67     return new ArraySizeHashPrinter(toObjectArray(array), long[].class);
68   }
69
70   /**
71    * Returns ByteArraySizeHashPrinter wrapping given float[].
72    *
73    * @param array arrays to wrap around
74    * @return ObjectArraySizeHashPrinter
75    */
76   public static ArraySizeHashPrinter of(float[] array) {
77     return new ArraySizeHashPrinter(toObjectArray(array), float[].class);
78   }
79
80   /**
81    * Returns ByteArraySizeHashPrinter wrapping given double[].
82    *
83    * @param array arrays to wrap around
84    * @return ObjectArraySizeHashPrinter
85    */
86   public static ArraySizeHashPrinter of(double[] array) {
87     return new ArraySizeHashPrinter(toObjectArray(array), double[].class);
88   }
89
90   /**
91    * Returns ByteArraySizeHashPrinter wrapping given boolean[].
92    *
93    * @param array arrays to wrap around
94    * @return ObjectArraySizeHashPrinter
95    */
96   public static ArraySizeHashPrinter of(boolean[] array) {
97     return new ArraySizeHashPrinter(toObjectArray(array), boolean[].class);
98   }
99
100   /**
101    * Returns ByteArraySizeHashPrinter wrapping given Object[].
102    *
103    * @param array arrays to wrap around
104    * @return ObjectArraySizeHashPrinter
105    */
106   public static ArraySizeHashPrinter of(Object[] array) {
107     return new ArraySizeHashPrinter(array, Object[].class);
108   }
109
110   private static Object[] toObjectArray(Object val) {
111     if (val == null) {
112       return null;
113     }
114     if (val instanceof Object[]) {
115       return (Object[]) val;
116     }
117     int length = Array.getLength(val);
118     Object[] outputArray = new Object[length];
119     for (int i = 0; i < length; ++i) {
120       outputArray[i] = Array.get(val, i);
121     }
122     return outputArray;
123   }
124
125   private final Object[] array;
126   private final Class<?> type;
127
128   public ArraySizeHashPrinter(Object[] array, Class<?> type) {
129     this.array = array;
130     this.type = type;
131   }
132
133   @Override
134   public String toString() {
135     ToStringHelper helper = MoreObjects.toStringHelper(type);
136     if (array != null) {
137       helper.add("length", array.length)
138           .add("hash", Arrays.hashCode(array));
139     } else {
140       helper.addValue(array);
141     }
142     return helper.toString();
143   }
144 }