Rcpp Version 1.0.9
cbind.h
Go to the documentation of this file.
1 // -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-
2 //
3 // cbind.h: Rcpp R/C++ interface class library -- cbind
4 //
5 // Copyright (C) 2016 Nathan Russell
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__cbind_h
23 #define Rcpp__sugar__cbind_h
24 
25 namespace Rcpp {
26 namespace sugar {
27 namespace cbind_impl {
28 
29 // override r_sexptype_traits<SEXP> for STRSXP
30 template <typename T>
32  : public Rcpp::traits::r_sexptype_traits<T> {};
33 
34 template <>
35 struct cbind_sexptype_traits<SEXP> {
36  enum { rtype = STRSXP };
37 };
38 
39 // override storage_type<LGLSXP> (int)
40 template <int RTYPE>
42  : public Rcpp::traits::storage_type<RTYPE> {};
43 
44 template <>
45 struct cbind_storage_type<LGLSXP> {
46  typedef bool type;
47 };
48 
49 
50 // CRTP base
51 template <int RTYPE, typename E>
53 public:
55 
56  inline stored_type operator[](R_xlen_t i) const {
57  return static_cast<const E&>(*this)[i];
58  }
59 
60  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
61  return static_cast<const E&>(*this)(i, j);
62  }
63 
64  inline R_xlen_t size() const {
65  return static_cast<const E&>(*this).size();
66  }
67 
68  inline R_xlen_t nrow() const {
69  return static_cast<const E&>(*this).nrow();
70  }
71 
72  inline R_xlen_t ncol() const {
73  return static_cast<const E&>(*this).ncol();
74  }
75 
76  operator E&() { return static_cast<E&>(*this); }
77  operator const E&() const { return static_cast<const E&>(*this); }
78 };
79 
80 // Matrix, Vector interface to BindableExpression
81 template <int RTYPE, typename T>
83  : public BindableExpression<RTYPE, ContainerBindable<RTYPE, T> > {
84 public:
86 
87 private:
88  T vec;
89  R_xlen_t len, nr, nc;
90 
91 public:
93  : vec(vec_), len(vec.ncol() * vec.nrow()),
94  nr(vec.nrow()), nc(vec.ncol())
95  {}
96 
98  : vec(vec_), len(vec.size()),
99  nr(vec.size()), nc(1)
100  {}
101 
102  template <typename S>
104  : vec(e.size()), len(e.size()),
105  nr(e.nrow()), nc(e.ncol())
106  {
107  for (R_xlen_t i = 0; i < len; i++) {
108  vec[i] = e[i];
109  }
110  }
111 
112  inline R_xlen_t size() const { return len; }
113 
114  inline R_xlen_t nrow() const { return nr; }
115 
116  inline R_xlen_t ncol() const { return nc; }
117 
118  inline stored_type operator[](R_xlen_t i) const {
119  return vec[i];
120  }
121 
122  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
123  return vec[i + nr * j];
124  }
125 };
126 
127 
128 template <int RTYPE>
129 struct scalar {
131 };
132 
133 // scalar interface to BindableExpression
134 template <typename T>
136  : public BindableExpression<
137  cbind_sexptype_traits<T>::rtype, ScalarBindable<T> > {
138 public:
139  typedef T stored_type;
141 
142 private:
143  T t;
144 
145 public:
146  ScalarBindable(const T& t_) : t(t_) {}
147 
148  inline R_xlen_t size() const { return 1; }
149 
150  inline R_xlen_t nrow() const { return 1; }
151 
152  inline R_xlen_t ncol() const { return 1; }
153 
154  inline stored_type operator[](R_xlen_t i) const {
155  return t;
156  }
157 
158  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
159  return t;
160  }
161 };
162 
163 
164 // binding logic; non-scalar operands
165 template <int RTYPE, typename E1, typename E2>
166 class JoinOp
167  : public BindableExpression<RTYPE, JoinOp<RTYPE, E1, E2> >,
168  public Rcpp::MatrixBase<RTYPE, true, JoinOp<RTYPE, E1, E2> > {
169 public:
171 
172 private:
173  const E1& e1;
174  const E2& e2;
175 
176 public:
179  : e1(e1_), e2(e2_)
180  {
181  if (e1.nrow() != e2.nrow()) {
182  std::string msg =
183  "Error in cbind: "
184  "Matrix and Vector operands "
185  "must have equal "
186  "number of rows (length).";
187  Rcpp::stop(msg);
188  }
189  }
190 
191  inline R_xlen_t size() const { return e1.size() + e2.size(); }
192 
193  inline R_xlen_t nrow() const { return e1.nrow(); }
194 
195  inline R_xlen_t ncol() const { return e1.ncol() + e2.ncol(); }
196 
197  inline stored_type operator[](R_xlen_t i) const {
198  return (i < e1.size()) ? e1[i] : e2[i - e1.size()];
199  }
200 
201  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
202  R_xlen_t index = i + nrow() * j;
203  return (*this)[index];
204  }
205 };
206 
207 // binding logic; rhs scalar
208 template <int RTYPE, typename E1>
209 class JoinOp<RTYPE, E1, ScalarBindable<typename scalar<RTYPE>::type> >
210  : public BindableExpression<RTYPE,
211  JoinOp<RTYPE, E1,
212  ScalarBindable<typename scalar<RTYPE>::type> > >,
213  public Rcpp::MatrixBase<RTYPE, true,
214  JoinOp<RTYPE, E1,
215  ScalarBindable<typename scalar<RTYPE>::type> > > {
216 public:
219 
220 private:
221  const E1& e1;
222  const E2& e2;
223 
224 public:
227  : e1(e1_), e2(e2_)
228  {}
229 
230  inline R_xlen_t size() const { return e1.size() + e1.nrow(); }
231 
232  inline R_xlen_t nrow() const { return e1.nrow(); }
233 
234  inline R_xlen_t ncol() const { return e1.ncol() + 1; }
235 
236  inline stored_type operator[](R_xlen_t i) const {
237  return (i < e1.size()) ? e1[i] : e2[i];
238  }
239 
240  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
241  R_xlen_t index = i + nrow() * j;
242  return (*this)[index];
243  }
244 };
245 
246 // binding logic; lhs scalar
247 template <int RTYPE, typename E2>
248 class JoinOp<RTYPE, ScalarBindable<typename scalar<RTYPE>::type>, E2>
249  : public BindableExpression<RTYPE,
250  JoinOp<RTYPE,
251  ScalarBindable<typename scalar<RTYPE>::type>, E2> >,
252  public Rcpp::MatrixBase<RTYPE, true,
253  JoinOp<RTYPE,
254  ScalarBindable<typename scalar<RTYPE>::type>, E2> > {
255 public:
258 
259 private:
260  const E1& e1;
261  const E2& e2;
262 
263 public:
266  : e1(e1_), e2(e2_)
267  {}
268 
269  inline R_xlen_t size() const { return e2.size() + e2.nrow(); }
270 
271  inline R_xlen_t nrow() const { return e2.nrow(); }
272 
273  inline R_xlen_t ncol() const { return e2.ncol() + 1; }
274 
275  inline stored_type operator[](R_xlen_t i) const {
276  return (i < e2.nrow()) ? e1[i] : e2[i - e2.nrow()];
277  }
278 
279  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
280  R_xlen_t index = i + nrow() * j;
281  return (*this)[index];
282  }
283 };
284 
285 // binding logic; both scalar
286 template <int RTYPE>
287 class JoinOp<RTYPE, ScalarBindable<typename scalar<RTYPE>::type>,
288  ScalarBindable<typename scalar<RTYPE>::type> >
289  : public BindableExpression<RTYPE,
290  JoinOp<RTYPE,
291  ScalarBindable<typename scalar<RTYPE>::type>,
292  ScalarBindable<typename scalar<RTYPE>::type> > >,
293  public Rcpp::MatrixBase<RTYPE, true,
294  JoinOp<RTYPE,
295  ScalarBindable<typename scalar<RTYPE>::type>,
296  ScalarBindable<typename scalar<RTYPE>::type> > > {
297 public:
301 
302 private:
303  const E1& e1;
304  const E2& e2;
305 
306 public:
309  : e1(e1_), e2(e2_)
310  {}
311 
312  inline R_xlen_t size() const { return e2.size() + e2.nrow(); }
313 
314  inline R_xlen_t nrow() const { return e2.nrow(); }
315 
316  inline R_xlen_t ncol() const { return e2.ncol() + 1; }
317 
318  inline stored_type operator[](R_xlen_t i) const {
319  return (i < e2.nrow()) ? e1[i] : e2[i];
320  }
321 
322  inline stored_type operator()(R_xlen_t i, R_xlen_t j) const {
323  R_xlen_t index = i + nrow() * j;
324  return (*this)[index];
325  }
326 };
327 
328 // for template argument deduction
329 template <int RTYPE>
330 inline ContainerBindable<RTYPE, Rcpp::Matrix<RTYPE> >
333 }
334 
335 template <int RTYPE>
336 inline ContainerBindable<RTYPE, Rcpp::Vector<RTYPE> >
339 }
340 
341 template <>
342 inline ContainerBindable<LGLSXP, Rcpp::Matrix<LGLSXP> >
345 }
346 
347 template <>
348 inline ContainerBindable<LGLSXP, Rcpp::Vector<LGLSXP> >
351 }
352 
353 template <typename T>
354 inline ScalarBindable<T>
355 MakeScalarBindable(const T& t) {
356  return ScalarBindable<T>(t);
357 }
358 
359 // for expressions of arbitrary length
360 template <int RTYPE, typename E1, typename E2>
364 {
365  return JoinOp<RTYPE, E1, E2>(e1, e2);
366 }
367 
368 // helpers
369 namespace detail {
370 
371 // distinguish Matrix/Vector from scalar
372 template <typename T>
374 private:
375  typedef char yes;
376  typedef struct {
377  char array[2];
378  } no;
379 
380  template <typename C>
381  static yes test(typename C::stored_type*);
382 
383  template <typename C>
384  static no test(...);
385 
386 public:
387  static const bool value = sizeof(test<T>(0)) == sizeof(yes);
388 };
389 
390 // functor to dispatch appropriate Make*Bindable() call
391 template <typename T, bool is_container = has_stored_type<T>::value>
393 
394 template <typename T>
395 struct MakeBindableCall<T, true> {
396  typedef typename cbind_storage_type<
398  >::type stored_type;
399 
401 
403  return MakeContainerBindable(t);
404  }
405 };
406 
407 // specialize for LGLSXP
408 template <>
409 struct MakeBindableCall<Rcpp::Matrix<LGLSXP>, true> {
411  typedef bool stored_type;
412 
414 
416  return MakeContainerBindable(t);
417  }
418 };
419 
420 template <>
421 struct MakeBindableCall<Rcpp::Vector<LGLSXP>, true> {
423  typedef bool stored_type;
424 
426 
428  return MakeContainerBindable(t);
429  }
430 };
431 
432 template <typename T>
433 struct MakeBindableCall<T, false> {
435 
436  ScalarBindable<T> operator()(const T& t) const {
437  return MakeScalarBindable(t);
438  }
439 };
440 
441 template <typename T>
442 inline typename Rcpp::traits::enable_if<
444  MakeBindableCall<T, true>
445 >::type
446 MakeBindable(const T& t) {
447  return MakeBindableCall<T, true>();
448 }
449 
450 template <typename T>
451 inline typename Rcpp::traits::enable_if<
453  MakeBindableCall<T, false>
454 >::type
455 MakeBindable(const T& t) {
457 }
458 
459 
460 // determine cbind return type from first template
461 // parameter, agnostic of Matrix/Vector/scalar
462 template <typename T, bool is_container = has_stored_type<T>::value>
463 struct matrix_return {};
464 
465 template <typename T>
466 struct matrix_return<T, true> {
467  typedef typename cbind_storage_type<
470 
473 };
474 
475 // specialize for LGLSXP
476 // normally would default to IntegerMatrix
477 template <>
478 struct matrix_return<Rcpp::Matrix<LGLSXP>, true> {
480 };
481 
482 template <>
483 struct matrix_return<Rcpp::Vector<LGLSXP>, true> {
485 };
486 
487 template <>
488 struct matrix_return<bool, false> {
490 };
491 
492 template <typename T>
493 struct matrix_return<T, false> {
496 };
497 
498 } // detail
499 
500 template <typename T, bool B = detail::has_stored_type<T>::value>
502  : public detail::matrix_return<T, B> {};
503 
504 template <typename T>
505 struct matrix_return<T, false>
506  : public detail::matrix_return<T, false> {};
507 
508 } // cbind_impl
509 
510 #define MakeBindable(x) (cbind_impl::detail::MakeBindable(x)(x))
511 
512 // begin cbind overloads
513 
514 template<typename T1, typename T2>
515 inline typename cbind_impl::matrix_return<T1>::type
516 cbind(const T1& t1, const T2& t2) {
517  return (MakeBindable(t1), MakeBindable(t2));
518 }
519 
520 template<typename T1, typename T2, typename T3>
521 inline typename cbind_impl::matrix_return<T1>::type
522 cbind(const T1& t1, const T2& t2, const T3& t3) {
523  return (MakeBindable(t1), MakeBindable(t2), MakeBindable(t3));
524 }
525 
526 template<typename T1, typename T2, typename T3, typename T4>
527 inline typename cbind_impl::matrix_return<T1>::type
528 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4) {
529  return (MakeBindable(t1), MakeBindable(t2), MakeBindable(t3), MakeBindable(t4));
530 }
531 
532 // 5
533 template<typename T1, typename T2, typename T3, typename T4, typename T5>
534 inline typename cbind_impl::matrix_return<T1>::type
535 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5) {
536  return (MakeBindable(t1), MakeBindable(t2), MakeBindable(t3), MakeBindable(t4), MakeBindable(t5));
537 }
538 
539 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
540 inline typename cbind_impl::matrix_return<T1>::type
541 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6) {
542  return (MakeBindable(t1), MakeBindable(t2), MakeBindable(t3), MakeBindable(t4), MakeBindable(t5), MakeBindable(t6));
543 }
544 
545 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
546 inline typename cbind_impl::matrix_return<T1>::type
547 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7) {
548  return (MakeBindable(t1), MakeBindable(t2), MakeBindable(t3), MakeBindable(t4), MakeBindable(t5), MakeBindable(t6), MakeBindable(t7));
549 }
550 
551 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
552 inline typename cbind_impl::matrix_return<T1>::type
553 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8) {
555 }
556 
557 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
558 inline typename cbind_impl::matrix_return<T1>::type
559 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9) {
561 }
562 
563 // 10
564 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
565 inline typename cbind_impl::matrix_return<T1>::type
566 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10) {
568 }
569 
570 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
571 inline typename cbind_impl::matrix_return<T1>::type
572 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11) {
574 }
575 
576 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
577 inline typename cbind_impl::matrix_return<T1>::type
578 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12) {
580 }
581 
582 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
583 inline typename cbind_impl::matrix_return<T1>::type
584 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13) {
586 }
587 
588 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
589 inline typename cbind_impl::matrix_return<T1>::type
590 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14) {
592 }
593 
594 // 15
595 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
596 inline typename cbind_impl::matrix_return<T1>::type
597 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15) {
599 }
600 
601 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16>
602 inline typename cbind_impl::matrix_return<T1>::type
603 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16) {
605 }
606 
607 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17>
608 inline typename cbind_impl::matrix_return<T1>::type
609 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17) {
611 }
612 
613 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18>
614 inline typename cbind_impl::matrix_return<T1>::type
615 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18) {
617 }
618 
619 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19>
620 inline typename cbind_impl::matrix_return<T1>::type
621 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19) {
623 }
624 
625 // 20
626 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20>
627 inline typename cbind_impl::matrix_return<T1>::type
628 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20) {
630 }
631 
632 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21>
633 inline typename cbind_impl::matrix_return<T1>::type
634 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21) {
636 }
637 
638 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22>
639 inline typename cbind_impl::matrix_return<T1>::type
640 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22) {
642 }
643 
644 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23>
645 inline typename cbind_impl::matrix_return<T1>::type
646 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23) {
648 }
649 
650 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24>
651 inline typename cbind_impl::matrix_return<T1>::type
652 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24) {
654 }
655 
656 // 25
657 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25>
658 inline typename cbind_impl::matrix_return<T1>::type
659 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25) {
661 }
662 
663 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26>
664 inline typename cbind_impl::matrix_return<T1>::type
665 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26) {
667 }
668 
669 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27>
670 inline typename cbind_impl::matrix_return<T1>::type
671 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27) {
673 }
674 
675 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28>
676 inline typename cbind_impl::matrix_return<T1>::type
677 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28) {
679 }
680 
681 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29>
682 inline typename cbind_impl::matrix_return<T1>::type
683 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29) {
685 }
686 
687 // 30
688 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30>
689 inline typename cbind_impl::matrix_return<T1>::type
690 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30) {
692 }
693 
694 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31>
695 inline typename cbind_impl::matrix_return<T1>::type
696 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31) {
698 }
699 
700 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32>
701 inline typename cbind_impl::matrix_return<T1>::type
702 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32) {
704 }
705 
706 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33>
707 inline typename cbind_impl::matrix_return<T1>::type
708 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33) {
710 }
711 
712 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34>
713 inline typename cbind_impl::matrix_return<T1>::type
714 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34) {
716 }
717 
718 // 35
719 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35>
720 inline typename cbind_impl::matrix_return<T1>::type
721 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35) {
723 }
724 
725 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36>
726 inline typename cbind_impl::matrix_return<T1>::type
727 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36) {
729 }
730 
731 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37>
732 inline typename cbind_impl::matrix_return<T1>::type
733 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37) {
735 }
736 
737 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38>
738 inline typename cbind_impl::matrix_return<T1>::type
739 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38) {
741 }
742 
743 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39>
744 inline typename cbind_impl::matrix_return<T1>::type
745 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39) {
747 }
748 
749 // 40
750 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40>
751 inline typename cbind_impl::matrix_return<T1>::type
752 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40) {
754 }
755 
756 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41>
757 inline typename cbind_impl::matrix_return<T1>::type
758 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41) {
760 }
761 
762 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42>
763 inline typename cbind_impl::matrix_return<T1>::type
764 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42) {
766 }
767 
768 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43>
769 inline typename cbind_impl::matrix_return<T1>::type
770 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43) {
772 }
773 
774 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44>
775 inline typename cbind_impl::matrix_return<T1>::type
776 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44) {
778 }
779 
780 // 45
781 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45>
782 inline typename cbind_impl::matrix_return<T1>::type
783 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45) {
785 }
786 
787 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46>
788 inline typename cbind_impl::matrix_return<T1>::type
789 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45, const T46& t46) {
791 }
792 
793 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47>
794 inline typename cbind_impl::matrix_return<T1>::type
795 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45, const T46& t46, const T47& t47) {
797 }
798 
799 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48>
800 inline typename cbind_impl::matrix_return<T1>::type
801 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45, const T46& t46, const T47& t47, const T48& t48) {
803 }
804 
805 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49>
806 inline typename cbind_impl::matrix_return<T1>::type
807 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45, const T46& t46, const T47& t47, const T48& t48, const T49& t49) {
809 }
810 
811 // 50
812 template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15, typename T16, typename T17, typename T18, typename T19, typename T20, typename T21, typename T22, typename T23, typename T24, typename T25, typename T26, typename T27, typename T28, typename T29, typename T30, typename T31, typename T32, typename T33, typename T34, typename T35, typename T36, typename T37, typename T38, typename T39, typename T40, typename T41, typename T42, typename T43, typename T44, typename T45, typename T46, typename T47, typename T48, typename T49, typename T50>
813 inline typename cbind_impl::matrix_return<T1>::type
814 cbind(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10, const T11& t11, const T12& t12, const T13& t13, const T14& t14, const T15& t15, const T16& t16, const T17& t17, const T18& t18, const T19& t19, const T20& t20, const T21& t21, const T22& t22, const T23& t23, const T24& t24, const T25& t25, const T26& t26, const T27& t27, const T28& t28, const T29& t29, const T30& t30, const T31& t31, const T32& t32, const T33& t33, const T34& t34, const T35& t35, const T36& t36, const T37& t37, const T38& t38, const T39& t39, const T40& t40, const T41& t41, const T42& t42, const T43& t43, const T44& t44, const T45& t45, const T46& t46, const T47& t47, const T48& t48, const T49& t49, const T50& t50) {
816 }
817 
818 // end cbind overloads
819 
820 #undef MakeBindable
821 
822 } // sugar
823 
824 namespace {
825 using sugar::cbind;
826 }
827 
828 } // Rcpp
829 
830 #endif // Rcpp__sugar__cbind_h
#define MakeBindable(x)
Definition: cbind.h:510
stored_type operator[](R_xlen_t i) const
Definition: cbind.h:56
cbind_storage_type< RTYPE >::type stored_type
Definition: cbind.h:54
stored_type operator()(R_xlen_t i, R_xlen_t j) const
Definition: cbind.h:60
ContainerBindable(const Rcpp::Vector< RTYPE > &vec_)
Definition: cbind.h:97
stored_type operator[](R_xlen_t i) const
Definition: cbind.h:118
stored_type operator()(R_xlen_t i, R_xlen_t j) const
Definition: cbind.h:122
ContainerBindable(const Rcpp::Matrix< RTYPE > &vec_)
Definition: cbind.h:92
ContainerBindable(const BindableExpression< RTYPE, S > &e)
Definition: cbind.h:103
cbind_storage_type< RTYPE >::type stored_type
Definition: cbind.h:85
JoinOp(const BindableExpression< RTYPE, E1 > &e1_, const BindableExpression< RTYPE, E2 > &e2_)
Definition: cbind.h:225
JoinOp(const BindableExpression< RTYPE, E1 > &e1_, const BindableExpression< RTYPE, E2 > &e2_)
Definition: cbind.h:264
JoinOp(const BindableExpression< RTYPE, E1 > &e1_, const BindableExpression< RTYPE, E2 > &e2_)
Definition: cbind.h:307
cbind_storage_type< RTYPE >::type stored_type
Definition: cbind.h:170
stored_type operator()(R_xlen_t i, R_xlen_t j) const
Definition: cbind.h:201
R_xlen_t size() const
Definition: cbind.h:191
R_xlen_t nrow() const
Definition: cbind.h:193
JoinOp(const BindableExpression< RTYPE, E1 > &e1_, const BindableExpression< RTYPE, E2 > &e2_)
Definition: cbind.h:177
stored_type operator[](R_xlen_t i) const
Definition: cbind.h:197
R_xlen_t ncol() const
Definition: cbind.h:195
stored_type operator[](R_xlen_t i) const
Definition: cbind.h:154
stored_type operator()(R_xlen_t i, R_xlen_t j) const
Definition: cbind.h:158
static yes test(typename C::stored_type *)
Rcpp::traits::enable_if< has_stored_type< T >::value, MakeBindableCall< T, true > >::type MakeBindable(const T &t)
Definition: cbind.h:446
JoinOp< RTYPE, E1, E2 > operator,(const BindableExpression< RTYPE, E1 > &e1, const BindableExpression< RTYPE, E2 > &e2)
Definition: cbind.h:361
ScalarBindable< T > MakeScalarBindable(const T &t)
Definition: cbind.h:355
ContainerBindable< RTYPE, Rcpp::Matrix< RTYPE > > MakeContainerBindable(const Rcpp::Matrix< RTYPE > &x)
Definition: cbind.h:331
cbind_impl::matrix_return< T1 >::type cbind(const T1 &t1, const T2 &t2)
Definition: cbind.h:516
Rcpp API.
Definition: algo.h:28
void NORET stop(const char *fmt, Args &&... args)
Definition: exceptions.h:51
ContainerBindable< LGLSXP, T > operator()(const T &t) const
Definition: cbind.h:415
ContainerBindable< LGLSXP, T > operator()(const T &t) const
Definition: cbind.h:427
ScalarBindable< T > operator()(const T &t) const
Definition: cbind.h:436
ContainerBindable< RTYPE, T > operator()(const T &t) const
Definition: cbind.h:402
cbind_storage_type< cbind_sexptype_traits< typename T::stored_type >::rtype >::type stored_type
Definition: cbind.h:398
cbind_storage_type< cbind_sexptype_traits< typename T::stored_type >::rtype >::type stored_type
Definition: cbind.h:469
cbind_storage_type< RTYPE >::type type
Definition: cbind.h:130