@@ -12,18 +12,18 @@ SEXP between(SEXP x, SEXP lower, SEXP upper, SEXP incbounds, SEXP NAboundsArg, S
1212 if (!nx || !nl || !nu )
1313 return (allocVector (LGLSXP , 0 ));
1414 const int longest = MAX (MAX (nx , nl ), nu );
15- if ((nl != 1 && nl != longest ) ||
16- (nu != 1 && nu != longest ) ||
17- (nx != 1 && nx != longest )) {
15+ if ((nl != 1 && nl != longest ) ||
16+ (nu != 1 && nu != longest ) ||
17+ (nx != 1 && nx != longest )) {
1818 error (_ ("Incompatible vector lengths: length(x)==%d length(lower)==%d length(upper)==%d. Each should be either length 1 or the length of the longest." ), nx , nl , nu );
1919 }
2020 const int longestBound = MAX (nl , nu ); // just for when check=TRUE
2121 if (!IS_TRUE_OR_FALSE (incbounds ))
2222 error (_ ("%s must be TRUE or FALSE" ), "incbounds" );
2323 const bool open = !LOGICAL (incbounds )[0 ];
24- if (!isLogical (NAboundsArg ) || LOGICAL (NAboundsArg )[0 ]== FALSE)
24+ if (!isLogical (NAboundsArg ) || LOGICAL (NAboundsArg )[0 ] == FALSE)
2525 error (_ ("NAbounds must be TRUE or NA" ));
26- const bool NAbounds = LOGICAL (NAboundsArg )[0 ]== TRUE;
26+ const bool NAbounds = LOGICAL (NAboundsArg )[0 ] == TRUE;
2727 if (!IS_TRUE_OR_FALSE (checkArg ))
2828 error (_ ("%s must be TRUE or FALSE" ), "check" );
2929 const bool check = LOGICAL (checkArg )[0 ];
@@ -49,43 +49,43 @@ SEXP between(SEXP x, SEXP lower, SEXP upper, SEXP incbounds, SEXP NAboundsArg, S
4949 upper = PROTECT (coerceVector (upper , TYPEOF (x ))); nprotect ++ ;
5050 }
5151
52- const bool recycleX = nx == 1 ;
53- const bool recycleLow = nl == 1 ;
54- const bool recycleUpp = nu == 1 ;
52+ const bool recycleX = nx == 1 ;
53+ const bool recycleLow = nl == 1 ;
54+ const bool recycleUpp = nu == 1 ;
5555 const int xMask = recycleX ? 0 : INT_MAX ;
5656 const int lowMask = recycleLow ? 0 : INT_MAX ;
5757 const int uppMask = recycleUpp ? 0 : INT_MAX ;
5858 SEXP ans = PROTECT (allocVector (LGLSXP , longest )); nprotect ++ ;
5959 int * restrict ansp = LOGICAL (ans );
60- double tic = omp_get_wtime ();
60+ double tic = omp_get_wtime ();
6161
6262 switch (TYPEOF (x )) {
6363 case INTSXP : {
6464 const int * lp = INTEGER (lower );
6565 const int * up = INTEGER (upper );
6666 const int * xp = INTEGER (x );
67- if (check ) for (int i = 0 ; i < longestBound ; ++ i ) {
68- const int l = lp [i & lowMask ], u = up [i & uppMask ];
69- if (l != NA_INTEGER && u != NA_INTEGER && l > u )
70- error (_ ("Item %d of lower (%d) is greater than item %d of upper (%d)" ), (i & lowMask )+ 1 , l , (i & uppMask )+ 1 , u );
67+ if (check ) for (int i = 0 ; i < longestBound ; i ++ ) {
68+ const int l = lp [i & lowMask ], u = up [i & uppMask ];
69+ if (l != NA_INTEGER && u != NA_INTEGER && l > u )
70+ error (_ ("Item %d of lower (%d) is greater than item %d of upper (%d)" ), (i & lowMask ) + 1 , l , (i & uppMask ) + 1 , u );
7171 }
7272 if (NAbounds ) { // default NAbounds==TRUE => NA bound means TRUE; i.e. asif lower=-Inf or upper==Inf)
7373 #pragma omp parallel for num_threads(getDTthreads(longest, true))
74- for (int i = 0 ; i < longest ; ++ i ) {
75- const int elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
76- ansp [i ] = elem == NA_INTEGER ? NA_LOGICAL : (l == NA_INTEGER || l + open <= elem ) && (u == NA_INTEGER || elem <= u - open );
74+ for (int i = 0 ; i < longest ; i ++ ) {
75+ const int elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
76+ ansp [i ] = elem == NA_INTEGER ? NA_LOGICAL : (l == NA_INTEGER || l + open <= elem ) && (u == NA_INTEGER || elem <= u - open );
7777 // +open so we can always use >= and <=. NA_INTEGER+1 == -INT_MAX == INT_MIN+1 (so NA limit handled by this too)
7878 }
7979 } else {
8080 #pragma omp parallel for num_threads(getDTthreads(longest, true))
81- for (int i = 0 ; i < longest ; ++ i ) {
82- const int elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
83- if (elem == NA_INTEGER ) { ansp [i ]= NA_LOGICAL ; continue ; }
84- const bool lok = l != NA_INTEGER , uok = u != NA_INTEGER ;
85- ansp [i ] = (lok && uok ) ? l + open <= elem && elem <= u - open : ((uok && elem > u - open ) || (lok && elem < l + open )) ? FALSE : NA_LOGICAL ;
81+ for (int i = 0 ; i < longest ; i ++ ) {
82+ const int elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
83+ if (elem == NA_INTEGER ) { ansp [i ] = NA_LOGICAL ; continue ; }
84+ const bool lok = l != NA_INTEGER , uok = u != NA_INTEGER ;
85+ ansp [i ] = (lok && uok ) ? l + open <= elem && elem <= u - open : ((uok && elem > u - open ) || (lok && elem < l + open )) ? FALSE : NA_LOGICAL ;
8686 }
8787 }
88- if (verbose ) Rprintf (_ ("between parallel processing of integer took %8.3fs\n" ), omp_get_wtime ()- tic );
88+ if (verbose ) Rprintf (_ ("between parallel processing of integer took %8.3fs\n" ), omp_get_wtime () - tic );
8989 } break ;
9090
9191 case REALSXP :
@@ -95,72 +95,72 @@ SEXP between(SEXP x, SEXP lower, SEXP upper, SEXP incbounds, SEXP NAboundsArg, S
9595 const int64_t * lp = (int64_t * )REAL (lower );
9696 const int64_t * up = (int64_t * )REAL (upper );
9797 const int64_t * xp = (int64_t * )REAL (x );
98- if (check ) for (int i = 0 ; i < longestBound ; ++ i ) {
99- const int64_t l = lp [i & lowMask ], u = up [i & uppMask ];
100- if (l != NA_INTEGER64 && u != NA_INTEGER64 && l > u )
101- error (_ ("Item %d of lower (%" PRId64 ") is greater than item %d of upper (%" PRId64 ")" ), (i & lowMask )+ 1 , l , (i & uppMask )+ 1 , u );
98+ if (check ) for (int i = 0 ; i < longestBound ; i ++ ) {
99+ const int64_t l = lp [i & lowMask ], u = up [i & uppMask ];
100+ if (l != NA_INTEGER64 && u != NA_INTEGER64 && l > u )
101+ error (_ ("Item %d of lower (%" PRId64 ") is greater than item %d of upper (%" PRId64 ")" ), (i & lowMask ) + 1 , l , (i & uppMask ) + 1 , u );
102102 }
103103 if (NAbounds ) {
104104 #pragma omp parallel for num_threads(getDTthreads(longest, true))
105- for (int i = 0 ; i < longest ; ++ i ) {
106- const int64_t elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
107- ansp [i ] = elem == NA_INTEGER64 ? NA_LOGICAL : (l == NA_INTEGER64 || l + open <= elem ) && (u == NA_INTEGER64 || elem <= u - open );
105+ for (int i = 0 ; i < longest ; i ++ ) {
106+ const int64_t elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
107+ ansp [i ] = elem == NA_INTEGER64 ? NA_LOGICAL : (l == NA_INTEGER64 || l + open <= elem ) && (u == NA_INTEGER64 || elem <= u - open );
108108 }
109109 } else {
110110 #pragma omp parallel for num_threads(getDTthreads(longest, true))
111- for (int i = 0 ; i < longest ; ++ i ) {
112- const int64_t elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
113- if (elem == NA_INTEGER64 ) { ansp [i ]= NA_LOGICAL ; continue ; }
114- const bool lok = l != NA_INTEGER64 , uok = u != NA_INTEGER64 ;
115- ansp [i ] = (lok && uok ) ? l + open <= elem && elem <= u - open : ((uok && elem > u - open ) || (lok && elem < l + open )) ? FALSE : NA_LOGICAL ;
111+ for (int i = 0 ; i < longest ; i ++ ) {
112+ const int64_t elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
113+ if (elem == NA_INTEGER64 ) { ansp [i ] = NA_LOGICAL ; continue ; }
114+ const bool lok = l != NA_INTEGER64 , uok = u != NA_INTEGER64 ;
115+ ansp [i ] = (lok && uok ) ? l + open <= elem && elem <= u - open : ((uok && elem > u - open ) || (lok && elem < l + open )) ? FALSE : NA_LOGICAL ;
116116 }
117117 }
118- if (verbose ) Rprintf (_ ("between parallel processing of integer64 took %8.3fs\n" ), omp_get_wtime ()- tic );
118+ if (verbose ) Rprintf (_ ("between parallel processing of integer64 took %8.3fs\n" ), omp_get_wtime () - tic );
119119 } else {
120120 if (INHERITS (lower , char_integer64 ) || INHERITS (upper , char_integer64 ))
121121 error (_ ("x is not integer64 but lower and/or upper is integer64. Please align classes." ));
122122 const double * lp = REAL (lower );
123123 const double * up = REAL (upper );
124124 const double * xp = REAL (x );
125- if (check ) for (int i = 0 ; i < longestBound ; ++ i ) {
126- const double l = lp [i & lowMask ], u = up [i & uppMask ];
127- if (!isnan (l ) && !isnan (u ) && l > u )
128- error (_ ("Item %d of lower (%f) is greater than item %d of upper (%f)" ), (i & lowMask )+ 1 , l , (i & uppMask )+ 1 , u );
125+ if (check ) for (int i = 0 ; i < longestBound ; i ++ ) {
126+ const double l = lp [i & lowMask ], u = up [i & uppMask ];
127+ if (!isnan (l ) && !isnan (u ) && l > u )
128+ error (_ ("Item %d of lower (%f) is greater than item %d of upper (%f)" ), (i & lowMask ) + 1 , l , (i & uppMask ) + 1 , u );
129129 }
130130 if (open ) {
131131 if (NAbounds ) {
132132 #pragma omp parallel for num_threads(getDTthreads(longest, true))
133- for (int i = 0 ; i < longest ; ++ i ) {
134- const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
133+ for (int i = 0 ; i < longest ; i ++ ) {
134+ const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
135135 ansp [i ] = isnan (elem ) ? NA_LOGICAL : (isnan (l ) || l < elem ) && (isnan (u ) || elem < u );
136136 }
137137 } else {
138138 #pragma omp parallel for num_threads(getDTthreads(longest, true))
139- for (int i = 0 ; i < longest ; ++ i ) {
140- const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
141- if (isnan (elem )) { ansp [i ]= NA_LOGICAL ; continue ; }
139+ for (int i = 0 ; i < longest ; i ++ ) {
140+ const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
141+ if (isnan (elem )) { ansp [i ] = NA_LOGICAL ; continue ; }
142142 const bool lok = !isnan (l ), uok = !isnan (u );
143- ansp [i ] = (lok && uok ) ? l < elem && elem < u : ((uok && elem >= u ) || (lok && elem <= l )) ? FALSE : NA_LOGICAL ;
143+ ansp [i ] = (lok && uok ) ? l < elem && elem < u : ((uok && elem >= u ) || (lok && elem <= l )) ? FALSE : NA_LOGICAL ;
144144 }
145145 }
146146 if (verbose ) Rprintf (_ ("between parallel processing of double with open bounds took %8.3fs\n" ), omp_get_wtime ()- tic );
147147 } else {
148148 if (NAbounds ) {
149149 #pragma omp parallel for num_threads(getDTthreads(longest, true))
150- for (int i = 0 ; i < longest ; ++ i ) {
151- const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
152- ansp [i ] = isnan (elem ) ? NA_LOGICAL : (isnan (l ) || l <= elem ) && (isnan (u ) || elem <= u );
150+ for (int i = 0 ; i < longest ; i ++ ) {
151+ const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
152+ ansp [i ] = isnan (elem ) ? NA_LOGICAL : (isnan (l ) || l <= elem ) && (isnan (u ) || elem <= u );
153153 }
154154 } else {
155155 #pragma omp parallel for num_threads(getDTthreads(longest, true))
156- for (int i = 0 ; i < longest ; ++ i ) {
157- const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
156+ for (int i = 0 ; i < longest ; i ++ ) {
157+ const double elem = xp [i & xMask ], l = lp [i & lowMask ], u = up [i & uppMask ];
158158 if (isnan (elem )) { ansp [i ]= NA_LOGICAL ; continue ; }
159159 const bool lok = !isnan (l ), uok = !isnan (u );
160- ansp [i ] = (lok && uok ) ? l <= elem && elem <= u : ((uok && elem > u ) || (lok && elem < l )) ? FALSE : NA_LOGICAL ;
160+ ansp [i ] = (lok && uok ) ? l <= elem && elem <= u : ((uok && elem > u ) || (lok && elem < l )) ? FALSE : NA_LOGICAL ;
161161 }
162162 }
163- if (verbose ) Rprintf (_ ("between parallel processing of double with closed bounds took %8.3fs\n" ), omp_get_wtime ()- tic );
163+ if (verbose ) Rprintf (_ ("between parallel processing of double with closed bounds took %8.3fs\n" ), omp_get_wtime () - tic );
164164 }
165165 }
166166 break ;
@@ -169,12 +169,12 @@ SEXP between(SEXP x, SEXP lower, SEXP upper, SEXP incbounds, SEXP NAboundsArg, S
169169 const SEXP * lp = STRING_PTR_RO (lower );
170170 const SEXP * up = STRING_PTR_RO (upper );
171171 const SEXP * xp = STRING_PTR_RO (x );
172- #define LCMP (strcmp(CHAR(ENC2UTF8(l)),CHAR(ENC2UTF8(elem)))<= -open)
173- #define UCMP (strcmp(CHAR(ENC2UTF8(elem)),CHAR(ENC2UTF8(u)))<= -open)
172+ #define LCMP (strcmp(CHAR(ENC2UTF8(l)),CHAR(ENC2UTF8(elem))) <= -open)
173+ #define UCMP (strcmp(CHAR(ENC2UTF8(elem)),CHAR(ENC2UTF8(u))) <= -open)
174174 // TODO if all ascii can be parallel, otherwise ENC2UTF8 could allocate
175- if (check ) for (int i = 0 ; i < longestBound ; ++ i ) {
176- const SEXP l = lp [i & lowMask ], u = up [i & uppMask ];
177- if (l != NA_STRING && u != NA_STRING && l != u && strcmp (CHAR (ENC2UTF8 (l )), CHAR (ENC2UTF8 (u )))> 0 )
175+ if (check ) for (int i = 0 ; i < longestBound ; i ++ ) {
176+ const SEXP l = lp [i & lowMask ], u = up [i & uppMask ];
177+ if (l != NA_STRING && u != NA_STRING && l != u && strcmp (CHAR (ENC2UTF8 (l )), CHAR (ENC2UTF8 (u ))) > 0 )
178178 error (_ ("Item %d of lower ('%s') is greater than item %d of upper ('%s')" ), (i & lowMask )+ 1 , CHAR (l ), (i & uppMask )+ 1 , CHAR (u ));
179179 }
180180 if (NAbounds ) {
0 commit comments