Why is SysTime.init invalid?

ed sillymongrel at gmail.com
Thu Apr 3 00:13:58 PDT 2014


On Thursday, 3 April 2014 at 06:23:40 UTC, Jonathan M Davis wrote:
> On Tuesday, April 01, 2014 03:54:07 Jonathan M Davis wrote:
>> On Tuesday, April 01, 2014 05:35:28 ed wrote:
>> > OK, lazy me just read the std.satetime article again. It 
>> > appears
>> > the design is for no invalid values and it is currently a 
>> > known
>> > limitation due to CTFE.
>> > 
>> > ---
>> > d_time_nan	There is no equivalent. SysTime.init, which has a 
>> > null
>> > TimeZone object, would be the closest, but once CTFE 
>> > advances to
>> > the point that you can new up class objects with it,
>> > SysTime.init's timezone will be LocalTime, so don't rely on
>> > SysTime.init being invalid. std.datetime in general tries to
>> > avoid having any invalid states for any of its types. It's
>> > intended that creating such values be impossible.
>> > ---
>> > 
>> > I would still like to know if there is a way around this so 
>> > I can
>> > have my struct default init.
>> 
>> You can certainly have a struct with a SysTime member, but 
>> there's no way
>> for it to use that SysTime without first assigning a valid 
>> value to it - at
>> least, not without segfaulting when it tries to use the 
>> SysTime in any
>> context which it would use its timezone member.
>> 
>> If you really want to have the SysTime be useable in the init 
>> value of your
>> struct, then you can make it so that each of its member 
>> functions which use
>> the SysTime member check it for validity first (or have a 
>> separate bool
>> which indicates whether the SysTime has been assigned to or 
>> not), in which
>> case, it could assign something like SysTime(0) to it, which 
>> would be the
>> valid equivalent of SysTime.init.
>> 
>> Unfortunately, that does add extra overhead, but there isn't 
>> any way around
>> it if you want to have the SysTime be used without having the 
>> user of the
>> struct assign to it first. It's pretty much the same boat that 
>> SysTime
>> itself is in. I could make it so that it checks the timezone 
>> for null every
>> time it's used and assign LocalTime to it if it's null, but 
>> that adds
>> constant overhead. My decision was that it was better to just 
>> live with the
>> fact that SysTime.init is invalid. It's debatable though, as 
>> it's a
>> trade-off.
>
> Actually, after thinking about this more after someone opened a 
> bug on the
> fact that SysTime.init.toString() segfaults (since the timezone 
> is null)
>
> https://d.puremagic.com/issues/show_bug.cgi?id=12507
>
> I think that I have a solution. It's now possible to 
> default-intialize the
> timezonet to UTC so that SysTime.init is equivalent to 
> SysTime(0, UTC()). It's
> not ideal, because it's not SysTime(0, LocalTime()), and 
> SysTime normally
> defaults to LocalTime, but it will never be possible to 
> default-initialize it
> to LocalTime thanks to the fact that it has to call tzset when 
> it's
> initialized.
>
> You can look my comments in the bug for more details. I've 
> opened a pull
> request with those changes, so the next release will probably 
> have a valid
> SysTime.init, even if it's not SysTime(0, LocalTime()) like 
> would be ideal.
>
> - Jonathan M Davis

I'll gladly switch to a default SysTime in the next release :)

I'm finding std.datetime very easy to use and overall a great 
API. Nice work!

Cheers,
ed







More information about the Digitalmars-d-learn mailing list