13template <
typename T,
typename =
void>
18 decltype(static_cast<bool>(std::declval<const T&>().is_na()))>>
21template <
typename T,
typename =
void>
26 : std::is_same<decltype(T::na()), T> {};
36 ->
decltype(
static_cast<bool>(
is_na(value))) {
37 return static_cast<bool>(
is_na(value));
40template <
typename T,
typename =
void>
45 decltype(call_adl_is_na(std::declval<const T&>()))>> : std::true_type {};
59 static_assert(std::is_default_constructible_v<T>,
60 "na<T>() requires a default constructor or an is_na() member and T::na()");
64template<>
inline double na<double>() {
return std::numeric_limits<double>::quiet_NaN(); }
65template<>
inline int na<int>() {
return std::numeric_limits<int>::min(); }
66template<>
inline int64_t
na<int64_t>() {
return std::numeric_limits<int64_t>::min(); }
67template<>
inline bool na<bool>() {
return false; }
69inline bool is_na(
double v) {
return std::isnan(v); }
72template<
typename T,
typename = std::enable_if_t<std::is_
integral_v<T> && !std::is_same_v<T,
bool>>>
73inline bool is_na(T v) {
return v == std::numeric_limits<T>::min(); }
78template <
class T>
class ScriptArray;
82 return !value.store_backed();
94inline bool is_na(
const std::string& value) {
return value.empty(); }
104template <
typename T, std::enable_if_t<
105 !std::is_arithmetic_v<T> &&
106 !std::is_convertible_v<T, double> &&
107 !std::is_convertible_v<T&, double> &&
108 !std::is_convertible_v<const T&, double> &&
109 !std::is_convertible_v<const T&, const std::string&>,
int> = 0>
112 return static_cast<bool>(value.is_na());
void is_na(const T &)=delete
auto call_adl_is_na(const T &value) -> decltype(static_cast< bool >(is_na(value)))
bool is_na(const Line &h)