Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 18 additions & 20 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
# Generated by roxygen2: do not edit by hand

S3method("!",integer64)
S3method("!=",integer64)
S3method("%%",integer64)
S3method("%*%",integer64)
S3method("%/%",integer64)
S3method("%in%",default)
S3method("%in%",integer64)
S3method("&",integer64)
S3method("*",integer64)
S3method("+",integer64)
S3method("-",integer64)
S3method("/",integer64)
S3method(":",default)
S3method(":",integer64)
S3method("<",integer64)
S3method("<=",integer64)
S3method("==",integer64)
S3method(">",integer64)
S3method(">=",integer64)
S3method("[",integer64)
S3method("[<-",integer64)
S3method("[[",integer64)
S3method("[[<-",integer64)
S3method("^",integer64)
S3method("length<-",integer64)
S3method("|",integer64)
S3method(`!=`,integer64)
S3method(`!`,integer64)
S3method(`%%`,integer64)
S3method(`%*%`,integer64)
S3method(`%/%`,integer64)
S3method(`&`,integer64)
S3method(`*`,integer64)
S3method(`+`,integer64)
S3method(`-`,integer64)
S3method(`/`,integer64)
S3method(`<=`,integer64)
S3method(`<`,integer64)
S3method(`==`,integer64)
S3method(`>=`,integer64)
S3method(`>`,integer64)
S3method(`^`,integer64)
S3method(`|`,integer64)
S3method(abs,integer64)
S3method(all,integer64)
S3method(all.equal,integer64)
Expand Down Expand Up @@ -184,7 +184,6 @@ S3method(tiepos,integer64)
S3method(trunc,integer64)
S3method(unipos,integer64)
S3method(unique,integer64)
S3method(xor,integer64)
export("%in%")
export("%in%.default")
export("%in%.integer64")
Expand Down Expand Up @@ -387,8 +386,8 @@ export(tiepos.integer64)
export(unipos)
export(unipos.integer64)
export(unique.integer64)
export(xor.integer64)
if (getRversion() >= "4.2.0") S3method(mtfrm,integer64)
if (getRversion() >= "4.3.0") S3method(chooseOpsMethod,integer64)
importFrom(bit,clone)
importFrom(bit,is.sorted)
importFrom(bit,keyorder)
Expand Down Expand Up @@ -416,7 +415,6 @@ importFrom(bit,shellorder)
importFrom(bit,shellsort)
importFrom(bit,shellsortorder)
importFrom(bit,still.identical)
importFrom(bit,xor)
importFrom(graphics,barplot)
importFrom(graphics,par)
importFrom(graphics,title)
Expand Down
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
- Ignores leading/trailing whitespace (as does `as.integer()`; #232).
1. `sortcache`, `sortordercache` and `ordercache` get a new argument `na.last`.
1. `matrix`, `array`, `%*%` and `as.matrix` get an `integer64` method (#45). Thanks @hcirellu.
1. The methods of the 'Ops' group (e.g. `+`, `&`, `==`) now support dispatch for both arguments so that e.g. `difftime * integer64` works consistent to R (>= 4.3.0) (#179). Thanks @hcirellu.

## BUG FIXES

Expand Down
77 changes: 41 additions & 36 deletions R/bit64-package.R
Original file line number Diff line number Diff line change
Expand Up @@ -85,37 +85,57 @@
#' example in [`c()`][c.integer64], [`cbind()`][cbind.integer64], and
#' [`rbind()`][rbind.integer64]
#'
#' Different from Base R, our operators [`+`][+.integer64], [`-`][-.integer64],
#' \code{\link[=xor.integer64]{\%/\%}}, and \code{\link[=xor.integer64]{\%\%}} coerce their arguments to
#' `integer64` and always return `integer64`.
#'
#' The multiplication operator [`*`][*.integer64] coerces its first argument to
#' `integer64` but allows its second argument to be also `double`: the second
#' argument is internaly coerced to 'long double' and the result of the
#' multiplication is returned as `integer64`.
#'
#' The division [`/`][/.integer64] and power [`^`][^.integer64] operators also
#' coerce their first argument to `integer64` and coerce internally their second
#' argument to 'long double', they return as `double`, like
#' Our operators [`+`][ops64], [`-`][ops64], [`%/%`][ops64], and [`%%`][ops64] coerce
#' their arguments to `integer64` and return `integer64` if they are `integer`,
#' `double` or `logical`. Otherwise the `integer64` argument is coerced to double and
#' the R base method for the other class is called.
#'
#' Our operators [`*`][ops64] and [`^`][ops64] coerce their first argument to
#' `integer64` and possibly the second to `integer64` if it is not `double` and
#' return `integer64` if they are `integer`, `double` or `logical`. Otherwise the
#' `integer64` argument is coerced to double and the R base method for the other
#' class is called.
#'
#' The division [`/`][ops64] operator also coerces its first argument to `integer64`
#' and possibly the second to `integer64` if it is not `double` and returns
#' `integer64` if they are `integer`, `double` or `logical`. Otherwise the `integer64`
#' argument is coerced to double and the R base method for the other class is called.
#'
#' [`sqrt()`][sqrt.integer64], [`log()`][log.integer64],
#' [`log2()`][log2.integer64], and [`log10()`][log10.integer64] do.
#' [`log2()`][log2.integer64], and [`log10()`][log10.integer64] coerce their first
#' argument to `integer64` and coerce internally their second argument to
#' 'long double', they return as `double`
#'
#' | **argument1** | **op** | **argument2** | **->** | **coerced1** | **op** | **coerced2** | **->** | **result** |
#' |:-------------:|:------:|:-------------:|:------:|:------------:|:------:|:------------:|:------:|:----------:|
#' | integer64 | + | double | -> | integer64 | + | integer64 | -> | integer64 |
#' | double | + | integer64 | -> | integer64 | + | integer64 | -> | integer64 |
#' | integer64 | + | complex | -> | double | + | complex | -> | complex |
#' | complex | + | integer64 | -> | complex | + | double | -> | complex |
#' | integer64 | - | double | -> | integer64 | - | integer64 | -> | integer64 |
#' | double | - | integer64 | -> | integer64 | - | integer64 | -> | integer64 |
#' | integer64 | - | complex | -> | double | - | complex | -> | complex |
#' | complex | - | integer64 | -> | complex | - | double | -> | complex |
#' | integer64 | %/% | double | -> | integer64 | %/% | integer64 | -> | integer64 |
#' | double | %/% | integer64 | -> | integer64 | %/% | integer64 | -> | integer64 |
#' | integer64 | %/% | complex | -> | double | %/% | complex | -> | complex |
#' | complex | %/% | integer64 | -> | complex | %/% | double | -> | complex |
#' | integer64 | %% | double | -> | integer64 | %% | integer64 | -> | integer64 |
#' | double | %% | integer64 | -> | integer64 | %% | integer64 | -> | integer64 |
#' | integer64 | %% | complex | -> | double | %% | complex | -> | complex |
#' | complex | %% | integer64 | -> | complex | %% | double | -> | complex |
#' | integer64 | * | double | -> | integer64 | * | long double | -> | integer64 |
#' | double | * | integer64 | -> | integer64 | * | integer64 | -> | integer64 |
#' | integer64 | * | complex | -> | double | * | complex | -> | complex |
#' | complex | * | integer64 | -> | complex | * | double | -> | complex |
#' | integer64 | / | double | -> | integer64 | / | long double | -> | double |
#' | double | / | integer64 | -> | integer64 | / | long double | -> | double |
#' | integer64 | ^ | double | -> | integer64 | / | long double | -> | double |
#' | double | ^ | integer64 | -> | integer64 | / | long double | -> | double |
#' | integer64 | / | complex | -> | double | / | complex | -> | complex |
#' | complex | / | integer64 | -> | complex | / | double | -> | complex |
#' | integer64 | ^ | double | -> | integer64 | ^ | long double | -> | double |
#' | double | ^ | integer64 | -> | integer64 | ^ | long double | -> | double |
#' | integer64 | ^ | complex | -> | double | ^ | complex | -> | complex |
#' | complex | ^ | integer64 | -> | complex | ^ | double | -> | complex |
#' | integer64 | %*% | double | -> | integer64 | %*% | integer64 | -> | integer64 |
#' | double | %*% | integer64 | -> | integer64 | %*% | integer64 | -> | integer64 |
#' | integer64 | %*% | complex | -> | double | %*% | complex | -> | complex |
Expand Down Expand Up @@ -218,8 +238,8 @@
#' | [`*.integer64`] | [`*`] | returns integer64 |
#' | [`^.integer64`] | [`^`] | returns double |
#' | [`/.integer64`] | [`/`] | returns double |
#' | \code{\link[=xor.integer64]{\%/\%}} | \code{\link[=Arithmetic]{\%/\%}} | returns integer64 |
#' | \code{\link[=xor.integer64]{\%\%}} | \code{\link[=Arithmetic]{\%\%}} | returns integer64 |
#' | \code{\link[=ops64]{\%/\%}} | \code{\link[=Arithmetic]{\%/\%}} | returns integer64 |
#' | \code{\link[=ops64]{\%\%}} | \code{\link[=Arithmetic]{\%\%}} | returns integer64 |
#'
#' | **comparison operators** | **see also** | **description** |
#' |-------------------------:|-------------:|:----------------|
Expand All @@ -234,16 +254,14 @@
#' \strong{logical operators} \tab \strong{see also} \tab \strong{description} \cr
#' \code{\link{!.integer64}} \tab \code{\link{!}} \tab \cr
#' \code{\link{&.integer64}} \tab \code{\link{&}} \tab \cr
#' \code{\link[=xor.integer64]{|.integer64}} \tab \code{\link[base:Logic]{|}} \tab \cr
#' \code{\link{xor.integer64}} \tab \code{\link[=xor]{xor()}} \tab \cr
#' \code{\link{|.integer64}} \tab \code{\link[base:Logic]{|}} \tab \cr
#' }
# TODO(r-lib/roxygen2#1668): Restore the markdown representation of the table.
# | **logical operators** | **see also** | **description** |
# |----------------------:|-------------:|:----------------|
# | [`!.integer64`] | [`!`] | |
# | [`&.integer64`] | [`&`] | |
# | [`\|.integer64`][xor.integer64] | [`\|`][base::Logic] | |
# | [`xor.integer64`] | [xor()] | |
# | [`\|.integer64`] | [`\|`][base::Logic] | |
#'
#' | **math functions** | **see also** | **description** |
#' |----------------------:|-------------:|:-----------------------------|
Expand Down Expand Up @@ -360,19 +378,6 @@
#' `recursive=TRUE`. Therefore `c(list(integer64, integer64))` does not work and
#' for now you can only call `c.integer64(list(x, x))`.
#'
#' - **generic binary operators** fail to dispatch *any* user-defined S3 method
#' if the two arguments have two different S3 classes. For example we have two
#' classes [`bit::bit`] and [`bit::bitwhich`] sparsely representing boolean vectors
#' and we have methods [`&.bit`][bit::xor.default] and
#' [`&.bitwhich`][bit::xor.default]. For an expression involving both as in
#' `bit & bitwhich`, none of the two methods is dispatched. Instead a standard
#' method is dispatched, which neither handles `bit` nor `bitwhich`. Although
#' it lacks symmetry, the better choice would be to dispatch simply the method
#' of the class of the first argument in case of class conflict. This choice would
#' allow authors of extension packages providing coherent behaviour at least within
#' their contributed classes. But as long as none of the package author's methods is
#' dispatched, they cannot handle the conflicting classes at all.
#'
#' - **[unlist()]** is not generic and if it were, we would face similar problems as
#' with [c()]
#' - **[vector()]** with argument `mode='integer64'` cannot work without adjustment
Expand Down Expand Up @@ -697,7 +702,7 @@
#' mergesort mergesortorder na.count nties nunique nvalid quickorder
#' quicksort quicksortorder radixorder radixsort radixsortorder ramorder
#' ramsort ramsortorder repeat.time setattr shellorder shellsort
#' shellsortorder still.identical xor
#' shellsortorder still.identical
#' @importFrom graphics barplot par title
#' @importFrom methods as is
#' @importFrom stats cor median quantile
Expand Down Expand Up @@ -744,6 +749,6 @@
#' @export sortordertie.integer64 sortorderuni.integer64 sortorderupo.integer64
#' @export sortqtl.integer64 sorttab.integer64 sortuni.integer64
#' @export str.integer64 sum.integer64 summary.integer64 tiepos.integer64
#' @export unipos.integer64 unique.integer64 xor.integer64
#' @export unipos.integer64 unique.integer64
## usethis namespace: end
NULL
Loading