Skip to content

Commit c93f65e

Browse files
committed
S3 with generics package
1 parent a60eb66 commit c93f65e

4 files changed

Lines changed: 100 additions & 37 deletions

File tree

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Authors@R: c(
88
person("Ofek", "Shilon", role="ctb"),
99
person("Christian", "Ullerich", role="ctb")
1010
)
11-
Depends: R (>= 3.5.0)
11+
Depends: R (>= 3.5.0), generics
1212
Description:
1313
Package 'bit64' provides serializable S3 atomic 64bit (signed) integers.
1414
These are useful for handling database keys and exact counting in +-2^63.

NAMESPACE

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,12 @@ S3method(hashtab,cache_integer64)
8989
S3method(hashuni,cache_integer64)
9090
S3method(hashupo,cache_integer64)
9191
S3method(identical,integer64)
92+
S3method(intersect,default)
93+
S3method(intersect,integer64)
9294
S3method(is.double,default)
9395
S3method(is.double,integer64)
96+
S3method(is.element,default)
97+
S3method(is.element,integer64)
9498
S3method(is.finite,integer64)
9599
S3method(is.infinite,integer64)
96100
S3method(is.na,integer64)
@@ -154,6 +158,10 @@ S3method(rowSums,default)
154158
S3method(rowSums,integer64)
155159
S3method(scale,integer64)
156160
S3method(seq,integer64)
161+
S3method(setdiff,default)
162+
S3method(setdiff,integer64)
163+
S3method(setequal,default)
164+
S3method(setequal,integer64)
157165
S3method(shellorder,integer64)
158166
S3method(shellsort,integer64)
159167
S3method(shellsortorder,integer64)
@@ -181,6 +189,8 @@ S3method(table,default)
181189
S3method(table,integer64)
182190
S3method(tiepos,integer64)
183191
S3method(trunc,integer64)
192+
S3method(union,default)
193+
S3method(union,integer64)
184194
S3method(unipos,integer64)
185195
S3method(unique,integer64)
186196
export("%in%")
@@ -227,9 +237,7 @@ export(hashuni)
227237
export(hashupo)
228238
export(identical.integer64)
229239
export(integer64)
230-
export(intersect)
231240
export(is.double)
232-
export(is.element)
233241
export(is.integer64)
234242
export(is.na.integer64)
235243
export(jamcache)
@@ -270,8 +278,6 @@ export(rowSums)
270278
export(runif64)
271279
export(seq.integer64)
272280
export(setcache)
273-
export(setdiff)
274-
export(setequal)
275281
export(sortcache)
276282
export(sortfin)
277283
export(sortnut)
@@ -291,7 +297,6 @@ export(str.integer64)
291297
export(sum.integer64)
292298
export(table)
293299
export(tiepos)
294-
export(union)
295300
export(unipos)
296301
export(unique.integer64)
297302
if (getRversion() >= "4.2.0") S3method(mtfrm,integer64)
@@ -323,6 +328,11 @@ importFrom(bit,shellorder)
323328
importFrom(bit,shellsort)
324329
importFrom(bit,shellsortorder)
325330
importFrom(bit,still.identical)
331+
importFrom(generics,intersect)
332+
importFrom(generics,is.element)
333+
importFrom(generics,setdiff)
334+
importFrom(generics,setequal)
335+
importFrom(generics,union)
326336
importFrom(graphics,barplot)
327337
importFrom(graphics,par)
328338
importFrom(graphics,title)

R/setops64.R

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#' @title Set Operations
1111
#' @description Performs set union, intersection, (asymmetric!) difference, equality and membership on two vectors. As soon as an integer64 vector is involved, the operations are performed using integer64 semantics. Otherwise the \code{base} package functions are called.
1212
#' @inheritParams base::union
13+
#' @param ... further arguments passed to or from other methods.
1314
#' @return
1415
#' For union, a vector of a common mode or class.
1516
#'
@@ -28,12 +29,18 @@
2829
#' setequal(x, y)
2930
#' is.element(x, y)
3031
#'
31-
#' @export
32+
#' @importFrom generics union
33+
#' @exportS3Method union default
34+
#' @aliases union
3235
#' @rdname sets
33-
union = function(x, y) {
34-
if (!(is.integer64(x) || is.integer64(y)))
35-
return(base::union(x, y))
36-
36+
union.default = function(x, y, ...) {
37+
if (is.integer64(y)) return(union.integer64(x, y))
38+
base::union(x, y)
39+
}
40+
41+
#' @exportS3Method union integer64
42+
#' @rdname sets
43+
union.integer64 = function(x, y, ...) {
3744
target_class = target_class(list(x, y))
3845
# try using the benefit of integer64 caching, if possible. I.e. call unique() before as().
3946
x = unique(x)
@@ -56,13 +63,19 @@ union = function(x, y) {
5663
unique(c(x, y))
5764
}
5865

59-
#' @export
66+
#' @importFrom generics intersect
67+
#' @exportS3Method intersect default
68+
#' @aliases intersect
69+
#' @rdname sets
70+
intersect.default = function(x, y, ...) {
71+
if (is.integer64(y)) return(intersect.integer64(x, y))
72+
base::intersect(x, y)
73+
}
74+
75+
#' @exportS3Method intersect integer64
6076
#' @rdname sets
61-
intersect = function(x, y) {
77+
intersect.integer64 = function(x, y, ...) {
6278
if (is.null(x) || is.null(y)) return(NULL)
63-
if (!(is.integer64(x) || is.integer64(y)))
64-
return(base::intersect(x, y))
65-
6679
target_class = target_class(list(x, y))
6780
x = unique(x)
6881
class_x = class(x)[1L]
@@ -84,12 +97,18 @@ intersect = function(x, y) {
8497
x[match(x, y, 0L) > 0L]
8598
}
8699

87-
#' @export
100+
#' @importFrom generics setequal
101+
#' @exportS3Method setequal default
102+
#' @aliases setequal
88103
#' @rdname sets
89-
setequal = function(x, y) {
90-
if (!(is.integer64(x) || is.integer64(y)))
91-
return(base::setequal(x, y))
92-
104+
setequal.default = function(x, y, ...) {
105+
if (is.integer64(y)) return(setequal.integer64(x, y))
106+
base::setequal(x, y)
107+
}
108+
109+
#' @exportS3Method setequal integer64
110+
#' @rdname sets
111+
setequal.integer64 = function(x, y, ...) {
93112
x = unique(x)
94113
y = unique(y)
95114
length_x = length(x)
@@ -106,12 +125,18 @@ setequal = function(x, y) {
106125
!anyNA(match(x, y))
107126
}
108127

109-
#' @export
128+
#' @importFrom generics setdiff
129+
#' @exportS3Method setdiff default
130+
#' @aliases setdiff
110131
#' @rdname sets
111-
setdiff = function(x, y) {
112-
if (!(is.integer64(x) || is.integer64(y)))
113-
return(base::setdiff(x, y))
114-
132+
setdiff.default = function(x, y, ...) {
133+
if (is.integer64(y)) return(setdiff.integer64(x, y))
134+
base::setdiff(x, y)
135+
}
136+
137+
#' @exportS3Method setdiff integer64
138+
#' @rdname sets
139+
setdiff.integer64 = function(x, y, ...) {
115140
class_x = class(x)[1L]
116141
if (class_x %in% c("POSIXct", "Date"))
117142
x = unclass(x)
@@ -135,12 +160,18 @@ setdiff = function(x, y) {
135160
x[match(x_match, y, 0L) == 0L]
136161
}
137162

138-
#' @export
163+
#' @importFrom generics is.element
164+
#' @exportS3Method is.element default
165+
#' @aliases is.element
139166
#' @rdname sets
140-
is.element = function(el, set) {
141-
if (!(is.integer64(el) || is.integer64(set)))
142-
return(base::is.element(el, set))
143-
167+
is.element.default = function(el, set, ...) {
168+
if (is.integer64(set)) return(is.element.integer64(el, set))
169+
base::is.element(el, set)
170+
}
171+
172+
#' @exportS3Method is.element integer64
173+
#' @rdname sets
174+
is.element.integer64 = function(el, set, ...) {
144175
target_class = target_class(list(el, set))
145176
class_el = class(el)[1L]
146177
if (class_el != target_class) {

man/sets.Rd

Lines changed: 28 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)