1# For R, size is Lebesgue measure, so closure is irrelevant. Note that we don't
2# use the close_intervals method here, which is important since this method
3# requires empty, and empty currently uses size. We need to avoid circular
4# dependency.
5
6setGeneric( "size", def = function( x, ... ) standardGeneric( "size" ) )
7
8setMethod(
9          "size",
10          signature( "Intervals" ),
11          function( x, as = type(x) ) {
12            result <- x[,2] - x[,1]
13            if ( as == "Z" ) {
14              ties <- x[,2] == x[,1]
15              ties[ is.na( ties ) ] <- FALSE
16              result[ ties ] <- ifelse( all( closed(x) ), 1, 0 )
17              result[ !ties ] <- result[ !ties ] + sum( closed(x) ) - 1 # NAs just stay NA
18            }
19            return( result )
20          }
21          )
22
23setMethod(
24          "size",
25          signature( "Intervals_full" ),
26          function( x, as = type(x) ) {
27            result <- x[,2] - x[,1]
28            if ( as == "Z" ) {
29              ties <- x[,2] == x[,1]
30              ties[ is.na( ties ) ] <- FALSE
31              rs <- rowSums( closed(x) )
32              result[ ties ] <- ifelse( rs[ ties ] == 2, 1, 0 )
33              result[ !ties ] <- result[ !ties ] + rs[ !ties ] - 1
34            }
35            return( result )
36          }
37          )
38