001    /*
002     * Created on Oct 23, 2010
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * the License. You may obtain a copy of the License at
006     *
007     * http://www.apache.org/licenses/LICENSE-2.0
008     *
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     *
013     * Copyright @2010-2011 the original author or authors.
014     */
015    package org.fest.assertions.data;
016    
017    import static org.fest.util.Objects.*;
018    
019    /**
020     * A positive offset.
021     * @param <T> the type of the offset value.
022     *
023     * @author Alex Ruiz
024     * @author Yvonne Wang
025     */
026    public class Offset<T extends Number> {
027    
028      /** The value of this offset. */
029      public final T value;
030    
031      /**
032       * Creates a new double </code>{@link Offset}</code>.
033       * @param value the value of the offset.
034       * @return the created {@code Offset}.
035       * @throws NullPointerException if the given value is {@code null}.
036       * @throws IllegalArgumentException if the given value is negative.
037       */
038      public static Offset<Double> offset(Double value) {
039        checkIsNotNull(value);
040        if (value.doubleValue() < 0d) throw valueNotPositive();
041        return new Offset<Double>(value);
042      }
043    
044      /**
045       * Creates a new float </code>{@link Offset}</code>.
046       * @param value the value of the offset.
047       * @return the created {@code Offset}.
048       * @throws NullPointerException if the given value is {@code null}.
049       * @throws IllegalArgumentException if the given value is negative.
050       */
051      public static Offset<Float> offset(Float value) {
052        checkIsNotNull(value);
053        if (value.floatValue() < 0f) throw valueNotPositive();
054        return new Offset<Float>(value);
055      }
056    
057      /**
058       * Creates a new integer </code>{@link Offset}</code>.
059       * @param value the value of the offset.
060       * @return the created {@code Offset}.
061       * @throws NullPointerException if the given value is {@code null}.
062       * @throws IllegalArgumentException if the given value is negative.
063       */
064      public static Offset<Integer> offset(Integer value) {
065        checkIsNotNull(value);
066        if (value.intValue() < 0) throw valueNotPositive();
067        return new Offset<Integer>(value);
068      }
069    
070      private static <T extends Number> void checkIsNotNull(T value) {
071        if (value == null) throw new NullPointerException("The value of the offset to create should not be null");
072      }
073    
074      private static IllegalArgumentException valueNotPositive() {
075        return new IllegalArgumentException("The value of the offset should be greater than zero");
076      }
077    
078      private Offset(T value) {
079        this.value = value;
080      }
081    
082      @Override public boolean equals(Object obj) {
083        if (this == obj) return true;
084        if (obj == null) return false;
085        if (getClass() != obj.getClass()) return false;
086        Offset<?> other = (Offset<?>) obj;
087        return (areEqual(value, other.value));
088      }
089    
090      @Override public int hashCode() {
091        int result = 1;
092        result = HASH_CODE_PRIME * result + hashCodeFor(value);
093        return result;
094      }
095    
096      @Override public String toString() {
097        return String.format("%s[value=%s]", getClass().getSimpleName(), value);
098      }
099    }