Skip to content

Commit

Permalink
Merge pull request #790 from RcppCore/feature/revert-clever-na
Browse files Browse the repository at this point in the history
remove 'clever' NA checks
  • Loading branch information
eddelbuettel committed Dec 20, 2017
2 parents 1630a55 + 0f03a58 commit bd1e7f1
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 63 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2017-12-19 Kevin Ushey <kevinushey@gmail.com>

* inst/include/Rcpp/internal/na.h: Remove 'clever' NA / NaN checks

2017-12-16 Dirk Eddelbuettel <edd@debian.org>

* DESCRIPTION (Date, Version): Updated minor version and date
Expand Down
63 changes: 0 additions & 63 deletions inst/include/Rcpp/internal/na.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,67 +23,6 @@
namespace Rcpp {
namespace internal {

// we rely on the presence of unsigned long long types, since we
// want to compare specific bit patterns, but we can't explicitly
// assign a hex to a double storage.

#ifdef RCPP_HAS_LONG_LONG_TYPES

#ifdef HAS_STATIC_ASSERT
static_assert(
sizeof(rcpp_ulong_long_type) == sizeof(double),
"unsigned long long and double have same size"
);
#endif

// motivation: on 32bit architectures, we only see 'LargeNA'
// as defined ahead; on 64bit architectures, R defaults to
// 'SmallNA' for R_NaReal, but this can get promoted to 'LargeNA'
// if a certain operation can create a 'signalling' NA, e.g. NA_real_+1
static const rcpp_ulong_long_type SmallNA = 0x7FF00000000007A2;
static const rcpp_ulong_long_type LargeNA = 0x7FF80000000007A2;

struct NACanChange {
enum { value = sizeof(void*) == 8 };
};

template <bool NACanChange>
bool Rcpp_IsNA__impl(double);

template <>
inline bool Rcpp_IsNA__impl<true>(double x) {
return memcmp(
(void*) &x,
(void*) &SmallNA,
sizeof(double)
) == 0 or memcmp(
(void*) &x,
(void*) &LargeNA,
sizeof(double)
) == 0;
}

template <>
inline bool Rcpp_IsNA__impl<false>(double x) {
return memcmp(
(void*) &x,
(void*) &LargeNA,
sizeof(double)
) == 0;
}

inline bool Rcpp_IsNA(double x) {
return Rcpp_IsNA__impl< NACanChange::value >(x);
}

inline bool Rcpp_IsNaN(double x) {
return R_IsNaN(x);
}

#else

// fallback when we don't have unsigned long long

inline bool Rcpp_IsNA(double x) {
return R_IsNA(x);
}
Expand All @@ -92,7 +31,5 @@ inline bool Rcpp_IsNaN(double x) {
return R_IsNaN(x);
}

#endif

}
}

0 comments on commit bd1e7f1

Please sign in to comment.