1717
1818#pragma once
1919
20- #include < Rcpp.h>
2120#include < iterator>
2221#include < algorithm>
2322#include < cstddef>
@@ -107,24 +106,23 @@ class binary_operator : public operand< binary_operator< LhsIterator, RhsIterato
107106 LhsIterator m_lhsEnd;
108107 RhsIterator m_rhsBegin;
109108 RhsIterator m_rhsEnd;
110- std:: size_t m_length ;
109+ dims_t m_dims ;
111110 Op m_operator;
112111
113112public:
114- binary_operator (LhsIterator lhsBegin, LhsIterator lhsEnd, int64_t lhsSize ,
115- RhsIterator rhsBegin, RhsIterator rhsEnd, int64_t rhsSize , const Op &op) :
113+ binary_operator (LhsIterator lhsBegin, LhsIterator lhsEnd, dims_t lhsDims ,
114+ RhsIterator rhsBegin, RhsIterator rhsEnd, dims_t rhsDims , const Op &op) :
116115 m_lhsBegin (lhsBegin), m_lhsEnd(lhsEnd), m_rhsBegin(rhsBegin),
117- m_rhsEnd (rhsEnd), m_length(std::max(lhsSize, rhsSize)),
118- m_operator (op) {
116+ m_rhsEnd (rhsEnd), m_operator(op) {
119117
120- if (lhsSize != rhsSize && lhsSize != -1 && rhsSize != -1 ) {
121- std::cout << lhsSize << " , " << rhsSize << std::endl;
122- throw bounds_exception ();
123- }
118+ m_dims = m_operator.result_dims (lhsDims, rhsDims);
124119 }
125120
126- int64_t length () const {return m_length;}
127- int64_t size () const {return m_length;}
121+ dims_t dims () const {return m_dims;}
122+ int64_t size () const {
123+ return (m_dims.second != 0 ) ? m_dims.first * m_dims.second
124+ : m_dims.first ;
125+ }
128126 const_iterator begin () const {return const_iterator (m_lhsBegin, m_rhsBegin, &m_operator);}
129127 const_iterator end () const {return const_iterator (m_lhsEnd, m_rhsEnd, &m_operator);}
130128};
@@ -136,8 +134,8 @@ struct make_binary_operator
136134 binary_operator< typename LHS::const_iterator, typename RHS::const_iterator, Op, NA > operator ()(const LHS &lhs, const RHS &rhs, const Op &op) {
137135
138136 return binary_operator< typename LHS::const_iterator, typename RHS::const_iterator, Op, NA >(
139- lhs.begin (), lhs.end (), hooks::extract_size (lhs),
140- rhs.begin (), rhs.end (), hooks::extract_size (rhs),
137+ lhs.begin (), lhs.end (), hooks::extract_dims (lhs),
138+ rhs.begin (), rhs.end (), hooks::extract_dims (rhs),
141139 op);
142140 }
143141};
0 commit comments