1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-
2 //
3 // is_na.h: Rcpp R/C++ interface class library -- vector operators
4 //
5 // Copyright (C) 2010 - 2018 Dirk Eddelbuettel and Romain Francois
6 // Copyright (C) 2018        Dirk Eddelbuettel and Kirill Mueller
7 //
8 // This file is part of Rcpp.
9 //
10 // Rcpp is free software: you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // Rcpp is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with Rcpp.  If not, see <http://www.gnu.org/licenses/>.
22 
23 #ifndef Rcpp__traits_is_na_h
24 #define Rcpp__traits_is_na_h
25 
26 namespace Rcpp{
27 
28     namespace traits{
29 
30         // default to always false, applies to VECSXP, EXPRSXP and RAWSXP
31         template <int RTYPE>
is_na(typename storage_type<RTYPE>::type)32         bool is_na(typename storage_type<RTYPE>::type) {
33             return false;
34         }
35 
36         template <>
37         inline bool is_na<INTSXP>(int x) {
38             return x == NA_INTEGER;
39         }
40 
41         template <>
42         inline bool is_na<REALSXP>(double x) {
43             return R_isnancpp(x);
44         }
45 
46         template <>
47         inline bool is_na<CPLXSXP>(Rcomplex x) {
48             return R_isnancpp(x.r) || R_isnancpp(x.i);
49         }
50 
51         template <>
52         inline bool is_na<STRSXP>(SEXP x) {
53             return x == NA_STRING;
54         }
55 
56         template <>
57         inline bool is_na<LGLSXP>(int x) {
58             return x == NA_LOGICAL;
59         }
60 
61     }
62 }
63 
64 #endif
65