1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) 6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it 8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free 9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option) 10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version. 11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT 13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details. 16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along 18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc., 19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.evaluation.value; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This DoubleValue represents a particular double value. 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratofinal class ParticularDoubleValue extends SpecificDoubleValue 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final double value; 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new particular double value. 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ParticularDoubleValue(double value) 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.value = value; 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for DoubleValue. 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public double value() 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return value; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations of unary methods of DoubleValue. 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue negate() 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(-value); 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public IntegerValue convertToInteger() 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularIntegerValue((int)value); 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public LongValue convertToLong() 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularLongValue((long)value); 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public FloatValue convertToFloat() 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularFloatValue((float)value); 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations of binary methods of DoubleValue. 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue generalize(DoubleValue other) 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.generalize(this); 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue add(DoubleValue other) 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Careful: -0.0 + 0.0 == 0.0 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang //return value == 0.0 ? other : other.add(this); 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return other.add(this); 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue subtract(DoubleValue other) 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Careful: -0.0 + 0.0 == 0.0 90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang //return value == 0.0 ? other.negate() : other.subtractFrom(this); 91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return other.subtractFrom(this); 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue subtractFrom(DoubleValue other) 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Careful: -0.0 + 0.0 == 0.0 97b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang //return value == 0.0 ? other : other.subtract(this); 98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return other.subtract(this); 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue multiply(DoubleValue other) 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.multiply(this); 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue divide(DoubleValue other) 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.divideOf(this); 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue divideOf(DoubleValue other) 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.divide(this); 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue remainder(DoubleValue other) 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.remainderOf(this); 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue remainderOf(DoubleValue other) 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.remainder(this); 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public IntegerValue compare(DoubleValue other) 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return other.compareReverse(this); 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations of binary DoubleValue methods with ParticularDoubleValue 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // arguments. 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue generalize(ParticularDoubleValue other) 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 137b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Also handle NaN and Infinity. 138b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return Double.doubleToRawLongBits(this.value) == 139b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Double.doubleToRawLongBits(other.value) ? 140b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang this : ValueFactory.DOUBLE_VALUE; 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue add(ParticularDoubleValue other) 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(this.value + other.value); 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue subtract(ParticularDoubleValue other) 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(this.value - other.value); 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue subtractFrom(ParticularDoubleValue other) 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(other.value - this.value); 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue multiply(ParticularDoubleValue other) 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(this.value * other.value); 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue divide(ParticularDoubleValue other) 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(this.value / other.value); 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue divideOf(ParticularDoubleValue other) 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(other.value / this.value); 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue remainder(ParticularDoubleValue other) 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(this.value % other.value); 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public DoubleValue remainderOf(ParticularDoubleValue other) 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return new ParticularDoubleValue(other.value % this.value); 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public IntegerValue compare(ParticularDoubleValue other) 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return this.value < other.value ? SpecificValueFactory.INTEGER_VALUE_M1 : 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.value == other.value ? SpecificValueFactory.INTEGER_VALUE_0 : 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato SpecificValueFactory.INTEGER_VALUE_1; 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Value. 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isParticular() 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return true; 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for Object. 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean equals(Object object) 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 203b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Also handle NaN and Infinity. 204b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return super.equals(object) && 205b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Double.doubleToLongBits(this.value) == 206b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang Double.doubleToLongBits(((ParticularDoubleValue)object).value); 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int hashCode() 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return super.hashCode() ^ 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (int)Double.doubleToLongBits(value); 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public String toString() 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return value+"d"; 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}