STK++ 0.9.13
STK_BinaryImpl.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright (C) 2004-2016 Serge Iovleff, Université Lille 1, Inria
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program; if not, write to the
16 Free Software Foundation, Inc.,
17 59 Temple Place,
18 Suite 330,
19 Boston, MA 02111-1307
20 USA
21
22 Contact : S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
23*/
24
25/*
26 * Project: stkpp::Arrays
27 * created on: 17 oct. 2012
28 * Author: iovleff, S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
29 **/
30
36#ifndef STK_BINARYIMPL_H
37#define STK_BINARYIMPL_H
38
39#define EGAL(arg1, arg2) ((arg1::structure_ == int(Arrays::arg2)))
40
41namespace STK
42{
43
44namespace hidden
45{
49template<typename FunctorOp, typename Lhs, typename Rhs, int LStructure_, int RStructure_>
51
52//----------------
53// Lhs array2D_
54template< typename FunctorOp, typename Lhs, typename Rhs>
55struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::array2D_>
56{
57 typedef typename FunctorOp::result_type result_type;
58 enum { structure_ = Arrays::array2D_
59 , binary_op_Kind_ = Arrays::binary_op_2D_
60 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
61 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
62 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
63 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
64 };
65 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
66 { return f(l.elt(i,j), r.elt(i,j));}
67};
68template< typename FunctorOp, typename Lhs, typename Rhs>
69struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::square_>
70{
71 typedef typename FunctorOp::result_type result_type;
72 enum { structure_ = Arrays::square_
73 , binary_op_Kind_ = Arrays::binary_op_2D_
74 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
75 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
76 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
77 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
78 };
79 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
80 { return f(l.elt(i,j), r.elt(i,j));}
81};
82template< typename FunctorOp, typename Lhs, typename Rhs>
83struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::diagonal_>
84{
85 typedef typename FunctorOp::result_type result_type;
86 typedef typename Rhs::Type RType;
87 enum { structure_ = Arrays::array2D_
88 , binary_op_Kind_= Arrays::binary_op_2D_Diag_
89 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
90 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
91 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
92 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
93 };
94 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
95 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
96};
97template< typename FunctorOp, typename Lhs, typename Rhs>
98struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::upper_triangular_>
99{
100 typedef typename FunctorOp::result_type result_type;
101 typedef typename Rhs::Type RType;
102 enum { structure_ = Arrays::array2D_
103 , binary_op_Kind_= Arrays::binary_op_2D_UpTri_
104 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
105 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
106 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
107 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
108 };
109 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
110 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
111};
112template< typename FunctorOp, typename Lhs, typename Rhs>
113struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::lower_triangular_>
114{
115 typedef typename FunctorOp::result_type result_type;
116 typedef typename Rhs::Type RType;
117 enum { structure_ = Arrays::array2D_
118 , binary_op_Kind_= Arrays::binary_op_2D_LowTri_
119 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
120 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
121 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
122 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
123 };
124 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
125 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
126};
127template< typename FunctorOp, typename Lhs, typename Rhs>
128struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::symmetric_>
129{
130 typedef typename FunctorOp::result_type result_type;
131 enum { structure_ = Arrays::square_
132 , binary_op_Kind_= Arrays::binary_op_2D_Sym_
133 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
134 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
135 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
136 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
137 };
138 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
139 { return f(l.elt(i,j), r.elt(i,j));}
140};
141template< typename FunctorOp, typename Lhs, typename Rhs>
142struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::upper_symmetric_>
143{
144 typedef typename FunctorOp::result_type result_type;
145 enum { structure_ = Arrays::array2D_
146 , binary_op_Kind_= Arrays::binary_op_2D_UpSym_
147 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
148 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
149 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
150 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
151 };
152 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
153 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
154};
155template< typename FunctorOp, typename Lhs, typename Rhs>
156struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::array2D_, Arrays::lower_symmetric_>
157{
158 typedef typename FunctorOp::result_type result_type;
159 enum { structure_ = Arrays::array2D_
160 , binary_op_Kind_= Arrays::binary_op_2D_LowSym_
161 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
162 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
163 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
164 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
165 };
166 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
167 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
168};
169
170
171
172//----------------
173// Lhs square_
174template< typename FunctorOp, typename Lhs, typename Rhs>
175struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::array2D_>
176{
177 typedef typename FunctorOp::result_type result_type;
178 enum { structure_ = Arrays::square_
179 , binary_op_Kind_ = Arrays::binary_op_2D_
180 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
181 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
182 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
183 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
184 };
185 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
186 { return f(l.elt(i,j), r.elt(i,j));}
187};
188template< typename FunctorOp, typename Lhs, typename Rhs>
189struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::square_>
190{
191 typedef typename FunctorOp::result_type result_type;
192 enum { structure_ = Arrays::square_
193 , binary_op_Kind_ = Arrays::binary_op_2D_
194 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
195 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
196 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
197 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
198 };
199 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
200 { return f(l.elt(i,j), r.elt(i,j));}
201};
202template< typename FunctorOp, typename Lhs, typename Rhs>
203struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::diagonal_>
204{
205 typedef typename FunctorOp::result_type result_type;
206 typedef typename Rhs::Type RType;
207 enum { structure_ = Arrays::square_
208 , binary_op_Kind_= Arrays::binary_op_2D_Diag_
209 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
210 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
211 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
212 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
213 };
214 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
215 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
216};
217template< typename FunctorOp, typename Lhs, typename Rhs>
218struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::upper_triangular_>
219{
220 typedef typename FunctorOp::result_type result_type;
221 typedef typename Rhs::Type RType;
222 enum { structure_ = Arrays::square_
223 , binary_op_Kind_= Arrays::binary_op_2D_UpTri_
224 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
225 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
226 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
227 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
228 };
229 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
230 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
231};
232template< typename FunctorOp, typename Lhs, typename Rhs>
233struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::lower_triangular_>
234{
235 typedef typename FunctorOp::result_type result_type;
236 typedef typename Rhs::Type RType;
237 enum { structure_ = Arrays::square_
238 , binary_op_Kind_= Arrays::binary_op_2D_LowTri_
239 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
240 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
241 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
242 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
243 };
244 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
245 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
246};
247template< typename FunctorOp, typename Lhs, typename Rhs>
248struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::symmetric_>
249{
250 typedef typename FunctorOp::result_type result_type;
251 enum { structure_ = Arrays::square_
252 , binary_op_Kind_= Arrays::binary_op_2D_Sym_
253 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
254 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
255 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
256 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
257 };
258 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
259 { return f(l.elt(i,j), r.elt(i,j));}
260};
261template< typename FunctorOp, typename Lhs, typename Rhs>
262struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::upper_symmetric_>
263{
264 typedef typename FunctorOp::result_type result_type;
265 enum { structure_ = Arrays::square_
266 , binary_op_Kind_= Arrays::binary_op_2D_UpSym_
267 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
268 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
269 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
270 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
271 };
272 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
273 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
274};
275template< typename FunctorOp, typename Lhs, typename Rhs>
276struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::square_, Arrays::lower_symmetric_>
277{
278 typedef typename FunctorOp::result_type result_type;
279 enum { structure_ = Arrays::square_
280 , binary_op_Kind_= Arrays::binary_op_2D_LowSym_
281 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
282 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
283 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
284 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
285 };
286 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
287 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
288};
289
290
291//----------------
292// lhs diagonal_
293template< typename FunctorOp, typename Lhs, typename Rhs>
294struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::array2D_>
295{
296 typedef typename FunctorOp::result_type result_type;
297 typedef typename Lhs::Type LType;
298 enum { structure_ = Arrays::array2D_
299 , binary_op_Kind_= Arrays::binary_op_Diag_2D_
300 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
301 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
302 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
303 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
304 };
305 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
306 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
307};
308template< typename FunctorOp, typename Lhs, typename Rhs>
309struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::square_>
310{
311 typedef typename FunctorOp::result_type result_type;
312 typedef typename Lhs::Type LType;
313 enum { structure_ = Arrays::square_
314 , binary_op_Kind_= Arrays::binary_op_Diag_2D_
315 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
316 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
317 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
318 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
319 };
320 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
321 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
322};
323template< typename FunctorOp, typename Lhs, typename Rhs>
324struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::upper_triangular_>
325{
326 typedef typename FunctorOp::result_type result_type;
327 typedef typename Lhs::Type LType;
328 typedef typename Rhs::Type RType;
329 enum { structure_ = Arrays::upper_triangular_
330 , binary_op_Kind_= Arrays::binary_op_Diag_UpTri_
331 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
332 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
333 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
334 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
335 };
336 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
337 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f( LType(), r.elt(i,j)) : f( LType(), RType());}
338};
339template< typename FunctorOp, typename Lhs, typename Rhs>
340struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::lower_triangular_>
341{
342 typedef typename FunctorOp::result_type result_type;
343 typedef typename Lhs::Type LType;
344 typedef typename Rhs::Type RType;
345 enum { structure_ = Arrays::lower_triangular_
346 , binary_op_Kind_= Arrays::binary_op_Diag_LowTri_
347 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
348 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
349 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
350 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
351 };
352 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
353 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f( LType(), r.elt(i,j)) : f( LType(), RType());}
354};
355template< typename FunctorOp, typename Lhs, typename Rhs>
356struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::symmetric_>
357{
358 typedef typename FunctorOp::result_type result_type;
359 typedef typename Lhs::Type LType;
360 enum { structure_ = Arrays::symmetric_
361 , binary_op_Kind_= Arrays::binary_op_Diag_Sym_
362 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
363 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
364 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
365 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
366 };
367 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
368 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
369};
370template< typename FunctorOp, typename Lhs, typename Rhs>
371struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::upper_symmetric_>
372{
373 typedef typename FunctorOp::result_type result_type;
374 typedef typename Lhs::Type LType;
375 enum { structure_ = Arrays::upper_symmetric_
376 , binary_op_Kind_= Arrays::binary_op_Diag_UpSym_
377 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
378 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
379 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
380 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
381 };
382 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
383 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f( LType(), r.elt(i,j)) : f( LType(), r.elt(j,i));}
384};
385template< typename FunctorOp, typename Lhs, typename Rhs>
386struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::lower_symmetric_>
387{
388 typedef typename FunctorOp::result_type result_type;
389 typedef typename Lhs::Type LType;
390 enum { structure_ = Arrays::lower_symmetric_
391 , binary_op_Kind_= Arrays::binary_op_Diag_LowSym_
392 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
393 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
394 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
395 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
396 };
397 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
398 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f( LType(), r.elt(i,j)) : f( LType(), r.elt(j,i));}
399};
400
401
402
403//-------------------------
404// lhs upper_triangular_
405template< typename FunctorOp, typename Lhs, typename Rhs>
406struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::array2D_>
407{
408 typedef typename FunctorOp::result_type result_type;
409 typedef typename Lhs::Type LType;
410 enum { structure_ = Arrays::array2D_
411 , binary_op_Kind_= Arrays::binary_op_UpTri_2D_
412 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
413 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
414 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
415 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
416 };
417 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
418 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
419};
420template< typename FunctorOp, typename Lhs, typename Rhs>
421struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::square_>
422{
423 typedef typename FunctorOp::result_type result_type;
424 typedef typename Lhs::Type LType;
425 enum { structure_ = Arrays::square_
426 , binary_op_Kind_= Arrays::binary_op_UpTri_2D_
427 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
428 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
429 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
430 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
431 };
432 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
433 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
434};
435template< typename FunctorOp, typename Lhs, typename Rhs>
436struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::diagonal_>
437{
438 typedef typename FunctorOp::result_type result_type;
439 typedef typename Lhs::Type LType;
440 typedef typename Rhs::Type RType;
441 enum { structure_ = Arrays::upper_triangular_
442 , binary_op_Kind_= Arrays::binary_op_UpTri_Diag_
443 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
444 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
445 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
446 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
447 };
448 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
449 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f(l.elt(i,j), RType()) : f(LType(), RType());}
450};
451template< typename FunctorOp, typename Lhs, typename Rhs>
452struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::upper_triangular_>
453{
454 typedef typename FunctorOp::result_type result_type;
455 typedef typename Lhs::Type LType;
456 typedef typename Rhs::Type RType;
457 enum { structure_ = Arrays::upper_triangular_
458 , binary_op_Kind_= Arrays::binary_op_UpTri_UpTri_
459 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
460 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
461 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
462 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
463 };
464 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
465 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(LType(), RType());}
466};
467template< typename FunctorOp, typename Lhs, typename Rhs>
468struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::lower_triangular_>
469{
470 typedef typename FunctorOp::result_type result_type;
471 typedef typename Lhs::Type LType;
472 typedef typename Rhs::Type RType;
473 enum { structure_ = Arrays::array2D_
474 , binary_op_Kind_= Arrays::binary_op_UpTri_LowTri_
475 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
476 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
477 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
478 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
479 };
480 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
481 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f(l.elt(i,j), RType()) : f(LType(), r.elt(i,j));}
482};
483template< typename FunctorOp, typename Lhs, typename Rhs>
484struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::symmetric_>
485{
486 typedef typename FunctorOp::result_type result_type;
487 typedef typename Lhs::Type LType;
488 enum { structure_ = Arrays::square_
489 , binary_op_Kind_= Arrays::binary_op_UpTri_Sym_
490 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
491 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
492 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
493 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
494 };
495 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
496 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
497};
498template< typename FunctorOp, typename Lhs, typename Rhs>
499struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::upper_symmetric_>
500{
501 typedef typename FunctorOp::result_type result_type;
502 typedef typename Lhs::Type LType;
503 enum { structure_ = Arrays::square_
504 , binary_op_Kind_= Arrays::binary_op_UpTri_UpSym_
505 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
506 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
507 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
508 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
509 };
510 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
511 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(j,i));}
512};
513template< typename FunctorOp, typename Lhs, typename Rhs>
514struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_triangular_, Arrays::lower_symmetric_>
515{
516 typedef typename FunctorOp::result_type result_type;
517 typedef typename Lhs::Type LType;
518 enum { structure_ = Arrays::square_
519 , binary_op_Kind_= Arrays::binary_op_UpTri_LowSym_
520 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
521 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
522 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
523 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
524 };
525 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
526 { return (i<=j) ? f(l.elt(i,j), r.elt(j,i)) : f( LType(), r.elt(i,j));}
527};
528
529
530
531// lhs is lower_triangular_
532template< typename FunctorOp, typename Lhs, typename Rhs>
533struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::array2D_>
534{
535 typedef typename FunctorOp::result_type result_type;
536 typedef typename Lhs::Type LType;
537 enum { structure_ = Arrays::array2D_
538 , binary_op_Kind_= Arrays::binary_op_LowTri_2D_
539 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
540 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
541 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
542 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
543 };
544 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
545 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
546};
547template< typename FunctorOp, typename Lhs, typename Rhs>
548struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::square_>
549{
550 typedef typename FunctorOp::result_type result_type;
551 typedef typename Lhs::Type LType;
552 enum { structure_ = Arrays::square_
553 , binary_op_Kind_= Arrays::binary_op_LowTri_2D_
554 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
555 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
556 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
557 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
558 };
559 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
560 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
561};
562template< typename FunctorOp, typename Lhs, typename Rhs>
563struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::diagonal_>
564{
565 typedef typename FunctorOp::result_type result_type;
566 typedef typename Lhs::Type LType;
567 typedef typename Rhs::Type RType;
568 enum { structure_ = Arrays::lower_triangular_
569 , binary_op_Kind_= Arrays::binary_op_LowTri_Diag_
570 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
571 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
572 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
573 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
574 };
575 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
576 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f(l.elt(i,j), RType()) : f( LType(), RType());}
577};
578template< typename FunctorOp, typename Lhs, typename Rhs>
579struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::upper_triangular_>
580{
581 typedef typename FunctorOp::result_type result_type;
582 typedef typename Lhs::Type LType;
583 typedef typename Rhs::Type RType;
584 enum { structure_ = Arrays::array2D_
585 , binary_op_Kind_= Arrays::binary_op_LowTri_UpTri_
586 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
587 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
588 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
589 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
590 };
591 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
592 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f(l.elt(i,j), RType()) : f( LType(), r.elt(i,j));}
593};
594template< typename FunctorOp, typename Lhs, typename Rhs>
595struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::lower_triangular_>
596{
597 typedef typename FunctorOp::result_type result_type;
598 typedef typename Lhs::Type LType;
599 typedef typename Rhs::Type RType;
600 enum { structure_ = Arrays::lower_triangular_
601 , binary_op_Kind_= Arrays::binary_op_LowTri_LowTri_
602 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
603 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
604 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
605 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
606 };
607 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
608 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), RType());}
609};
610template< typename FunctorOp, typename Lhs, typename Rhs>
611struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::symmetric_>
612{
613 typedef typename FunctorOp::result_type result_type;
614 typedef typename Lhs::Type LType;
615 enum { structure_ = Arrays::square_
616 , binary_op_Kind_= Arrays::binary_op_LowTri_Sym_
617 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
618 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
619 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
620 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
621 };
622 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
623 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(i,j));}
624};
625template< typename FunctorOp, typename Lhs, typename Rhs>
626struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::upper_symmetric_>
627{
628 typedef typename FunctorOp::result_type result_type;
629 typedef typename Lhs::Type LType;
630 enum { structure_ = Arrays::square_
631 , binary_op_Kind_= Arrays::binary_op_LowTri_UpSym_
632 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
633 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
634 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
635 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
636 };
637 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
638 { return (i>=j) ? f(l.elt(i,j), r.elt(j,i)) : f( LType(), r.elt(i,j));}
639};
640template< typename FunctorOp, typename Lhs, typename Rhs>
641struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_triangular_, Arrays::lower_symmetric_>
642{
643 typedef typename FunctorOp::result_type result_type;
644 typedef typename Lhs::Type LType;
645 enum { structure_ = Arrays::square_
646 , binary_op_Kind_= Arrays::binary_op_LowTri_LowSym_
647 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
648 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
649 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
650 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
651 };
652 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
653 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( LType(), r.elt(j,i));}
654};
655
656
657
658// lhs is symmetric_
659template< typename FunctorOp, typename Lhs, typename Rhs>
660struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::array2D_>
661{
662 typedef typename FunctorOp::result_type result_type;
663 enum { structure_ = Arrays::square_
664 , binary_op_Kind_= Arrays::binary_op_Sym_2D_
665 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
666 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
667 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
668 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
669 };
670 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
671 { return f(l.elt(i,j), r.elt(i,j));}
672};
673template< typename FunctorOp, typename Lhs, typename Rhs>
674struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::square_>
675{
676 typedef typename FunctorOp::result_type result_type;
677 enum { structure_ = Arrays::square_
678 , binary_op_Kind_= Arrays::binary_op_Sym_2D_
679 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
680 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
681 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
682 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
683 };
684 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
685 { return f(l.elt(i,j), r.elt(i,j));}
686};
687template< typename FunctorOp, typename Lhs, typename Rhs>
688struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::diagonal_>
689{
690 typedef typename FunctorOp::result_type result_type;
691 typedef typename Rhs::Type RType;
692 enum { structure_ = Arrays::symmetric_
693 , binary_op_Kind_= Arrays::binary_op_Sym_Diag_
694 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
695 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
696 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
697 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
698 };
699 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
700 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
701};
702template< typename FunctorOp, typename Lhs, typename Rhs>
703struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::upper_triangular_>
704{
705 typedef typename FunctorOp::result_type result_type;
706 typedef typename Rhs::Type RType;
707 enum { structure_ = Arrays::square_
708 , binary_op_Kind_= Arrays::binary_op_Sym_UpTri_
709 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
710 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
711 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
712 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
713 };
714 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
715 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
716};
717template< typename FunctorOp, typename Lhs, typename Rhs>
718struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::lower_triangular_>
719{
720 typedef typename FunctorOp::result_type result_type;
721 typedef typename Rhs::Type RType;
722 enum { structure_ = Arrays::square_
723 , binary_op_Kind_= Arrays::binary_op_Sym_LowTri_
724 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
725 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
726 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
727 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
728 };
729 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
730 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), RType());}
731};
732template< typename FunctorOp, typename Lhs, typename Rhs>
733struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::symmetric_>
734{
735 typedef typename FunctorOp::result_type result_type;
736 enum { structure_ = Arrays::symmetric_
737 , binary_op_Kind_= Arrays::binary_op_Sym_Sym_
738 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
739 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
740 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
741 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
742 };
743 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
744 { return f(l.elt(i,j), r.elt(i,j));}
745};
746template< typename FunctorOp, typename Lhs, typename Rhs>
747struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::upper_symmetric_>
748{
749 typedef typename FunctorOp::result_type result_type;
750 enum { structure_ = Arrays::symmetric_
751 , binary_op_Kind_= Arrays::binary_op_Sym_UpSym_
752 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
753 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
754 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
755 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
756 };
757 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
758 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
759};
760template< typename FunctorOp, typename Lhs, typename Rhs>
761struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::symmetric_, Arrays::lower_symmetric_>
762{
763 typedef typename FunctorOp::result_type result_type;
764 enum { structure_ = Arrays::symmetric_
765 , binary_op_Kind_= Arrays::binary_op_Sym_LowSym_
766 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
767 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
768 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
769 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
770 };
771 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
772 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(i,j), r.elt(j,i));}
773};
774
775
776//---------------------
777// lhs upper_symmetric_
778template< typename FunctorOp, typename Lhs, typename Rhs>
779struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::array2D_>
780{
781 typedef typename FunctorOp::result_type result_type;
782 enum { structure_ = Arrays::square_
783 , binary_op_Kind_= Arrays::binary_op_UpSym_2D_
784 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
785 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
786 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
787 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
788 };
789 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
790 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j,i), r.elt(i,j));}
791};
792template< typename FunctorOp, typename Lhs, typename Rhs>
793struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::square_>
794{
795 typedef typename FunctorOp::result_type result_type;
796 enum { structure_ = Arrays::square_
797 , binary_op_Kind_= Arrays::binary_op_UpSym_2D_
798 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
799 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
800 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
801 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
802 };
803 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
804 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j,i), r.elt(i,j));}
805};
806template< typename FunctorOp, typename Lhs, typename Rhs>
807struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::diagonal_>
808{
809 typedef typename FunctorOp::result_type result_type;
810 typedef typename Rhs::Type RType;
811 enum { structure_ = Arrays::upper_symmetric_
812 , binary_op_Kind_= Arrays::binary_op_UpSym_Diag_
813 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
814 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
815 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
816 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
817 };
818 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
819 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f(l.elt(i,j), RType()) : f(l.elt(j,i), RType());}
820};
821template< typename FunctorOp, typename Lhs, typename Rhs>
822struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::upper_triangular_>
823{
824 typedef typename FunctorOp::result_type result_type;
825 typedef typename Rhs::Type RType;
826 enum { structure_ = Arrays::upper_triangular_
827 , binary_op_Kind_= Arrays::binary_op_UpSym_UpTri_
828 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
829 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
830 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
831 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
832 };
833 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
834 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(j,i), RType());}
835};
836template< typename FunctorOp, typename Lhs, typename Rhs>
837struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::lower_triangular_>
838{
839 typedef typename FunctorOp::result_type result_type;
840 typedef typename Rhs::Type RType;
841 enum { structure_ = Arrays::square_
842 , binary_op_Kind_= Arrays::binary_op_UpSym_LowTri_
843 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
844 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
845 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
846 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
847 };
848 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
849 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i<j) ? f(l.elt(i,j), RType()) : f(l.elt(j,i), r.elt(i,j));}
850};
851template< typename FunctorOp, typename Lhs, typename Rhs>
852struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::symmetric_>
853{
854 typedef typename FunctorOp::result_type result_type;
855 enum { structure_ = Arrays::symmetric_
856 , binary_op_Kind_= Arrays::binary_op_UpSym_Sym_
857 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
858 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
859 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
860 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
861 };
862 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
863 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j,i), r.elt(i,j));}
864};
865template< typename FunctorOp, typename Lhs, typename Rhs>
866struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::upper_symmetric_>
867{
868 typedef typename FunctorOp::result_type result_type;
869 enum { structure_ = Arrays::upper_symmetric_
870 , binary_op_Kind_= Arrays::binary_op_UpSym_UpSym_
871 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
872 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
873 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
874 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
875 };
876 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
877 { return (i<=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j,i), r.elt(j,i));}
878};
879template< typename FunctorOp, typename Lhs, typename Rhs>
880struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::upper_symmetric_, Arrays::lower_symmetric_>
881{
882 typedef typename FunctorOp::result_type result_type;
883 enum { structure_ = Arrays::symmetric_
884 , binary_op_Kind_= Arrays::binary_op_UpSym_LowSym_
885 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
886 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
887 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
888 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
889 };
890 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
891 { return (i<=j) ? f(l.elt(i,j), r.elt(j,i)) : f( l.elt(j,i), r.elt(i,j));}
892};
893
894
895//-----------------------
896// lhs lower_symmetric_
897template< typename FunctorOp, typename Lhs, typename Rhs>
898struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::array2D_>
899{
900 typedef typename FunctorOp::result_type result_type;
901 enum { structure_ = Arrays::square_
902 , binary_op_Kind_= Arrays::binary_op_LowTri_2D_
903 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
904 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
905 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
906 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
907 };
908 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
909 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j, i), r.elt(i,j));}
910};
911template< typename FunctorOp, typename Lhs, typename Rhs>
912struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::square_>
913{
914 typedef typename FunctorOp::result_type result_type;
915 enum { structure_ = Arrays::square_
916 , binary_op_Kind_= Arrays::binary_op_LowTri_2D_
917 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
918 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
919 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
920 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
921 };
922 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
923 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j, i), r.elt(i,j));}
924};
925template< typename FunctorOp, typename Lhs, typename Rhs>
926struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::diagonal_>
927{
928 typedef typename FunctorOp::result_type result_type;
929 typedef typename Rhs::Type RType;
930 enum { structure_ = Arrays::lower_symmetric_
931 , binary_op_Kind_= Arrays::binary_op_LowTri_Diag_
932 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
933 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
934 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
935 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
936 };
937 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
938 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f(l.elt(i,j), RType()) : f(l.elt(j,i), RType());}
939};
940template< typename FunctorOp, typename Lhs, typename Rhs>
941struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::upper_triangular_>
942{
943 typedef typename FunctorOp::result_type result_type;
944 typedef typename Rhs::Type RType;
945 enum { structure_ = Arrays::square_
946 , binary_op_Kind_= Arrays::binary_op_LowSym_UpTri_
947 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
948 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
949 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
950 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
951 };
952 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
953 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : (i>j) ? f(l.elt(i,j), RType()) : f(l.elt(j,i), r.elt(i,j));}
954};
955template< typename FunctorOp, typename Lhs, typename Rhs>
956struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::lower_triangular_>
957{
958 typedef typename FunctorOp::result_type result_type;
959 typedef typename Rhs::Type RType;
960 enum { structure_ = Arrays::lower_triangular_
961 , binary_op_Kind_= Arrays::binary_op_LowSym_LowTri_
962 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
963 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
964 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
965 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
966 };
967 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
968 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(j,i), RType());}
969};
970template< typename FunctorOp, typename Lhs, typename Rhs>
971struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::symmetric_>
972{
973 typedef typename FunctorOp::result_type result_type;
974 enum { structure_ = Arrays::symmetric_
975 , binary_op_Kind_= Arrays::binary_op_LowSym_Sym_
976 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
977 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
978 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
979 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
980 };
981 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
982 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f( l.elt(j, i), r.elt(i,j));}
983};
984template< typename FunctorOp, typename Lhs, typename Rhs>
985struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::upper_symmetric_>
986{
987 typedef typename FunctorOp::result_type result_type;
988 enum { structure_ = Arrays::symmetric_
989 , binary_op_Kind_= Arrays::binary_op_LowSym_UpSym_
990 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
991 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
992 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
993 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
994 };
995 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
996 { return (i>=j) ? f(l.elt(i,j), r.elt(j,i)) : f(l.elt(j,i), r.elt(i,j));}
997};
998template< typename FunctorOp, typename Lhs, typename Rhs>
999struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::lower_symmetric_, Arrays::lower_symmetric_>
1000{
1001 typedef typename FunctorOp::result_type result_type;
1002 enum { structure_ = Arrays::lower_symmetric_
1003 , binary_op_Kind_= Arrays::binary_op_LowSym_LowSym_
1004 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
1005 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
1006 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1007 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1009 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1010 { return (i>=j) ? f(l.elt(i,j), r.elt(i,j)) : f(l.elt(j,i), r.elt(j,i));}
1011};
1012
1013
1014//--------------------------------------------------------------------------------------------
1015// 1D case
1016
1017//-----------------------
1018// Lhs diagonal_, Rhs 1D
1019template< typename FunctorOp, typename Lhs, typename Rhs>
1020struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::diagonal_>
1021{
1022 typedef typename FunctorOp::result_type result_type;
1023 typedef typename Lhs::Type LType;
1024 typedef typename Rhs::Type RType;
1025 enum { structure_ = Arrays::diagonal_
1026 , binary_op_Kind_= Arrays::binary_op_1D_
1027 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
1028 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
1029 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1030 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1032 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1033 { return (i==j) ? f(l.elt(i,j), r.elt(i,j)) : f(LType(), RType());}
1034 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1035 { return f(l.elt(i), r.elt(i));}
1036};
1037template< typename FunctorOp, typename Lhs, typename Rhs>
1038struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::point_>
1039{
1040 typedef typename FunctorOp::result_type result_type;
1041 enum { structure_ = Arrays::diagonal_
1042 , binary_op_Kind_= Arrays::binary_op_1D_
1043 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeCols_)
1044 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
1045 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsOtherSize_
1046 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1048 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1049 { return f(l.elt(i,j), r.elt(i,j));}
1050 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1051 { return f(l.elt(i), r.elt(i));}
1052};
1053template< typename FunctorOp, typename Lhs, typename Rhs>
1054struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::diagonal_, Arrays::vector_>
1055{
1056 typedef typename FunctorOp::result_type result_type;
1057 enum { structure_ = Arrays::diagonal_
1058 , binary_op_Kind_= Arrays::binary_op_1D_
1059 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
1060 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeRows_)
1061 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1062 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsOtherSize_
1064 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1065 { return f(l.elt(i,j), r.elt(i,j));}
1066 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1067 { return f(l.elt(i), r.elt(i));}
1068};
1069
1070//-----------------------
1071// Lhs vector_
1072template< typename FunctorOp, typename Lhs, typename Rhs>
1073struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::vector_, Arrays::diagonal_>
1074{
1075 typedef typename FunctorOp::result_type result_type;
1076 enum { structure_ = Arrays::diagonal_
1077 , binary_op_Kind_= Arrays::binary_op_1D_
1078 , sizeRows_ = Rhs::sizeRows_ != UnknownSize ? int(Rhs::sizeRows_) : int(Lhs::sizeCols_)
1079 , sizeCols_ = Rhs::sizeCols_ != UnknownSize ? int(Rhs::sizeCols_) : int(Lhs::sizeCols_)
1080 , useForRows_ = Rhs::sizeRows_ != UnknownSize ? Arrays::useRhsSize_ : Arrays::useLhsSize_
1081 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1083 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1084 { return f(l.elt(i,j), r.elt(i,j));}
1085 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1086 { return f(l.elt(i), r.elt(i));}
1087};
1088template< typename FunctorOp, typename Lhs, typename Rhs>
1089struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::vector_, Arrays::vector_>
1090{
1091 typedef typename FunctorOp::result_type result_type;
1092 enum { structure_ = Arrays::vector_
1093 , binary_op_Kind_= Arrays::binary_op_1D_
1094 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeRows_)
1095 , sizeCols_ = 1
1096 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1097 , useForCols_ = Arrays::useLhsSize_
1099 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1100 { return f(l.elt(i,j), r.elt(i,j));}
1101 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1102 { return f(l.elt(i), r.elt(i));}
1103};
1104template< typename FunctorOp, typename Lhs, typename Rhs>
1105struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::vector_, Arrays::point_>
1106{
1107 typedef typename FunctorOp::result_type result_type;
1108 enum { structure_ = Arrays::vector_ // vector + point is vector (somehow an arbitrary choice)
1109 , binary_op_Kind_= Arrays::binary_op_1D_
1110 , sizeRows_ = Lhs::sizeRows_ != UnknownSize ? int(Lhs::sizeRows_) : int(Rhs::sizeCols_)
1111 , sizeCols_ = 1
1112 , useForRows_ = Lhs::sizeRows_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsOtherSize_
1113 , useForCols_ = Arrays::useLhsSize_
1115 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1116 { return f(l.elt(i,j), r.elt(i,j));}
1117 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1118 { return f(l.elt(i), r.elt(i));}
1119};
1120
1121//-----------------------
1122// Lhs point_
1123template< typename FunctorOp, typename Lhs, typename Rhs>
1124struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::point_, Arrays::diagonal_>
1125{
1126 typedef typename FunctorOp::result_type result_type;
1127 enum { structure_ = Arrays::diagonal_ // point_ + diagonal_ is diagonal_
1128 , binary_op_Kind_= Arrays::binary_op_1D_
1129 , sizeRows_ = Rhs::sizeRows_ != UnknownSize ? int(Rhs::sizeRows_) : int(Lhs::sizeCols_)
1130 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
1131 , useForRows_ = Rhs::sizeRows_ != UnknownSize ? Arrays::useRhsSize_ : Arrays::useLhsOtherSize_
1132 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1134 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1135 { return f(l.elt(i,j), r.elt(i,j));}
1136 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1137 { return f(l.elt(i), r.elt(i));}
1138};
1139template< typename FunctorOp, typename Lhs, typename Rhs>
1140struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::point_, Arrays::vector_>
1141{
1142 typedef typename FunctorOp::result_type result_type;
1143 enum { structure_ = Arrays::point_ // point + vector_ is point_
1144 , binary_op_Kind_= Arrays::binary_op_1D_
1145 , sizeRows_ = 1
1146 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeRows_)
1147 , useForRows_ = Arrays::useLhsSize_
1148 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsOtherSize_
1150 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1151 { return f(l.elt(i,j), r.elt(i,j));}
1152 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1153 { return f(l.elt(i), r.elt(i));}
1154};
1155template< typename FunctorOp, typename Lhs, typename Rhs>
1156struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::point_, Arrays::point_>
1157{
1158 typedef typename FunctorOp::result_type result_type;
1159 enum { structure_ = Arrays::point_
1160 , binary_op_Kind_= Arrays::binary_op_1D_
1161 , sizeRows_ = 1
1162 , sizeCols_ = Lhs::sizeCols_ != UnknownSize ? int(Lhs::sizeCols_) : int(Rhs::sizeCols_)
1163 , useForRows_ = Arrays::useLhsSize_
1164 , useForCols_ = Lhs::sizeCols_ != UnknownSize ? Arrays::useLhsSize_ : Arrays::useRhsSize_
1166 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1167 { return f(l.elt(i,j), r.elt(i,j));}
1168 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1169 { return f(l.elt(i), r.elt(i));}
1170};
1171
1172//-----------------------
1173// Lhs number_
1174template< typename FunctorOp, typename Lhs, typename Rhs>
1175struct BinaryEltImpl< FunctorOp, Lhs, Rhs, Arrays::number_, Arrays::number_>
1176{
1177 typedef typename FunctorOp::result_type result_type;
1178 enum { structure_ = Arrays::number_
1179 , binary_op_Kind_= Arrays::binary_op_0D_
1180 , sizeRows_ = 1
1181 , sizeCols_ = 1
1182 , useForRows_ = Arrays::useLhsSize_
1183 , useForCols_ = Arrays::useLhsSize_
1185 inline static result_type elt2Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i, int j)
1186 { return f(l.elt(i,j), r.elt(i,j));}
1187 inline static result_type elt1Impl(FunctorOp const& f, Lhs const& l, Rhs const& r, int i)
1188 { return f(l.elt(i), r.elt(i));}
1189 inline static result_type elt0Impl(FunctorOp const& f, Lhs const& l, Rhs const& r)
1190 { return f(l.elt(), r.elt());}
1191};
1192
1201template< typename Lhs, typename Rhs, int Size_, int useForRows_>
1210template< typename Lhs, typename Rhs, int Size_, int useForCols_>
1215template<typename Lhs, typename Rhs, int Size_>
1216struct BinaryRowsImpl< Lhs, Rhs, Size_, Arrays::useLhsSize_>
1217{
1221 inline static RowRange const& rowsImpl(Lhs const& lhs, Rhs const& rhs) { return lhs.rows();}
1222};
1226template<typename Lhs, typename Rhs, int Size_>
1227struct BinaryRowsImpl<Lhs, Rhs, Size_, Arrays::useRhsSize_>
1228{
1232 inline static RowRange const& rowsImpl(Lhs const& lhs, Rhs const& rhs) { return rhs.rows();}
1233};
1237template<typename Lhs, typename Rhs, int Size_>
1238struct BinaryRowsImpl<Lhs, Rhs, Size_, Arrays::useLhsOtherSize_>
1239{
1243 inline static RowRange const& rowsImpl(Lhs const& lhs, Rhs const& rhs) { return lhs.cols();}
1244};
1248template<typename Lhs, typename Rhs, int Size_>
1249struct BinaryRowsImpl<Lhs, Rhs, Size_, Arrays::useRhsOtherSize_>
1250{
1254 inline static RowRange const& rowsImpl(Lhs const& lhs, Rhs const& rhs) { return rhs.cols();}
1255};
1259template<typename Lhs, typename Rhs, int Size_>
1260struct BinaryColsImpl<Lhs, Rhs, Size_, Arrays::useLhsSize_>
1261{
1265 inline static ColRange const& colsImpl(Lhs const& lhs, Rhs const& rhs) { return lhs.cols();}
1266};
1270template<typename Lhs, typename Rhs, int Size_>
1271struct BinaryColsImpl< Lhs, Rhs, Size_, Arrays::useRhsSize_>
1272{
1276 inline static ColRange const& colsImpl(Lhs const& lhs, Rhs const& rhs) { return rhs.cols();}
1277};
1281template<typename Lhs, typename Rhs, int Size_>
1282struct BinaryColsImpl< Lhs, Rhs, Size_, Arrays::useLhsOtherSize_>
1283{
1287 inline static ColRange const& colsImpl(Lhs const& lhs, Rhs const& rhs) { return lhs.rows();}
1288};
1292template<typename Lhs, typename Rhs, int Size_>
1293struct BinaryColsImpl< Lhs, Rhs,Size_, Arrays::useRhsOtherSize_>
1294{
1298 inline static ColRange const& colsImpl(Lhs const& lhs, Rhs const& rhs) { return rhs.rows();}
1299};
1300
1303template<typename Lhs, int Size_, int use_>
1305{
1309 inline static RangeType const& rangeImpl(Lhs const& lhs) { return lhs.range();}
1310};
1311
1312template<typename Lhs, int Size_>
1313struct DiagonalRangeImpl<Lhs, Size_, Arrays::useLhsSize_>
1314{
1318 inline static RangeType const& rangeImpl(Lhs const& lhs) { return lhs.rows();}
1319};
1320
1321template<typename Lhs, int Size_>
1322struct DiagonalRangeImpl<Lhs, Size_, Arrays::useLhsOtherSize_>
1323{
1327 inline static RangeType const& rangeImpl(Lhs const& lhs) { return lhs.cols();}
1328};
1329
1330
1335template<int Structure_> struct TransposeTraits
1336{ enum { structure_ = Structure_}; };
1338template<> struct TransposeTraits<Arrays::lower_triangular_>
1339{ enum { structure_ = Arrays::upper_triangular_}; };
1341template<> struct TransposeTraits<Arrays::upper_triangular_>
1342{ enum { structure_ = Arrays::lower_triangular_}; };
1344template<> struct TransposeTraits<Arrays::lower_symmetric_>
1345{ enum { structure_ = Arrays::upper_symmetric_}; };
1347template<> struct TransposeTraits<Arrays::upper_symmetric_>
1348{ enum { structure_ = Arrays::lower_symmetric_}; };
1350template<> struct TransposeTraits<Arrays::vector_>
1351{ enum { structure_ = Arrays::point_}; };
1353template<> struct TransposeTraits<Arrays::point_>
1354{ enum { structure_ = Arrays::vector_}; };
1355
1356} // end namespace hidden
1357
1358
1359} // namespace STK
1360
1361
1362#undef EGAL
1363
1364#endif /* STK_BINARYOPERATORS_H */
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
@ array2D_
general matrix/array/expression
@ square_
square matrix/array/expression
@ binary_op_2D_
both operand are array2d or square
const int UnknownSize
This value means that an integer is not known at compile-time, and that instead the value is stored i...
The namespace STK is the main domain space of the Statistical ToolKit project.
static ColRange const & colsImpl(Lhs const &lhs, Rhs const &rhs)
TRange< Size_ > ColRange
Type of the Range for the columns.
TRange< Size_ > ColRange
Type of the Range for the columns.
static ColRange const & colsImpl(Lhs const &lhs, Rhs const &rhs)
TRange< Size_ > ColRange
Type of the Range for the columns.
static ColRange const & colsImpl(Lhs const &lhs, Rhs const &rhs)
TRange< Size_ > ColRange
Type of the Range for the columns.
static ColRange const & colsImpl(Lhs const &lhs, Rhs const &rhs)
implement the access to the columns of the BinaryOperator Possible cases are:
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt0Impl(FunctorOp const &f, Lhs const &l, Rhs const &r)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt1Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i)
static result_type elt2Impl(FunctorOp const &f, Lhs const &l, Rhs const &r, int i, int j)
Helper class giving the Structure of a binary operator.
static RowRange const & rowsImpl(Lhs const &lhs, Rhs const &rhs)
TRange< Size_ > RowRange
Type of the Range for the rows.
static RowRange const & rowsImpl(Lhs const &lhs, Rhs const &rhs)
static RowRange const & rowsImpl(Lhs const &lhs, Rhs const &rhs)
TRange< Size_ > RowRange
Type of the Range for the rows.
static RowRange const & rowsImpl(Lhs const &lhs, Rhs const &rhs)
implement the access to the rows of the BinaryOperator Possible cases are:
TRange< Size_ > RangeType
Type of the Range for the rows.
Allow to disambiguate the call to range to use.
static RangeType const & rangeImpl(Lhs const &lhs)
TRange< Size_ > RangeType
Type of the Range for the rows.
Helper Traits class for transposed operator.