00001
00018 module mango.locks.TimeUnit;
00019
00044 enum TimeUnit {
00045 NanoSeconds = 0,
00046 MicroSeconds,
00047 MilliSeconds,
00048 Seconds
00049 }
00050
00052 private const int[TimeUnit.max+1] multipliers = [
00053 1,
00054 1000,
00055 1000_000,
00056 1000_000_000
00057 ];
00058
00064 private const long[TimeUnit.max+1] overflows = [
00065 0,
00066 long.max / 1000,
00067 long.max / 1000_000,
00068 long.max / 1000_000_000
00069 ];
00070
00078 private static long doConvert(int delta, long duration) {
00079 if (delta == 0)
00080 return duration;
00081 if (delta < 0)
00082 return duration / multipliers[-delta];
00083 if (duration > overflows[delta])
00084 return long.max;
00085 if (duration < -overflows[delta])
00086 return long.min;
00087 return duration * multipliers[delta];
00088 }
00089
00107 long convert(long duration, TimeUnit fromUnit, TimeUnit toUnit) {
00108 return doConvert(fromUnit - toUnit, duration);
00109 }
00110
00119 long toNanos(long duration, TimeUnit fromUnit) {
00120 return doConvert(fromUnit, duration);
00121 }
00122
00131 long toMicros(long duration, TimeUnit fromUnit) {
00132 return doConvert(fromUnit - TimeUnit.MicroSeconds, duration);
00133 }
00134
00143 long toMillis(long duration, TimeUnit fromUnit) {
00144 return doConvert(fromUnit - TimeUnit.MilliSeconds, duration);
00145 }
00146
00153 long toSeconds(long duration, TimeUnit fromUnit) {
00154 return doConvert(fromUnit - TimeUnit.Seconds, duration);
00155 }