1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8 -*-
2 //
3 // mapply_3.h: Rcpp R/C++ interface class library -- mapply_3
4 //
5 // Copyright (C) 2012 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__mapply_3_h
23 #define Rcpp__sugar__mapply_3_h
24 
25 namespace Rcpp{
26 namespace sugar{
27 
28 template <
29     int RTYPE_1, bool NA_1, typename T_1,
30     int RTYPE_2, bool NA_2, typename T_2,
31     int RTYPE_3, bool NA_3, typename T_3,
32     typename Function
33 >
34 class Mapply_3 : public VectorBase<
35 	Rcpp::traits::r_sexptype_traits<
36 		typename ::Rcpp::traits::result_of<Function>::type
37 	>::rtype ,
38 	true ,
39 	Mapply_3<RTYPE_1,NA_1,T_1,RTYPE_2,NA_2,T_2,RTYPE_3,NA_3,T_3,Function>
40 > {
41 public:
42 	typedef typename ::Rcpp::traits::result_of<Function>::type result_type ;
43 
44     typedef Rcpp::VectorBase<RTYPE_1,NA_1,T_1> VEC_1 ;
45 	typedef Rcpp::VectorBase<RTYPE_2,NA_2,T_2> VEC_2 ;
46 	typedef Rcpp::VectorBase<RTYPE_3,NA_3,T_3> VEC_3 ;
47 
48 	typedef typename Rcpp::traits::Extractor<RTYPE_1,NA_1,T_1>::type EXT_1 ;
49 	typedef typename Rcpp::traits::Extractor<RTYPE_2,NA_2,T_2>::type EXT_2 ;
50 	typedef typename Rcpp::traits::Extractor<RTYPE_3,NA_3,T_3>::type EXT_3 ;
51 
Mapply_3(const VEC_1 & vec_1_,const VEC_2 & vec_2_,const VEC_3 & vec_3_,Function fun_)52 	Mapply_3( const VEC_1& vec_1_, const VEC_2& vec_2_, const VEC_3& vec_3_, Function fun_ ) :
53 		vec_1(vec_1_.get_ref()), vec_2(vec_2_.get_ref()), vec_3(vec_3_.get_ref()), fun(fun_){}
54 
55         inline result_type operator[]( R_xlen_t i ) const {
56 		return fun( vec_1[i], vec_2[i], vec_3[i] );
57 	}
size()58         inline R_xlen_t size() const { return vec_1.size() ; }
59 
60 private:
61 	const EXT_1& vec_1 ;
62 	const EXT_2& vec_2 ;
63 	const EXT_3& vec_3 ;
64 	Function fun ;
65 } ;
66 
67 } // sugar
68 
69 template <
70     int RTYPE_1, bool NA_1, typename T_1,
71     int RTYPE_2, bool NA_2, typename T_2,
72     int RTYPE_3, bool NA_3, typename T_3,
73     typename Function
74     >
75 inline sugar::Mapply_3<RTYPE_1,NA_1,T_1,RTYPE_2,NA_2,T_2,RTYPE_3, NA_3,T_3,Function>
mapply(const Rcpp::VectorBase<RTYPE_1,NA_1,T_1> & t1,const Rcpp::VectorBase<RTYPE_2,NA_2,T_2> & t2,const Rcpp::VectorBase<RTYPE_3,NA_3,T_3> & t3,Function fun)76 mapply(
77     const Rcpp::VectorBase<RTYPE_1,NA_1,T_1>& t1,
78     const Rcpp::VectorBase<RTYPE_2,NA_2,T_2>& t2,
79     const Rcpp::VectorBase<RTYPE_3,NA_3,T_3>& t3,
80     Function fun
81 ){
82 	return sugar::Mapply_3<RTYPE_1,NA_1,T_1,RTYPE_2,NA_2,T_2,RTYPE_3,NA_3,T_3,Function>( t1, t2, t3, fun ) ;
83 }
84 
85 } // Rcpp
86 
87 #endif
88