1 /*
2  * This file is a modified version of
3  * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/TimeUnit.java
4  * which contained the following notice:
5  *
6  * Written by Doug Lea with assistance from members of JCP JSR-166
7  * Expert Group and released to the public domain, as explained at
8  * http://creativecommons.org/publicdomain/zero/1.0/
9  */
10 
11 package java.util.concurrent;
12 
13 /**
14  * GWT emulation of TimeUnit, created by removing unsupported operations from
15  * Doug Lea's public domain version.
16  */
17 public enum TimeUnit {
18   NANOSECONDS {
toNanos(long d)19     public long toNanos(long d)   { return d; }
toMicros(long d)20     public long toMicros(long d)  { return d/(C1/C0); }
toMillis(long d)21     public long toMillis(long d)  { return d/(C2/C0); }
toSeconds(long d)22     public long toSeconds(long d) { return d/(C3/C0); }
toMinutes(long d)23     public long toMinutes(long d) { return d/(C4/C0); }
toHours(long d)24     public long toHours(long d)   { return d/(C5/C0); }
toDays(long d)25     public long toDays(long d)    { return d/(C6/C0); }
convert(long d, TimeUnit u)26     public long convert(long d, TimeUnit u) { return u.toNanos(d); }
excessNanos(long d, long m)27     int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
28   },
29   MICROSECONDS {
toNanos(long d)30     public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
toMicros(long d)31     public long toMicros(long d)  { return d; }
toMillis(long d)32     public long toMillis(long d)  { return d/(C2/C1); }
toSeconds(long d)33     public long toSeconds(long d) { return d/(C3/C1); }
toMinutes(long d)34     public long toMinutes(long d) { return d/(C4/C1); }
toHours(long d)35     public long toHours(long d)   { return d/(C5/C1); }
toDays(long d)36     public long toDays(long d)    { return d/(C6/C1); }
convert(long d, TimeUnit u)37     public long convert(long d, TimeUnit u) { return u.toMicros(d); }
excessNanos(long d, long m)38     int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
39   },
40   MILLISECONDS {
toNanos(long d)41     public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }
toMicros(long d)42     public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }
toMillis(long d)43     public long toMillis(long d)  { return d; }
toSeconds(long d)44     public long toSeconds(long d) { return d/(C3/C2); }
toMinutes(long d)45     public long toMinutes(long d) { return d/(C4/C2); }
toHours(long d)46     public long toHours(long d)   { return d/(C5/C2); }
toDays(long d)47     public long toDays(long d)    { return d/(C6/C2); }
convert(long d, TimeUnit u)48     public long convert(long d, TimeUnit u) { return u.toMillis(d); }
excessNanos(long d, long m)49     int excessNanos(long d, long m) { return 0; }
50   },
51   SECONDS {
toNanos(long d)52     public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
toMicros(long d)53     public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
toMillis(long d)54     public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
toSeconds(long d)55     public long toSeconds(long d) { return d; }
toMinutes(long d)56     public long toMinutes(long d) { return d/(C4/C3); }
toHours(long d)57     public long toHours(long d)   { return d/(C5/C3); }
toDays(long d)58     public long toDays(long d)    { return d/(C6/C3); }
convert(long d, TimeUnit u)59     public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
excessNanos(long d, long m)60     int excessNanos(long d, long m) { return 0; }
61   },
62   MINUTES {
toNanos(long d)63     public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
toMicros(long d)64     public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
toMillis(long d)65     public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
toSeconds(long d)66     public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
toMinutes(long d)67     public long toMinutes(long d) { return d; }
toHours(long d)68     public long toHours(long d)   { return d/(C5/C4); }
toDays(long d)69     public long toDays(long d)    { return d/(C6/C4); }
convert(long d, TimeUnit u)70     public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
excessNanos(long d, long m)71     int excessNanos(long d, long m) { return 0; }
72   },
73   HOURS {
toNanos(long d)74     public long toNanos(long d)   { return x(d, C5/C0, MAX/(C5/C0)); }
toMicros(long d)75     public long toMicros(long d)  { return x(d, C5/C1, MAX/(C5/C1)); }
toMillis(long d)76     public long toMillis(long d)  { return x(d, C5/C2, MAX/(C5/C2)); }
toSeconds(long d)77     public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
toMinutes(long d)78     public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
toHours(long d)79     public long toHours(long d)   { return d; }
toDays(long d)80     public long toDays(long d)    { return d/(C6/C5); }
convert(long d, TimeUnit u)81     public long convert(long d, TimeUnit u) { return u.toHours(d); }
excessNanos(long d, long m)82     int excessNanos(long d, long m) { return 0; }
83   },
84   DAYS {
toNanos(long d)85     public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }
toMicros(long d)86     public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }
toMillis(long d)87     public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }
toSeconds(long d)88     public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
toMinutes(long d)89     public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
toHours(long d)90     public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }
toDays(long d)91     public long toDays(long d)    { return d; }
convert(long d, TimeUnit u)92     public long convert(long d, TimeUnit u) { return u.toDays(d); }
excessNanos(long d, long m)93     int excessNanos(long d, long m) { return 0; }
94   };
95 
96   // Handy constants for conversion methods
97   static final long C0 = 1L;
98   static final long C1 = C0 * 1000L;
99   static final long C2 = C1 * 1000L;
100   static final long C3 = C2 * 1000L;
101   static final long C4 = C3 * 60L;
102   static final long C5 = C4 * 60L;
103   static final long C6 = C5 * 24L;
104 
105   static final long MAX = Long.MAX_VALUE;
106 
x(long d, long m, long over)107   static long x(long d, long m, long over) {
108     if (d >  over) return Long.MAX_VALUE;
109     if (d < -over) return Long.MIN_VALUE;
110     return d * m;
111   }
112 
113   // exceptions below changed from AbstractMethodError for GWT
114 
convert(long sourceDuration, TimeUnit sourceUnit)115   public long convert(long sourceDuration, TimeUnit sourceUnit) {
116     throw new AssertionError();
117   }
118 
toNanos(long duration)119   public long toNanos(long duration) {
120     throw new AssertionError();
121   }
122 
toMicros(long duration)123   public long toMicros(long duration) {
124     throw new AssertionError();
125   }
126 
toMillis(long duration)127   public long toMillis(long duration) {
128     throw new AssertionError();
129   }
130 
toSeconds(long duration)131   public long toSeconds(long duration) {
132     throw new AssertionError();
133   }
134 
toMinutes(long duration)135   public long toMinutes(long duration) {
136     throw new AssertionError();
137   }
138 
toHours(long duration)139   public long toHours(long duration) {
140     throw new AssertionError();
141   }
142 
toDays(long duration)143   public long toDays(long duration) {
144     throw new AssertionError();
145   }
146 
excessNanos(long d, long m)147   abstract int excessNanos(long d, long m);
148 }
149