1 module logdefer.time.utils; 2 3 import logdefer.time.duration : Seconds, Millis, Micros, Nanos; 4 import unixtime : UnixTime, UnixTimeHiRes; 5 6 7 pure UnixTimeHiRes toUnixTimeHiRes(ADuration)(const ADuration aDuration) 8 { 9 static if (is(ADuration == Seconds)) 10 { 11 return UnixTimeHiRes(aDuration.value, 0); 12 } 13 else static if (is(ADuration == Millis)) 14 { 15 return UnixTimeHiRes(aDuration.value / 1_000, aDuration.value % 1_000 * 1_000_000); 16 } 17 else static if (is(ADuration == Micros)) 18 { 19 return UnixTimeHiRes(aDuration.value / 1_000_000, aDuration.value % 1_000_000 * 1_000); 20 } 21 else static if (is(ADuration == Nanos)) 22 { 23 return UnixTimeHiRes(aDuration.value / 1_000_000_000, aDuration.value % 1_000_000_000); 24 } 25 else 26 { 27 static assert(false, "Unknown duration"); 28 } 29 } 30 31 pure UnixTime toUnixTime(ADuration)(const ADuration aDuration) 32 { 33 static if (is(ADuration == Seconds)) 34 { 35 return UnixTime(aDuration.value); 36 } 37 else static if (is(ADuration == Millis)) 38 { 39 return UnixTime(aDuration.value / 1_000); 40 } 41 else static if (is(ADuration == Micros)) 42 { 43 return UnixTime(aDuration.value / 1_000_000); 44 } 45 else static if (is(ADuration == Nanos)) 46 { 47 return UnixTime(aDuration.value / 1_000_000_000); 48 } 49 else 50 { 51 static assert(false, "Unknown duration"); 52 } 53 } 54 55 pure ADuration toDuration(ADuration)(const UnixTimeHiRes start, const UnixTimeHiRes end) 56 { 57 return (end - start).toDuration!ADuration(); 58 } 59 60 pure ADuration toDuration(ADuration)(const UnixTime start, const UnixTime end) 61 { 62 return (end - start).toDuration!ADuration(); 63 } 64 65 pure ADuration toDuration(ADuration)(const UnixTimeHiRes timestamp) 66 { 67 static if (is(ADuration == Seconds)) 68 { 69 return Seconds(timestamp.seconds); 70 } 71 else static if (is(ADuration == Millis)) 72 { 73 return Millis(timestamp.seconds * 1_000 + timestamp.nanos / 1_000_000); 74 } 75 else static if (is(ADuration == Micros)) 76 { 77 return Micros(timestamp.seconds * 1_000_000 + timestamp.nanos / 1_000); 78 } 79 else static if (is(ADuration == Nanos)) 80 { 81 return Nanos(timestamp.seconds * 1_000_000_000 + timestamp.nanos); 82 } 83 else 84 { 85 static assert(false, "Unknown duration"); 86 } 87 } 88 89 pure ADuration toDuration(ADuration)(const UnixTime timestamp) 90 { 91 static if (is(ADuration == Seconds)) 92 { 93 return Seconds(timestamp.seconds); 94 } 95 else static if (is(ADuration == Millis)) 96 { 97 return Millis(timestamp.seconds * 1_000); 98 } 99 else static if (is(ADuration == Micros)) 100 { 101 return Micros(timestamp.seconds * 1_000_000); 102 } 103 else static if (is(ADuration == Nanos)) 104 { 105 return Nanos(timestamp.seconds * 1_000_000_000); 106 } 107 else 108 { 109 static assert(false, "Unknown duration"); 110 } 111 } 112 113 version(unittest) 114 { 115 import std.stdio : writeln; 116 } 117 118 unittest 119 { 120 writeln("[UnitTest utils] - toUnixTimeHiRes]"); 121 122 // Nanos 123 assert(Nanos(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0)); 124 assert(Nanos(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1)); 125 assert(Nanos(999_999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_999_999)); 126 assert(Nanos(1_000_000_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0)); 127 assert(Nanos(1_000_000_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1)); 128 assert(Nanos(79_231_938_229).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_938_229)); 129 130 assert(Nanos(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1)); 131 assert(Nanos(-999_999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_999_999)); 132 assert(Nanos(-1_000_000_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0)); 133 assert(Nanos(-1_000_000_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1)); 134 assert(Nanos(-79_231_938_229).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_938_229)); 135 136 // Micros 137 assert(Micros(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0)); 138 assert(Micros(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1_000)); 139 assert(Micros(999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_999_000)); 140 assert(Micros(1_000_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0)); 141 assert(Micros(1_000_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1_000)); 142 assert(Micros(79_231_938).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_938_000)); 143 144 assert(Micros(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1_000)); 145 assert(Micros(-999_999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_999_000)); 146 assert(Micros(-1_000_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0)); 147 assert(Micros(-1_000_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1_000)); 148 assert(Micros(-79_231_938).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_938_000)); 149 150 // Millis 151 assert(Millis(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0)); 152 assert(Millis(1).toUnixTimeHiRes() == UnixTimeHiRes(0, 1_000_000)); 153 assert(Millis(999).toUnixTimeHiRes() == UnixTimeHiRes(0, 999_000_000)); 154 assert(Millis(1_000).toUnixTimeHiRes() == UnixTimeHiRes(1, 0)); 155 assert(Millis(1_001).toUnixTimeHiRes() == UnixTimeHiRes(1, 1_000_000)); 156 assert(Millis(79_231).toUnixTimeHiRes() == UnixTimeHiRes(79, 231_000_000)); 157 158 assert(Millis(-1).toUnixTimeHiRes() == UnixTimeHiRes(0, -1_000_000)); 159 assert(Millis(-999).toUnixTimeHiRes() == UnixTimeHiRes(0, -999_000_000)); 160 assert(Millis(-1_000).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0)); 161 assert(Millis(-1_001).toUnixTimeHiRes() == UnixTimeHiRes(-1, -1_000_000)); 162 assert(Millis(-79_231).toUnixTimeHiRes() == UnixTimeHiRes(-79, -231_000_000)); 163 164 // Seconds 165 assert(Seconds(0).toUnixTimeHiRes() == UnixTimeHiRes(0, 0)); 166 assert(Seconds(1).toUnixTimeHiRes() == UnixTimeHiRes(1, 0)); 167 assert(Seconds(999).toUnixTimeHiRes() == UnixTimeHiRes(999, 0)); 168 assert(Seconds(-1).toUnixTimeHiRes() == UnixTimeHiRes(-1, 0)); 169 assert(Seconds(-999).toUnixTimeHiRes() == UnixTimeHiRes(-999, 0)); 170 } 171 172 unittest 173 { 174 writeln("[UnitTest utils] - toUnixTime"); 175 176 // Nanos 177 assert(Nanos(0).toUnixTime() == UnixTime(0)); 178 assert(Nanos(1).toUnixTime() == UnixTime(0)); 179 assert(Nanos(999_999_999).toUnixTime() == UnixTime(0)); 180 assert(Nanos(1_000_000_000).toUnixTime() == UnixTime(1)); 181 assert(Nanos(1_000_000_001).toUnixTime() == UnixTime(1)); 182 assert(Nanos(79_231_938_229).toUnixTime() == UnixTime(79)); 183 184 assert(Nanos(-1).toUnixTime() == UnixTime(0)); 185 assert(Nanos(-999_999_999).toUnixTime() == UnixTime(0)); 186 assert(Nanos(-1_000_000_000).toUnixTime() == UnixTime(-1)); 187 assert(Nanos(-1_000_000_001).toUnixTime() == UnixTime(-1)); 188 assert(Nanos(-79_231_938_229).toUnixTime() == UnixTime(-79)); 189 190 // Micros 191 assert(Micros(0).toUnixTime() == UnixTime(0)); 192 assert(Micros(1).toUnixTime() == UnixTime(0)); 193 assert(Micros(999_999).toUnixTime() == UnixTime(0)); 194 assert(Micros(1_000_000).toUnixTime() == UnixTime(1)); 195 assert(Micros(1_000_001).toUnixTime() == UnixTime(1)); 196 assert(Micros(79_231_938).toUnixTime() == UnixTime(79)); 197 198 assert(Micros(-1).toUnixTime() == UnixTime(0)); 199 assert(Micros(-999_999).toUnixTime() == UnixTime(0)); 200 assert(Micros(-1_000_000).toUnixTime() == UnixTime(-1)); 201 assert(Micros(-1_000_001).toUnixTime() == UnixTime(-1)); 202 assert(Micros(-79_231_938).toUnixTime() == UnixTime(-79)); 203 204 // Millis 205 assert(Millis(0).toUnixTime() == UnixTime(0)); 206 assert(Millis(1).toUnixTime() == UnixTime(0)); 207 assert(Millis(999).toUnixTime() == UnixTime(0)); 208 assert(Millis(1_000).toUnixTime() == UnixTime(1)); 209 assert(Millis(1_001).toUnixTime() == UnixTime(1)); 210 assert(Millis(79_231).toUnixTime() == UnixTime(79)); 211 212 assert(Millis(-1).toUnixTime() == UnixTime(0)); 213 assert(Millis(-999).toUnixTime() == UnixTime(0)); 214 assert(Millis(-1_000).toUnixTime() == UnixTime(-1)); 215 assert(Millis(-1_001).toUnixTime() == UnixTime(-1)); 216 assert(Millis(-79_231).toUnixTime() == UnixTime(-79)); 217 218 // Seconds 219 assert(Seconds(0).toUnixTime() == UnixTime(0)); 220 assert(Seconds(1).toUnixTime() == UnixTime(1)); 221 assert(Seconds(999).toUnixTime() == UnixTime(999)); 222 223 assert(Seconds(-1).toUnixTime() == UnixTime(-1)); 224 assert(Seconds(-999).toUnixTime() == UnixTime(-999)); 225 }