46 template<
class Type1,
class Type2>
49 const UList<Type1>& f1,
50 const UList<Type2>& f2,
54 if (f1.size() != f2.size())
58 "checkFields(const UList<Type1>&, "
59 "const UList<Type2>&, const char*)"
60 ) <<
" incompatible fields"
61 <<
" Field<"<<pTraits<Type1>::typeName<<
"> f1("<<f1.size()<<
')'
62 <<
" and Field<"<<pTraits<Type2>::typeName<<
"> f2("<<f2.size()<<
')'
63 <<
endl <<
" for operation " << op
68 template<
class Type1,
class Type2,
class Type3>
71 const UList<Type1>& f1,
72 const UList<Type2>& f2,
73 const UList<Type3>& f3,
77 if (f1.size() != f2.size() || f1.size() != f3.size())
81 "checkFields(const UList<Type1>&, "
82 "const UList<Type2>&, const UList<Type3>&, "
84 ) <<
" incompatible fields"
85 <<
" Field<"<<pTraits<Type1>::typeName<<
"> f1("<<f1.size()<<
')'
86 <<
", Field<"<<pTraits<Type2>::typeName<<
"> f2("<<f2.size()<<
')'
87 <<
" and Field<"<<pTraits<Type3>::typeName<<
"> f3("<<f3.size()<<
')'
88 <<
endl <<
" for operation " << op
95 template<
class Type1,
class Type2>
104 template<
class Type1,
class Type2,
class Type3>
121 #define TFOR_ALL_F_OP_FUNC_F(typeF1, f1, OP, FUNC, typeF2, f2) \
124 checkFields(f1, f2, "f1 " #OP " " #FUNC "(f2)"); \
127 List_ACCESS(typeF1, f1, f1P); \
128 List_CONST_ACCESS(typeF2, f2, f2P); \
131 List_FOR_ALL(f1, i) \
132 List_ELEM(f1, f1P, i) OP FUNC(List_ELEM(f2, f2P, i)); \
136 #define TFOR_ALL_F_OP_F_FUNC(typeF1, f1, OP, typeF2, f2, FUNC) \
139 checkFields(f1, f2, "f1 " #OP " f2" #FUNC); \
142 List_ACCESS(typeF1, f1, f1P); \
143 List_CONST_ACCESS(typeF2, f2, f2P); \
146 List_FOR_ALL(f1, i) \
147 List_ELEM(f1, f1P, i) OP List_ELEM(f2, f2P, i).FUNC(); \
153 #define TFOR_ALL_F_OP_FUNC_F_F(typeF1, f1, OP, FUNC, typeF2, f2, typeF3, f3)\
156 checkFields(f1, f2, f3, "f1 " #OP " " #FUNC "(f2, f3)"); \
159 List_ACCESS(typeF1, f1, f1P); \
160 List_CONST_ACCESS(typeF2, f2, f2P); \
161 List_CONST_ACCESS(typeF3, f3, f3P); \
164 List_FOR_ALL(f1, i) \
165 List_ELEM(f1, f1P, i) \
166 OP FUNC(List_ELEM(f2, f2P, i), List_ELEM(f3, f3P, i)); \
172 #define TFOR_ALL_S_OP_FUNC_F_F(typeS, s, OP, FUNC, typeF1, f1, typeF2, f2) \
175 checkFields(f1, f2, "s " #OP " " #FUNC "(f1, f2)"); \
178 List_CONST_ACCESS(typeF1, f1, f1P); \
179 List_CONST_ACCESS(typeF2, f2, f2P); \
182 List_FOR_ALL(f1, i) \
183 (s) OP FUNC(List_ELEM(f1, f1P, i), List_ELEM(f2, f2P, i)); \
189 #define TFOR_ALL_F_OP_FUNC_F_S(typeF1, f1, OP, FUNC, typeF2, f2, typeS, s) \
192 checkFields(f1, f2, "f1 " #OP " " #FUNC "(f2, s)"); \
195 List_ACCESS(typeF1, f1, f1P); \
196 List_CONST_ACCESS(typeF2, f2, f2P); \
199 List_FOR_ALL(f1, i) \
200 List_ELEM(f1, f1P, i) OP FUNC(List_ELEM(f2, f2P, i), (s)); \
206 #define TFOR_ALL_S_OP_FUNC_F_S(typeS1, s1, OP, FUNC, typeF, f, typeS2, s2) \
209 List_CONST_ACCESS(typeF, f, fP); \
213 (s1) OP FUNC(List_ELEM(f, fP, i), (s2)); \
219 #define TFOR_ALL_F_OP_FUNC_S_F(typeF1, f1, OP, FUNC, typeS, s, typeF2, f2) \
222 checkFields(f1, f2, "f1 " #OP " " #FUNC "(s, f2)"); \
225 List_ACCESS(typeF1, f1, f1P); \
226 List_CONST_ACCESS(typeF2, f2, f2P); \
229 List_FOR_ALL(f1, i) \
230 List_ELEM(f1, f1P, i) OP FUNC((s), List_ELEM(f2, f2P, i)); \
236 #define TFOR_ALL_F_OP_FUNC_S_S(typeF1, f1, OP, FUNC, typeS1, s1, typeS2, s2)\
239 List_ACCESS(typeF1, f1, f1P); \
242 List_FOR_ALL(f1, i) \
243 List_ELEM(f1, f1P, i) OP FUNC((s1), (s2)); \
249 #define TFOR_ALL_F_OP_F_FUNC_S(typeF1, f1, OP, typeF2, f2, FUNC, typeS, s) \
252 checkFields(f1, f2, "f1 " #OP " f2 " #FUNC "(s)"); \
255 List_ACCESS(typeF1, f1, f1P); \
256 List_CONST_ACCESS(typeF2, f2, f2P); \
259 List_FOR_ALL(f1, i) \
260 List_ELEM(f1, f1P, i) OP List_ELEM(f2, f2P, i) FUNC((s)); \
268 #define TFOR_ALL_F_OP_F_OP_F(typeF1, f1, OP1, typeF2, f2, OP2, typeF3, f3) \
271 checkFields(f1, f2, f3, "f1 " #OP1 " f2 " #OP2 " f3"); \
274 List_ACCESS(typeF1, f1, f1P); \
275 List_CONST_ACCESS(typeF2, f2, f2P); \
276 List_CONST_ACCESS(typeF3, f3, f3P); \
279 List_FOR_ALL(f1, i) \
280 List_ELEM(f1, f1P, i) OP1 List_ELEM(f2, f2P, i) \
281 OP2 List_ELEM(f3, f3P, i); \
287 #define TFOR_ALL_F_OP_S_OP_F(typeF1, f1, OP1, typeS, s, OP2, typeF2, f2) \
290 checkFields(f1, f2, "f1 " #OP1 " s " #OP2 " f2"); \
293 List_ACCESS(typeF1, f1, f1P); \
294 List_CONST_ACCESS(typeF2, f2, f2P); \
297 List_FOR_ALL(f1, i) \
298 List_ELEM(f1, f1P, i) OP1 (s) OP2 List_ELEM(f2, f2P, i); \
304 #define TFOR_ALL_F_OP_F_OP_S(typeF1, f1, OP1, typeF2, f2, OP2, typeS, s) \
307 checkFields(f1, f2, "f1 " #OP1 " f2 " #OP2 " s"); \
310 List_ACCESS(typeF1, f1, f1P); \
311 List_CONST_ACCESS(typeF2, f2, f2P); \
314 List_FOR_ALL(f1, i) \
315 List_ELEM(f1, f1P, i) OP1 List_ELEM(f2, f2P, i) OP2 (s); \
321 #define TFOR_ALL_F_OP_F(typeF1, f1, OP, typeF2, f2) \
324 checkFields(f1, f2, "f1 " #OP " f2"); \
328 List_ACCESS(typeF1, f1, f1P); \
329 List_CONST_ACCESS(typeF2, f2, f2P); \
332 List_FOR_ALL(f1, i) \
333 List_ELEM(f1, f1P, i) OP List_ELEM(f2, f2P, i); \
338 #define TFOR_ALL_F_OP_OP_F(typeF1, f1, OP1, OP2, typeF2, f2) \
341 checkFields(f1, f2, #OP1 " " #OP2 " f2"); \
345 List_ACCESS(typeF1, f1, f1P); \
346 List_CONST_ACCESS(typeF2, f2, f2P); \
349 List_FOR_ALL(f1, i) \
350 List_ELEM(f1, f1P, i) OP1 OP2 List_ELEM(f2, f2P, i); \
356 #define TFOR_ALL_F_OP_S(typeF, f, OP, typeS, s) \
359 List_ACCESS(typeF, f, fP); \
363 List_ELEM(f, fP, i) OP (s); \
372 #define TFOR_ALL_S_OP_F(typeS, s, OP, typeF, f) \
375 List_CONST_ACCESS(typeF, f, fP); \
379 (s) OP List_ELEM(f, fP, i); \
385 #define TFOR_ALL_S_OP_F_OP_F(typeS, s, OP1, typeF1, f1, OP2, typeF2, f2) \
388 List_CONST_ACCESS(typeF1, f1, f1P); \
389 List_CONST_ACCESS(typeF2, f2, f2P); \
392 List_FOR_ALL(f1, i) \
393 (s) OP1 List_ELEM(f1, f1P, i) OP2 List_ELEM(f2, f2P, i); \
399 #define TFOR_ALL_S_OP_FUNC_F(typeS, s, OP, FUNC, typeF, f) \
402 List_CONST_ACCESS(typeF, f, fP); \
406 (s) OP FUNC(List_ELEM(f, fP, i)); \