10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/*
20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * This file is a modified version of
30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/TimeUnit.java
40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * which contained the following notice:
50888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Written by Doug Lea with assistance from members of JCP JSR-166
70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Expert Group and released to the public domain, as explained at
80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://creativecommons.org/publicdomain/zero/1.0/
90888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
100888a09821a98ac0680fad765217302858e70fa4Paul Duffin
110888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage java.util.concurrent;
120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
130888a09821a98ac0680fad765217302858e70fa4Paul Duffin/**
140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * GWT emulation of TimeUnit, created by removing unsupported operations from
150888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Doug Lea's public domain version.
160888a09821a98ac0680fad765217302858e70fa4Paul Duffin */
170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic enum TimeUnit {
180888a09821a98ac0680fad765217302858e70fa4Paul Duffin  NANOSECONDS {
190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return d; }
200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return d/(C1/C0); }
210888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return d/(C2/C0); }
220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return d/(C3/C0); }
230888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return d/(C4/C0); }
240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d/(C5/C0); }
250888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C0); }
260888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toNanos(d); }
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return (int)(d - (m*C2)); }
280888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
290888a09821a98ac0680fad765217302858e70fa4Paul Duffin  MICROSECONDS {
300888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C1/C0, MAX/(C1/C0)); }
310888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return d; }
320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return d/(C2/C1); }
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return d/(C3/C1); }
340888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return d/(C4/C1); }
350888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d/(C5/C1); }
360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C1); }
370888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toMicros(d); }
380888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return (int)((d*C1) - (m*C2)); }
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
400888a09821a98ac0680fad765217302858e70fa4Paul Duffin  MILLISECONDS {
410888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C2/C0, MAX/(C2/C0)); }
420888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return x(d, C2/C1, MAX/(C2/C1)); }
430888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return d; }
440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return d/(C3/C2); }
450888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return d/(C4/C2); }
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d/(C5/C2); }
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C2); }
480888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toMillis(d); }
490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return 0; }
500888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
510888a09821a98ac0680fad765217302858e70fa4Paul Duffin  SECONDS {
520888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C3/C0, MAX/(C3/C0)); }
530888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return x(d, C3/C1, MAX/(C3/C1)); }
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return x(d, C3/C2, MAX/(C3/C2)); }
550888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return d; }
560888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return d/(C4/C3); }
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d/(C5/C3); }
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C3); }
590888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toSeconds(d); }
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return 0; }
610888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
620888a09821a98ac0680fad765217302858e70fa4Paul Duffin  MINUTES {
630888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C4/C0, MAX/(C4/C0)); }
640888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return x(d, C4/C1, MAX/(C4/C1)); }
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return x(d, C4/C2, MAX/(C4/C2)); }
660888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return x(d, C4/C3, MAX/(C4/C3)); }
670888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return d; }
680888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d/(C5/C4); }
690888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C4); }
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toMinutes(d); }
710888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return 0; }
720888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
730888a09821a98ac0680fad765217302858e70fa4Paul Duffin  HOURS {
740888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C5/C0, MAX/(C5/C0)); }
750888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return x(d, C5/C1, MAX/(C5/C1)); }
760888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return x(d, C5/C2, MAX/(C5/C2)); }
770888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return x(d, C5/C3, MAX/(C5/C3)); }
780888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return x(d, C5/C4, MAX/(C5/C4)); }
790888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return d; }
800888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d/(C6/C5); }
810888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toHours(d); }
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return 0; }
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin  },
840888a09821a98ac0680fad765217302858e70fa4Paul Duffin  DAYS {
850888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toNanos(long d)   { return x(d, C6/C0, MAX/(C6/C0)); }
860888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMicros(long d)  { return x(d, C6/C1, MAX/(C6/C1)); }
870888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMillis(long d)  { return x(d, C6/C2, MAX/(C6/C2)); }
880888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toSeconds(long d) { return x(d, C6/C3, MAX/(C6/C3)); }
890888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toMinutes(long d) { return x(d, C6/C4, MAX/(C6/C4)); }
900888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toHours(long d)   { return x(d, C6/C5, MAX/(C6/C5)); }
910888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long toDays(long d)    { return d; }
920888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public long convert(long d, TimeUnit u) { return u.toDays(d); }
930888a09821a98ac0680fad765217302858e70fa4Paul Duffin    int excessNanos(long d, long m) { return 0; }
940888a09821a98ac0680fad765217302858e70fa4Paul Duffin  };
950888a09821a98ac0680fad765217302858e70fa4Paul Duffin
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin  // Handy constants for conversion methods
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C0 = 1L;
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C1 = C0 * 1000L;
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C2 = C1 * 1000L;
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C3 = C2 * 1000L;
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C4 = C3 * 60L;
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C5 = C4 * 60L;
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long C6 = C5 * 24L;
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static final long MAX = Long.MAX_VALUE;
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin  static long x(long d, long m, long over) {
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (d >  over) return Long.MAX_VALUE;
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin    if (d < -over) return Long.MIN_VALUE;
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    return d * m;
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  // exceptions below changed from AbstractMethodError for GWT
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long convert(long sourceDuration, TimeUnit sourceUnit) {
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toNanos(long duration) {
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toMicros(long duration) {
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toMillis(long duration) {
1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toSeconds(long duration) {
1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toMinutes(long duration) {
1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toHours(long duration) {
1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public long toDays(long duration) {
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin    throw new AssertionError();
1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin  abstract int excessNanos(long d, long m);
1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin}
149