// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- // // misc.cpp: Rcpp R/C++ interface class library -- misc unit tests // // Copyright (C) 2013 - 2015 Dirk Eddelbuettel and Romain Francois // // This file is part of Rcpp. // // Rcpp is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 2 of the License, or // (at your option) any later version. // // Rcpp is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Rcpp. If not, see . #include using namespace Rcpp; using namespace std; #include #include class simple { Rcpp::Dimension dd; public: simple(SEXP xp) : dd(xp) {} int nrow() const { return dd[0]; } int ncol() const { return dd[1]; } }; // [[Rcpp::export]] SEXP symbol_() { return LogicalVector::create( Symbol( Rf_install("foobar") ) == Rf_install("foobar"), Symbol( Rf_mkChar("foobar") ) == Rf_install("foobar"), Symbol( Rf_mkString("foobar") ) == Rf_install("foobar"), Symbol( "foobar" ) == Rf_install("foobar") ); } // [[Rcpp::export]] Symbol symbol_ctor(SEXP x) { return Symbol(x); } // [[Rcpp::export]] List Argument_() { Argument x("x"), y("y"); return List::create( x = 2, y = 3 ); } // [[Rcpp::export]] int Dimension_const( SEXP ia ) { simple ss(ia); return ss.nrow(); } // [[Rcpp::export]] SEXP evaluator_error() { return Rcpp_fast_eval(Rf_lang2(Rf_install("stop"), Rf_mkString("boom")), R_GlobalEnv); } // [[Rcpp::export]] SEXP evaluator_ok(SEXP x) { return Rcpp_fast_eval(Rf_lang2(Rf_install("sample"), x), R_GlobalEnv); } // [[Rcpp::export]] void exceptions_() { throw std::range_error("boom"); } // [[Rcpp::export]] LogicalVector has_iterator_( ) { return LogicalVector::create( (bool)Rcpp::traits::has_iterator< std::vector >::value, (bool)Rcpp::traits::has_iterator< std::list >::value, (bool)Rcpp::traits::has_iterator< std::deque >::value, (bool)Rcpp::traits::has_iterator< std::set >::value, (bool)Rcpp::traits::has_iterator< std::map >::value, (bool)Rcpp::traits::has_iterator< std::pair >::value, (bool)Rcpp::traits::has_iterator< Rcpp::Symbol >::value ); } // [[Rcpp::export]] void test_rcout(std::string tfile, std::string teststring) { // define and open testfile std::ofstream testfile(tfile.c_str()); // save output buffer of the Rcout stream std::streambuf* Rcout_buffer = Rcout.rdbuf(); // redirect ouput into testfile Rcout.rdbuf( testfile.rdbuf() ); // write a test string to the file Rcout << teststring << std::endl; // restore old output buffer Rcout.rdbuf(Rcout_buffer); // close testfile testfile.close(); } // [[Rcpp::export]] void test_rcout_rcomplex(std::string tfile, SEXP rc) { Rcomplex rx = Rcpp::as(rc); // define and open testfile std::ofstream testfile(tfile.c_str()); // save output buffer of the Rcout stream std::streambuf* Rcout_buffer = Rcout.rdbuf(); // redirect ouput into testfile Rcout.rdbuf( testfile.rdbuf() ); // write a test string to the file Rcout << rx << std::endl; // restore old output buffer Rcout.rdbuf(Rcout_buffer); // close testfile testfile.close(); } // [[Rcpp::export]] LogicalVector na_proxy() { CharacterVector s("foo"); return LogicalVector::create( NA_REAL == NA, NA_INTEGER == NA, NA_STRING == NA, true == NA, false == NA, 1.2 == NA, 12 == NA, "foo" == NA, s[0] == NA, NA == NA_REAL, NA == NA_INTEGER, NA == NA_STRING, NA == true, NA == false, NA == 1.2 , NA == 12 , NA == "foo", NA == s[0] ); } // [[Rcpp::export]] StretchyList stretchy_list() { StretchyList out; out.push_back( 1 ); out.push_front( "foo" ); out.push_back( 3.2 ); return out; } // [[Rcpp::export]] StretchyList named_stretchy_list() { StretchyList out; out.push_back( _["b"] = 1 ); out.push_front( _["a"] = "foo" ); out.push_back( _["c"] = 3.2 ); return out; } // [[Rcpp::export]] void test_stop_variadic() { stop( "%s %d", "foo", 3 ); } // [[Rcpp::export]] bool testNullableForNull(const Nullable& M) { return M.isNull(); } // [[Rcpp::export]] bool testNullableForNotNull(const Nullable& M) { return M.isNotNull(); } // [[Rcpp::export]] SEXP testNullableOperator(const Nullable& M) { return M; } // [[Rcpp::export]] SEXP testNullableGet(const Nullable& M) { return M.get(); } // [[Rcpp::export]] NumericMatrix testNullableAs(Nullable& M) { return M.as(); } // [[Rcpp::export]] NumericMatrix testNullableClone(const Nullable& M) { return M.clone(); } // [[Rcpp::export]] SEXP testNullableIsUsable(const Nullable& M) { if (M.isUsable()) { return M.clone(); } else { return R_NilValue; } } // [[Rcpp::export]] String testNullableString(Rcpp::Nullable param = R_NilValue) { if (param.isNotNull()) return String(param); else return String(""); } // [[Rcpp::export]] void messageWrapper(SEXP s) { message(s); }