001 // Copyright 2010 Waterken Inc. under the terms of the MIT X license 002 // found at http://www.opensource.org/licenses/mit-license.html 003 package org.ref_send.brand; 004 005 import java.io.Serializable; 006 007 import org.joe_e.Powerless; 008 import org.ref_send.Record; 009 import org.ref_send.deserializer; 010 import org.ref_send.name; 011 012 /** 013 * A typed <code>long</code> value. 014 * @param <T> {@link #unit} type 015 */ 016 public class 017 Amount<T> implements Comparable<Amount<T>>, Powerless, Record, Serializable { 018 static private final long serialVersionUID = 1L; 019 020 /** 021 * unit of {@link #value} 022 */ 023 public final Brand<T> unit; 024 025 /** 026 * number of units 027 */ 028 public final long value; 029 030 /** 031 * Constructs an instance. 032 * @param unit {@link #unit} 033 * @param value {@link #value} 034 */ 035 public @deserializer 036 Amount(@name("unit") final Brand<T> unit, 037 @name("value") final long value) { 038 this.unit = unit; 039 this.value = value; 040 } 041 042 // java.lang.Object interface 043 044 public boolean 045 equals(final Object o) { 046 return null != o && Amount.class == o.getClass() && 047 value == ((Amount<?>)o).value && 048 Brand.equal(unit, ((Amount<?>)o).unit); 049 } 050 051 public int 052 hashCode() { return (int)(value ^ (value >>> Integer.SIZE)) + 0x0FAB4A2D; } 053 054 // java.lang.Comparable interface 055 056 public int 057 compareTo(final Amount<T> o) throws WrongBrand { 058 Brand.require(unit, o.unit); 059 return value < o.value ? -1 : value == o.value ? 0 : 1; 060 } 061 }