Skip to content

Commit

Permalink
Merge pull request #62 from eddelbuettel/fix/zero_length_ops
Browse files Browse the repository at this point in the history
fix 0-length vector ops; closes #61
  • Loading branch information
eddelbuettel committed Mar 29, 2020
2 parents 1632081 + 26b3202 commit 4083c03
Show file tree
Hide file tree
Showing 12 changed files with 512 additions and 270 deletions.
16 changes: 15 additions & 1 deletion ChangeLog
@@ -1,3 +1,17 @@
2020-03-29 Leonardo Silvestri <lsilvestri@ztsdb.org>

* DESCRIPTION: fixed 0-length-vector ops
* R/RcppExports.R: Idem
* R/nanoperiod.R: Idem
* inst/include/utilities.hpp: Idem
* inst/tinytest/test_nanoival.R: Idem
* inst/tinytest/test_nanoperiod.R: Idem
* inst/tinytest/test_nanotime.R: Idem
* src/RcppExports.cpp: Idem
* src/interval.cpp: Idem
* src/nanotime.cpp: Idem
* src/period.cpp: Idem

2020-03-27 Leonardo Silvestri <lsilvestri@ztsdb.org>

* DESCRIPTION: added %in%.nanotime
Expand All @@ -13,7 +27,7 @@
* man/set_operations.Rd: Idem
* src/RcppExports.cpp: Idem
* src/interval.cpp: Idem

2020-03-25 Dirk Eddelbuettel <edd@debian.org>

* DESCRIPTION (Version, Date): Roll minor version
Expand Down
4 changes: 2 additions & 2 deletions DESCRIPTION
@@ -1,8 +1,8 @@
Package: nanotime
Type: Package
Title: Nanosecond-Resolution Time for R
Version: 0.2.4.5.1
Date: 2020-03-27
Version: 0.2.4.5.2
Date: 2020-03-29
Author: Dirk Eddelbuettel and Leonardo Silvestri
Maintainer: Dirk Eddelbuettel <edd@debian.org>
Description: Full 64-bit resolution date and time support with resolution up
Expand Down
4 changes: 4 additions & 0 deletions R/RcppExports.R
Expand Up @@ -145,6 +145,10 @@ period_from_string_impl <- function(str) {
.Call(`_nanotime_period_from_string_impl`, str)
}

period_from_parts_impl <- function(months_v, days_v, dur_v) {
.Call(`_nanotime_period_from_parts_impl`, months_v, days_v, dur_v)
}

period_to_string_impl <- function(prd) {
.Call(`_nanotime_period_to_string_impl`, prd)
}
Expand Down
16 changes: 8 additions & 8 deletions R/nanoperiod.R
Expand Up @@ -76,7 +76,7 @@ nanoperiod <- function(months=0, days=0, duration=as.nanoduration(0)) {
if (nargs() == 0) {
as.nanoperiod(NULL)
} else {
as.nanoperiod(paste0(as.integer64(months), "m", as.integer64(days), "d", "/", as.nanoduration(duration)))
period_from_parts_impl(as.integer(months), as.integer(days), as.nanoduration(duration))
}
}

Expand All @@ -92,7 +92,7 @@ setGeneric("as.nanoperiod", function(x) standardGeneric("as.nanoperiod"))
setMethod("as.nanoperiod",
"character",
function(x) {
new("nanoperiod", period_from_string_impl(x))
period_from_string_impl(x)
})

setAs("character", "nanoperiod", function(from) as.nanoperiod(from))
Expand All @@ -101,7 +101,7 @@ setAs("character", "nanoperiod", function(from) as.nanoperiod(from))
setMethod("as.nanoperiod",
"integer64",
function(x) {
new("nanoperiod", period_from_integer64_impl(x))
period_from_integer64_impl(x)
})

setAs("integer64", "nanoperiod", function(from) as.nanoperiod(from))
Expand All @@ -110,7 +110,7 @@ setAs("integer64", "nanoperiod", function(from) as.nanoperiod(from))
setMethod("as.nanoperiod",
"numeric",
function(x) {
new("nanoperiod", period_from_double_impl(x))
period_from_double_impl(x)
})

setAs("numeric", "nanoperiod", function(from) as.nanoperiod(from))
Expand All @@ -119,7 +119,7 @@ setAs("numeric", "nanoperiod", function(from) as.nanoperiod(from))
setMethod("as.nanoperiod",
"integer",
function(x) {
new("nanoperiod", period_from_integer_impl(x))
period_from_integer_impl(x)
})

setAs("integer", "nanoperiod", function(from) as.nanoperiod(from))
Expand All @@ -128,7 +128,7 @@ setAs("integer", "nanoperiod", function(from) as.nanoperiod(from))
setMethod("as.nanoperiod",
"nanoduration",
function(x) {
new("nanoperiod", period_from_integer64_impl(x))
period_from_integer64_impl(x)
})

setAs("nanoduration", "nanoperiod", function(from) as.nanoperiod(from))
Expand All @@ -137,14 +137,14 @@ setAs("nanoduration", "nanoperiod", function(from) as.nanoperiod(from))
setMethod("as.nanoperiod",
"NULL",
function(x) {
new("nanoperiod", period_from_string_impl(character()))
period_from_string_impl(character())
})

##' @rdname nanoperiod
setMethod("as.nanoperiod",
"missing",
function(x) {
new("nanoperiod", period_from_string_impl(character()))
period_from_string_impl(character())
})


Expand Down
36 changes: 36 additions & 0 deletions inst/include/utilities.hpp
Expand Up @@ -76,5 +76,41 @@ inline void checkVectorsLengths(SEXP x, SEXP y) {
}
}

inline void checkVectorsLengths(SEXP x, SEXP y, SEXP z) {
checkVectorsLengths(x, y);
checkVectorsLengths(x, z);
checkVectorsLengths(y, z);
}

inline void checkVectorsLengths(SEXP x, SEXP y, SEXP z, SEXP u) {
checkVectorsLengths(x, y, z);
checkVectorsLengths(x, y, u);
checkVectorsLengths(y, z, u);
}

inline ssize_t getVectorLengths(SEXP x, SEXP y) {
if (XLENGTH(x) == 0 || XLENGTH(y) == 0) {
return 0;
} else {
return std::max(XLENGTH(x), XLENGTH(y));
}
}

inline ssize_t getVectorLengths(SEXP x, SEXP y, SEXP z) {
if (XLENGTH(x) == 0 || XLENGTH(y) == 0 || XLENGTH(z) == 0) {
return 0;
} else {
return std::max(XLENGTH(x), std::max(XLENGTH(y), XLENGTH(z)));
}
}

inline ssize_t getVectorLengths(SEXP x, SEXP y, SEXP z, SEXP u) {
if (XLENGTH(x) == 0 || XLENGTH(y) == 0 || XLENGTH(z) == 0 || XLENGTH(u)==0) {
return 0;
} else {
return std::max(std::max(XLENGTH(x), XLENGTH(y)), std::max(XLENGTH(z), XLENGTH(u)));
}
}


#endif
85 changes: 73 additions & 12 deletions inst/tinytest/test_nanoival.R
Expand Up @@ -68,17 +68,35 @@ expect_identical(nanoival(), as.nanoival())
expect_identical(length(as.nanoival()), 0L)

##test_nanoival_vector<- function() {
starts <- c(nanotime("2013-01-01 00:00:00"),
nanotime("2014-01-01 00:00:00"),
nanotime("2015-01-01 00:00:00"),
nanotime("2016-01-01 00:00:00"))
ends <- c(nanotime("2014-01-01 00:00:00"),
nanotime("2015-01-01 00:00:00"),
nanotime("2016-01-01 00:00:00"),
nanotime("2017-01-01 00:00:00"))
sopens <- c(FALSE, FALSE, TRUE, TRUE)
eopens <- c(TRUE, FALSE, TRUE, FALSE)
expect_identical(nanoival(starts, ends, sopens, eopens), as.nanoival(c(aa, bb, cc, dd)))
starts <- c(nanotime("2013-01-01 00:00:00"),
nanotime("2014-01-01 00:00:00"),
nanotime("2015-01-01 00:00:00"),
nanotime("2016-01-01 00:00:00"))
ends <- c(nanotime("2014-01-01 00:00:00"),
nanotime("2015-01-01 00:00:00"),
nanotime("2016-01-01 00:00:00"),
nanotime("2017-01-01 00:00:00"))
sopens <- c(FALSE, FALSE, TRUE, TRUE)
eopens <- c(TRUE, FALSE, TRUE, FALSE)
expect_identical(nanoival(starts, ends, sopens, eopens), as.nanoival(c(aa, bb, cc, dd)))

## different vector lengths:
starts <- nanotime(1:3)
ends <- nanotime(4)
sopens <- c(TRUE, TRUE, TRUE)
eopens <- c(FALSE, FALSE, FALSE)
expect_identical(nanoival(starts, ends, sopens, eopens),
c(nanoival(nanotime(1), nanotime(4), TRUE, FALSE),
nanoival(nanotime(2), nanotime(4), TRUE, FALSE),
nanoival(nanotime(3), nanotime(4), TRUE, FALSE)))
expect_identical(nanoival(starts, ends, sopens[1], eopens),
c(nanoival(nanotime(1), nanotime(4), TRUE, FALSE),
nanoival(nanotime(2), nanotime(4), TRUE, FALSE),
nanoival(nanotime(3), nanotime(4), TRUE, FALSE)))
expect_identical(nanoival(starts[1], ends, sopens, eopens[1]),
c(nanoival(nanotime(1), nanotime(4), TRUE, FALSE),
nanoival(nanotime(1), nanotime(4), TRUE, FALSE),
nanoival(nanotime(1), nanotime(4), TRUE, FALSE)))


## show/print/format
Expand Down Expand Up @@ -1349,6 +1367,49 @@ expect_identical(seq(x, y, length.out=4),
seq(nanoival.end(x), by=as.nanoperiod("1d"), length.out=4, tz="UTC"),
FALSE, TRUE))


## 0-length ops:
## ------------

## constructor:
expect_identical(nanoival(nanotime(), nanotime(1)), nanoival())
expect_identical(nanoival(nanotime(), nanotime()), nanoival())
expect_identical(nanoival(nanotime(1), nanotime()), nanoival())
expect_identical(nanoival(nanotime(1), nanotime(2), logical()), nanoival())
expect_identical(nanoival(nanotime(1), nanotime(2), logical(), logical()), nanoival())
expect_identical(nanoival(nanotime(), nanotime(), logical(), logical()), nanoival())

expect_identical(as.nanoival(character()), nanoival())

## Comp:
expect_identical(nanoival(nanotime(1), nanotime(2)) > nanoival(), logical())
expect_identical(nanoival(nanotime(1), nanotime(2)) < nanoival(), logical())
expect_identical(nanoival() <= nanoival(nanotime(1), nanotime(2)) , logical())
expect_identical(nanoival() != nanoival(nanotime(1), nanotime(2)) , logical())

## ops
expect_identical(nanoival(nanotime(1), nanotime(2)) + integer(), as.nanoival())
expect_identical(nanoival(nanotime(1), nanotime(2)) - integer(), as.nanoival())
expect_identical(integer() + nanoival(), as.nanoival())

## accessors
expect_identical(nanoival.start(nanoival()), nanotime())
expect_identical(nanoival.end(nanoival()), nanotime())
expect_identical(nanoival.sopen(nanoival()), logical())
expect_identical(nanoival.eopen(nanoival()), logical())

## set ops:
expect_identical(union(nanoival(nanotime(1), nanotime(2)), nanoival()), nanoival(nanotime(1), nanotime(2)))
expect_identical(intersect(nanoival(nanotime(1), nanotime(2)), nanoival()), nanoival())
expect_identical(setdiff(nanoival(nanotime(1), nanotime(2)), nanoival()), nanoival(nanotime(1), nanotime(2)))
expect_identical(setdiff.idx(nanotime(), nanoival()), numeric())
expect_identical(setdiff.idx(nanotime(1), nanoival()), 1)
expect_identical(setdiff.idx(nanotime(), nanoival(nanotime(1), nanotime(2))), numeric())
expect_identical(intersect(nanotime(1), nanoival()), nanotime())
expect_identical(intersect(nanotime(), nanoival(nanotime(1), nanotime(2))), nanotime())
expect_identical(intersect.idx(nanotime(1), nanoival()), list(x=numeric(), y=numeric()))
expect_identical(intersect.idx(nanotime(), nanoival(nanotime(1), nanotime(2))), list(x=numeric(), y=numeric()))
expect_identical(nanotime() %in% nanoival(nanotime(1), nanotime(2)), logical(0))
expect_identical(nanotime(1:10) %in% nanoival(), rep(FALSE, 10))
expect_identical(is.na(as.nanoival()), logical())

options(nanotimeFormat=savedFormat)
35 changes: 34 additions & 1 deletion inst/tinytest/test_nanoperiod.R
Expand Up @@ -573,4 +573,37 @@ expect_identical(as.nanoperiod(as.integer64(hour)), as(hour, "nanoperiod"))
expect_identical(as.nanoperiod(hour), as(hour, "nanoperiod"))
expect_identical(as.nanoperiod(hour), as(as.nanoduration(hour), "nanoperiod"))

## test 'seq' where 'by' is 'period':
## 0-length ops:
## ------------

## constructor:

expect_identical(nanoperiod(integer(), integer(), nanoduration()), nanoperiod())
expect_identical(nanoperiod(1, 1, nanoduration()), nanoperiod())
expect_identical(nanoperiod(1,integer(), as.nanoduration(1)), nanoperiod())
expect_identical(nanoperiod(numeric(), integer(), as.nanoduration(1)), nanoperiod())
expect_identical(nanoperiod(character()), nanoperiod())

## Comp:
expect_identical(as.nanoperiod() == as.nanoperiod(), logical())
expect_identical(as.nanoperiod(1) == as.nanoperiod(), logical())
expect_identical(as.nanoperiod(1) != as.nanoperiod(), logical())


## ops
expect_identical(as.nanoperiod() + as.nanoperiod(), as.nanoperiod())
expect_identical(nanoperiod(1) + as.nanoperiod(), as.nanoperiod())
expect_identical(nanoperiod() + as.nanoperiod(1:10), as.nanoperiod())
expect_identical(nanoperiod() + as.nanoduration(1:10), as.nanoperiod())
expect_identical(nanoperiod() + as.integer64(1:10), as.nanoperiod())
expect_identical(nanoperiod(1) + as.integer(), as.nanoperiod())
expect_identical(as.nanoperiod() - as.nanoperiod(), as.nanoperiod())
expect_identical(nanoperiod(1) - as.nanoperiod(), as.nanoperiod())
expect_identical(nanoperiod() - as.nanoperiod(1:10), as.nanoperiod())
expect_identical(nanoperiod() * 3, as.nanoperiod())
expect_identical(nanoperiod(1) * integer(), as.nanoperiod())

## accessors
expect_identical(nanoperiod.month(nanoperiod()), numeric())
expect_identical(nanoperiod.day(nanoperiod()), numeric())
expect_identical(nanoperiod.nanoduration(nanoperiod()), as.nanoduration())
25 changes: 25 additions & 0 deletions inst/tinytest/test_nanotime.R
Expand Up @@ -566,3 +566,28 @@ if (!isSolaris) {
expect_error(nano_month(as.nanotime("2020-03-14 23:32:00-04:00"), "America/Nu_York"), "Cannot retrieve timezone")
expect_error(nano_year(as.nanotime("2020-03-14 23:32:00-04:00"), "America/Nu_York"), "Cannot retrieve timezone")
}


## 0-length ops:
## ------------

## constructor:
expect_identical(nanotime(character(), character()), nanotime())
expect_identical(nanotime(character(), tz="America/New_York"), nanotime())
expect_identical(nanotime("2020-03-28 UTC", tz=character()), nanotime())

## accessors/funcs
expect_identical(nano_wday(nanotime(), tz=character()), integer())
expect_identical(nano_wday(nanotime(1), tz=character()), integer())
expect_identical(nano_wday(nanotime(), tz="America/New_York"), integer())
expect_identical(nano_mday(nanotime(), tz=character()), integer())
expect_identical(nano_mday(nanotime(1), tz=character()), integer())
expect_identical(nano_mday(nanotime(), tz="America/New_York"), integer())
expect_identical(nano_month(nanotime(), tz=character()), integer())
expect_identical(nano_month(nanotime(1), tz=character()), integer())
expect_identical(nano_month(nanotime(), tz="America/New_York"), integer())
expect_identical(nano_year(nanotime(), tz=character()), integer())
expect_identical(nano_year(nanotime(1), tz=character()), integer())
expect_identical(nano_year(nanotime(), tz="America/New_York"), integer())


0 comments on commit 4083c03

Please sign in to comment.