1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.google.common.primitives; 19 20 import static com.google.common.base.Preconditions.checkArgument; 21 import static com.google.common.base.Preconditions.checkNotNull; 22 23 import javax.annotation.CheckForNull; 24 25 /** 26 * Static utility methods derived from Android's {@code Integer.java}. 27 */ 28 final class AndroidInteger { 29 /** 30 * See {@link Ints#tryParse(String)} for the public interface. 31 */ 32 @CheckForNull 33 static Integer tryParse(String string) { 34 return tryParse(string, 10); 35 } 36 37 /** 38 * See {@link Ints#tryParse(String, int)} for the public interface. 39 */ 40 @CheckForNull 41 static Integer tryParse(String string, int radix) { 42 checkNotNull(string); 43 checkArgument(radix >= Character.MIN_RADIX, 44 "Invalid radix %s, min radix is %s", radix, Character.MIN_RADIX); 45 checkArgument(radix <= Character.MAX_RADIX, 46 "Invalid radix %s, max radix is %s", radix, Character.MAX_RADIX); 47 int length = string.length(), i = 0; 48 if (length == 0) { 49 return null; 50 } 51 boolean negative = string.charAt(i) == '-'; 52 if (negative && ++i == length) { 53 return null; 54 } 55 return tryParse(string, i, radix, negative); 56 } 57 58 @CheckForNull 59 private static Integer tryParse(String string, int offset, int radix, 60 boolean negative) { 61 int max = Integer.MIN_VALUE / radix; 62 int result = 0, length = string.length(); 63 while (offset < length) { 64 int digit = Character.digit(string.charAt(offset++), radix); 65 if (digit == -1) { 66 return null; 67 } 68 if (max > result) { 69 return null; 70 } 71 int next = result * radix - digit; 72 if (next > result) { 73 return null; 74 } 75 result = next; 76 } 77 if (!negative) { 78 result = -result; 79 if (result < 0) { 80 return null; 81 } 82 } 83 // For GWT where ints do not overflow 84 if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) { 85 return null; 86 } 87 return result; 88 } 89 90 private AndroidInteger() {} 91 } 92