KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > math > MulUnit


1 // Copyright (c) 1997 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.math;
5 import java.io.*;
6
7 /** A Unit which is the product or ratio of two other Units.
8  * @author Per Bothner
9  */

10
11 class MulUnit extends Unit implements Externalizable
12 {
13   Unit unit1;
14   Unit unit2;
15   int power1;
16   int power2;
17   MulUnit next;
18
19   MulUnit (Unit unit1, int power1, Unit unit2, int power2)
20   {
21     this.unit1 = unit1;
22     this.unit2 = unit2;
23     this.power1 = power1;
24     this.power2 = power2;
25     this.dims = Dimensions.product (unit1.dims, power1, unit2.dims, power2);
26
27     if (power1 == 1)
28       factor = unit1.factor;
29     else
30       factor = Math.pow (unit1.factor, (double) power1);
31     if (power2 < 0)
32       {
33     for (int i = -power2; --i >= 0; )
34       factor /= unit2.factor;
35       }
36     else
37       {
38     for (int i = power2; --i >= 0; )
39       factor *= unit2.factor;
40       }
41
42     next = unit1.products;
43     unit1.products = this;
44   }
45
46   MulUnit (Unit unit1, Unit unit2, int power2)
47   {
48     this (unit1, 1, unit2, power2);
49   }
50
51   public String JavaDoc toString ()
52   {
53     StringBuffer JavaDoc str = new StringBuffer JavaDoc(60);
54     str.append(unit1);
55     if (power1 != 1)
56       {
57     str.append('^');
58     str.append(power1);
59       }
60     if (power2 != 0)
61       {
62     str.append('*');
63     str.append(unit2);
64     if (power2 != 1)
65       {
66         str.append('^');
67         str.append(power2);
68       }
69       }
70     return str.toString();
71   }
72
73   public Unit sqrt ()
74   {
75     if ((power1 & 1) == 0 && (power2 & 1) == 0)
76       return times(unit1, power1 >> 1, unit2, power2 >> 1);
77     return super.sqrt();
78   }
79
80   static MulUnit lookup (Unit unit1, int power1, Unit unit2, int power2)
81   {
82     // Search for an existing matching MulUnit.
83
for (MulUnit u = unit1.products; u != null; u = u.next)
84       {
85     if (u.unit1 == unit1 && u.unit2 == unit2
86         && u.power1 == power1 && u.power2 == power2)
87       return u;
88       }
89     return null;
90   }
91
92   public static MulUnit make (Unit unit1, int power1, Unit unit2, int power2)
93   {
94     MulUnit u = lookup(unit1, power1, unit2, power2);
95     if (u != null)
96       return u;
97     return new MulUnit (unit1, power1, unit2, power2);
98   }
99
100   /**
101    * @serialData
102    */

103
104   public void writeExternal(ObjectOutput out) throws IOException
105   {
106     out.writeObject(unit1);
107     out.writeInt(power1);
108     out.writeObject(unit2);
109     out.writeInt(power2);
110   }
111
112   public void readExternal(ObjectInput in)
113     throws IOException, ClassNotFoundException JavaDoc
114   {
115     unit1 = (Unit) in.readObject();
116     power1 = in.readInt();
117     unit2 = (Unit) in.readObject();
118     power2 = in.readInt();
119   }
120
121   public Object JavaDoc readResolve() throws ObjectStreamException
122   {
123     MulUnit u = lookup(unit1, power1, unit2, power2);
124     if (u != null)
125       return u;
126     return this;
127   }
128 }
129
Popular Tags