Skip to content

Commit

Permalink
Use native ints for the Date attributes
Browse files Browse the repository at this point in the history
Marginally makes Date handling faster.  At the expense of handling
1858-11-17 slower, as that is day 0 for daycount, and since daycount
is now a native, 0 now indicates not being set (rather then undefined).
  • Loading branch information
lizmat committed Feb 14, 2020
1 parent aefc851 commit 16962c8
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 38 deletions.
47 changes: 25 additions & 22 deletions src/core.c/Date.pm6
Expand Up @@ -33,9 +33,9 @@ my class Date does Dateish {
self!oor("Day",day,"1..{self!DAYS-IN-MONTH(year,month)}")
unless 1 <= day <= self!DAYS-IN-MONTH(year,month);

nqp::bindattr(self,Date,'$!year',year);
nqp::bindattr(self,Date,'$!month',month);
nqp::bindattr(self,Date,'$!day',day);
nqp::bindattr_i(self,Date,'$!year',year);
nqp::bindattr_i(self,Date,'$!month',month);
nqp::bindattr_i(self,Date,'$!day',day);
nqp::bindattr(self,Date,'&!formatter',formatter);
self
}
Expand Down Expand Up @@ -141,15 +141,16 @@ my class Date does Dateish {
self!new-from-daycount($daycount, &formatter, %_)
}

method !new-from-daycount($daycount, &formatter, %nameds --> Date:D) {
self!ymd-from-daycount($daycount, my $year, my $month, my $day);
method !new-from-daycount(int $daycount, &formatter, %nameds --> Date:D) {
self!ymd-from-daycount($daycount,
my int $year, my int $month, my int $day);
if nqp::eqaddr(self.WHAT,Date) {
my $new := nqp::create(self);
nqp::bindattr($new,Date,'$!year',nqp::decont($year));
nqp::bindattr($new,Date,'$!month',nqp::decont($month));
nqp::bindattr($new,Date,'$!day',nqp::decont($day));
nqp::bindattr_i($new,Date,'$!year',$year);
nqp::bindattr_i($new,Date,'$!month',$month);
nqp::bindattr_i($new,Date,'$!day',$day);
nqp::bindattr($new,Date,'&!formatter',nqp::decont(&formatter));
nqp::bindattr($new,Date,'$!daycount',nqp::decont($daycount));
nqp::bindattr_i($new,Date,'$!daycount',$daycount);
$new
}
else {
Expand Down Expand Up @@ -237,30 +238,32 @@ my class Date does Dateish {
}

my $new := nqp::clone(self);
nqp::bindattr($new,Date,'$!year',$year);
nqp::bindattr($new,Date,'$!month',$month);
nqp::bindattr($new,Date,'$!day',self!clip-day($year,$month,$!day))
nqp::bindattr_i($new,Date,'$!year',$year);
nqp::bindattr_i($new,Date,'$!month',$month);
nqp::bindattr_i($new,Date,'$!day',
self!clip-day($year,$month,$!day))
if $!day > 28;
nqp::bindattr($new,Date,'$!daycount',Int);
nqp::bindattr_i($new,Date,'$!daycount',0);
$new
}
else { # year
my int $year = $!year + $amount;

my $new := nqp::clone(self);
nqp::bindattr($new,Date,'$!year',$year);
nqp::bindattr($new,Date,'$!day',self!clip-day($year,$!month,$!day))
nqp::bindattr_i($new,Date,'$!year',$year);
nqp::bindattr_i($new,Date,'$!day',
self!clip-day($year,$!month,$!day))
if $!day > 28;
nqp::bindattr($new,Date,'$!daycount',Int);
nqp::bindattr_i($new,Date,'$!daycount',0);
$new
}
}

# Helper method to move a number of days within a month
method !move-days-within-month(int $days --> Date:D) {
my $new := nqp::clone(self);
nqp::bindattr($new,Date,'$!day', $!day + $days);
nqp::bindattr($new,Date,'$!daycount',$!daycount + $days)
nqp::bindattr_i($new,Date,'$!day', $!day + $days);
nqp::bindattr_i($new,Date,'$!daycount',$!daycount + $days)
if nqp::isconcrete($!daycount);
$new
}
Expand All @@ -272,11 +275,11 @@ my class Date does Dateish {
$daycount, my int $year, my int $month, my int $day);

my $new := nqp::clone(self);
nqp::bindattr($new,Date,'$!year',$year);
nqp::bindattr($new,Date,'$!month',$month);
nqp::bindattr($new,Date,'$!day',
nqp::bindattr_i($new,Date,'$!year',$year);
nqp::bindattr_i($new,Date,'$!month',$month);
nqp::bindattr_i($new,Date,'$!day',
$day < 28 ?? $day !! self!clip-day($year,$month,$day));
nqp::bindattr($new,Date,'$!daycount',$daycount);
nqp::bindattr_i($new,Date,'$!daycount',$daycount);
$new
}

Expand Down
8 changes: 4 additions & 4 deletions src/core.c/DateTime.pm6
Expand Up @@ -62,10 +62,10 @@ my class DateTime does Dateish {
Int:D \timezone,
&formatter
--> DateTime:D) {
nqp::bind($!year, year); # R#2581
nqp::bind($!month, month);
nqp::bind($!day, day);
nqp::bind(&!formatter, &formatter);
nqp::bindattr_i(self,DateTime,'$!year',year);
nqp::bindattr_i(self,DateTime,'$!month',month);
nqp::bindattr_i(self,DateTime,'$!day',day);
nqp::bindattr(self,DateTime,'&!formatter',&formatter);
$!hour := hour;
$!minute := minute;
$!second := second;
Expand Down
23 changes: 11 additions & 12 deletions src/core.c/Dateish.pm6
@@ -1,8 +1,8 @@
my role Dateish {
has Int $.year;
has Int $.month;
has Int $.day;
has Int $.daycount;
has int $.year;
has int $.month;
has int $.day;
has int $.daycount;
has &.formatter;

method IO(Dateish:D: --> IO::Path:D) { # because Dateish is not Cool
Expand Down Expand Up @@ -57,25 +57,24 @@ my role Dateish {
multi method gist(Dateish:D: --> Str:D) { self.Str }

method daycount(--> Int:D) {
nqp::if(
nqp::isconcrete($!daycount),
$!daycount,
$!daycount := self!calculate-daycount
)
$!daycount
?? $!daycount
!! ($!daycount = self!calculate-daycount)
}
method !calculate-daycount(--> Int:D) {
method !calculate-daycount() {
# taken from <http://www.merlyn.demon.co.uk/daycount.htm>
my int $d = $!day;
my int $m = $!month < 3 ?? $!month + 12 !! $!month;
my int $y = $!year - ($!month < 3);

-678973 + $d + (153 * $m - 2) div 5
+ 365 * $y + $y div 4
- $y div 100 + $y div 400
}

method !ymd-from-daycount($daycount,\year,\month,\day --> Nil) {
method !ymd-from-daycount(int $daycount, \year, \month, \day --> Nil) {
# taken from <http://www.merlyn.demon.co.uk/daycount.htm>
my Int $dc = $daycount.Int + 678881;
my Int $dc = $daycount + 678881;
my Int $ti = (4 * ($dc + 36525)) div 146097 - 1;
my Int $year = 100 * $ti;
my int $day = $dc - (36524 * $ti + ($ti div 4));
Expand Down

0 comments on commit 16962c8

Please sign in to comment.