1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- 2 // 3 // SugarBlock.h: Rcpp R/C++ interface class library -- sugar functions 4 // 5 // Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois 6 // 7 // This file is part of Rcpp. 8 // 9 // Rcpp is free software: you can redistribute it and/or modify it 10 // under the terms of the GNU General Public License as published by 11 // the Free Software Foundation, either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Rcpp is distributed in the hope that it will be useful, but 15 // WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Rcpp. If not, see <http://www.gnu.org/licenses/>. 21 22 #ifndef RCPP_SUGAR_BLOCK_1_H 23 #define RCPP_SUGAR_BLOCK_1_H 24 25 namespace Rcpp{ 26 namespace sugar{ 27 28 template <bool NA, typename RESULT_TYPE, typename U1, typename T1> 29 class SugarBlock_1 : public Rcpp::VectorBase< Rcpp::traits::r_sexptype_traits<RESULT_TYPE>::rtype , NA, SugarBlock_1<NA,RESULT_TYPE,U1,T1> > { 30 public: 31 typedef RESULT_TYPE (*FunPtr)(U1) ; SugarBlock_1(FunPtr ptr_,const T1 & vec_)32 SugarBlock_1( FunPtr ptr_, const T1 & vec_) : ptr(ptr_), vec(vec_){} 33 34 inline RESULT_TYPE operator[]( R_xlen_t i) const { 35 return ptr( vec[i] ) ; 36 } size()37 inline R_xlen_t size() const { return vec.size() ; } 38 39 private: 40 FunPtr ptr ; 41 const T1& vec ; 42 }; 43 44 } // sugar 45 } // Rcpp 46 47 #define SB1_T VectorBase<REALSXP,NA,T> 48 49 #define SUGAR_BLOCK_1(__NAME__,__SYMBOL__) \ 50 namespace Rcpp{ \ 51 template <bool NA, typename T> \ 52 inline sugar::SugarBlock_1<NA,double,double,SB1_T > \ 53 __NAME__( \ 54 const SB1_T& t \ 55 ){ \ 56 return sugar::SugarBlock_1<NA,double,double,SB1_T >( \ 57 __SYMBOL__ , t \ 58 ) ; \ 59 } \ 60 } 61 62 #endif 63