Creating a custom iota()

realhet real_het at hotmail.com
Thu May 12 20:10:25 UTC 2022


On Thursday, 12 May 2022 at 16:57:35 UTC, H. S. Teoh wrote:

> Does your DateTime type support the `++` operator?

It can't because I only want to use the quantities.si.Time type 
to do arithmetic with my DateTime. In my previous DateTime, it 
was a lot of problem that I was doing math on it's raw internal 
variable (which was a double where 1.0 meant 1 day.)
In the new version adding int(1) does a compilation error.
I will use 1*second or 1*day or 1*micro(second) instead. I will 
always state the measurement unit to avoid confusions.


> But I'm curious, why didn't you use std.datetime?

There are many weird reasons:
5 years ago I moved to DLang from Delphi. Since 20 years I always 
used the old  Borland date system whist stards in 1899, is an 
ieee double, 1 = 1 day. I only did stuff with local times, it was 
enough.
Recently I had to work with Python as well, and there I started 
to have problems with time synchronizations between the 2 
systems. I ended up sending the exact Borland time to the Python 
program and make my little routines to work with them exactly 
like I do 20 years ago in Delphi, 5 years ago in DLang. But I 
know it is not nice.
So a week ago I discovered the quantities package and I decided 
to rewrite my DateTime to use the Time type in that. It solves 
all my measurement unit madness in a very elegant way. So I also 
want those measurement units working in all my systems. (I have 
lengths, frequencies too)
For me std.datetime was not an option because that felt so big I 
scared of it at the first look. It's 1.5MB, the same size as my 
complete program I'm working on :D
I also hade a second based time measurement 'system', it used 
QueryPerformanceCounter. I want do discontinue that as well.

So these are the features of the new DateTime:
- small size: 64 uint is the internal format. (Half of 
std.systemtime, but it lacks timezone, it's only UTC internally).
- precise: 100.0/64 nanosecond is the smallest unit. It covers 
913 years.
- It was built around the new WinAPI 
GetSystemTimePreciseAsFileTime() It gives me 100ns resolution UTC 
time in less than 50ns. So that's why I don't need 
QueryPerformanceCounter anymore.
- The extra 6 bits under the 100ns ticks will be used for time 
based unique ID generation.  It's better for me than having 60000 
years at my hand.
- The integration with quantities.si makes my work much easier. I 
can't wait to use it in my program, as I knows physics things 
better than me, haha.


> std.range.recurrence.

Indeed, that's an option as well, I forgot about.

Thank You!





More information about the Digitalmars-d-learn mailing list