1 /* Test mp*_class ternary expressions.
3 Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of the GNU MP Library.
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
32 /* The various test cases are broken up into separate functions to keep down
33 compiler memory use. They're static so that any mistakenly omitted from
34 main() will provoke warnings (under gcc -Wall at least). */
39 // template<class Op1, class Op2>
40 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
41 // <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, Op2> >
43 mpz_class a(1), b(2), c(3);
45 d = a + b * c; ASSERT_ALWAYS(d == 7);
48 mpz_class a(1), b(2), c(3);
50 d = a - b * c; ASSERT_ALWAYS(d == -5);
57 // template <class T, class Op1, class Op2>
58 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
59 // <mpz_t, __gmp_binary_expr<mpz_class, T, Op1> >, Op2> >
64 d = a + b * c; ASSERT_ALWAYS(d == 7);
70 d = a - b * c; ASSERT_ALWAYS(d == -5);
77 // template <class T, class Op1, class Op2>
78 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
79 // <mpz_t, __gmp_binary_expr<T, mpz_class, Op1> >, Op2> >
84 d = a + c * b; ASSERT_ALWAYS(d == 7);
90 d = a - c * b; ASSERT_ALWAYS(d == -5);
97 // template <class T, class Op1, class Op2>
98 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
99 // <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, T>, Op1> >, Op2> >
101 mpz_class a(1), b(2), c(3);
104 e = a + b * (c + d); ASSERT_ALWAYS(e == 15);
107 mpz_class a(1), b(2), c(3);
110 e = a - b * (c + d); ASSERT_ALWAYS(e == -13);
117 // template <class T, class Op1, class Op2>
118 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
119 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpz_class, Op1> >, Op2> >
121 mpz_class a(1), b(2), c(3);
124 e = a + (b - d) * c; ASSERT_ALWAYS(e == -5);
127 mpz_class a(1), b(2), c(3);
130 e = a - (b - d) * c; ASSERT_ALWAYS(e == 7);
137 // template <class T, class U, class Op1, class Op2>
138 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
139 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, U, Op1> >, Op2> >
141 mpz_class a(1), b(2);
142 unsigned int c = 3, d = 4;
144 e = a + (b + c) * d; ASSERT_ALWAYS(e == 21);
147 mpz_class a(1), b(2);
148 unsigned int c = 3, d = 4;
150 e = a - (b + c) * d; ASSERT_ALWAYS(e == -19);
157 // template <class T, class U, class Op1, class Op2>
158 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
159 // <mpz_t, __gmp_binary_expr<T, __gmp_expr<mpz_t, U>, Op1> >, Op2> >
161 mpz_class a(1), b(2);
162 double c = 3.0, d = 4.0;
164 e = a + c * (b + d); ASSERT_ALWAYS(e == 19);
167 mpz_class a(1), b(2);
168 double c = 3.0, d = 4.0;
170 e = a - c * (b + d); ASSERT_ALWAYS(e == -17);
177 // template <class T, class U, class Op1, class Op2>
178 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr
179 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>,
182 mpz_class a(1), b(2), c(3);
183 signed int d = 4, e = 5;
185 f = a + (b - d) * (c + e); ASSERT_ALWAYS(f == -15);
188 mpz_class a(1), b(2), c(3);
189 signed int d = 4, e = 5;
191 f = a - (b - d) * (c + e); ASSERT_ALWAYS(f == 17);
198 // template <class T, class Op1, class Op2>
199 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
200 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, Op2> >
202 mpz_class a(1), b(2), c(3);
205 e = (a + d) + b * c; ASSERT_ALWAYS(e == 11);
208 mpz_class a(1), b(2), c(3);
211 e = (a + d) - b * c; ASSERT_ALWAYS(e == -1);
218 // template <class T, class U, class Op1, class Op2>
219 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
220 // __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, U, Op1> >, Op2> >
222 mpz_class a(1), b(2);
223 double c = 3.0, d = 4.0;
225 e = (a - c) + b * d; ASSERT_ALWAYS(e == 6);
228 mpz_class a(1), b(2);
229 double c = 3.0, d = 4.0;
231 e = (a - c) - b * d; ASSERT_ALWAYS(e == -10);
238 // template <class T, class U, class Op1, class Op2>
239 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>,
240 // __gmp_expr<mpz_t, __gmp_binary_expr<U, mpz_class, Op1> >, Op2> >
242 mpz_class a(1), b(2);
243 signed int c = 3, d = 4;
245 e = (a - c) + d * b; ASSERT_ALWAYS(e == 6);
248 mpz_class a(1), b(2);
249 signed int c = 3, d = 4;
251 e = (a - c) - d * b; ASSERT_ALWAYS(e == -10);
258 // template <class T, class U, class Op1, class Op2>
259 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
260 // <mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, U>, Op1> >, Op2> >
262 mpz_class a(1), b(2), c(3);
263 unsigned int d = 4, e = 5;
265 f = (a + d) + b * (c - e); ASSERT_ALWAYS(f == 1);
268 mpz_class a(1), b(2), c(3);
269 unsigned int d = 4, e = 5;
271 f = (a + d) - b * (c - e); ASSERT_ALWAYS(f == 9);
278 // template <class T, class U, class Op1, class Op2>
279 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
280 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, mpz_class, Op1> >, Op2> >
282 mpz_class a(1), b(2), c(3);
283 double d = 4.0, e = 5.0;
285 f = (a - d) + (b + e) * c; ASSERT_ALWAYS(f == 18);
288 mpz_class a(1), b(2), c(3);
289 double d = 4.0, e = 5.0;
291 f = (a - d) - (b + e) * c; ASSERT_ALWAYS(f == -24);
299 // template <class T, class U, class V, class Op1, class Op2>
300 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
301 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, V, Op1> >, Op2> >
303 mpz_class a(1), b(2);
304 signed int c = 3, d = 4, e = 5;
306 f = (a + c) + (b + d) * e; ASSERT_ALWAYS(f == 34);
309 mpz_class a(1), b(2);
310 signed int c = 3, d = 4, e = 5;
312 f = (a + c) - (b + d) * e; ASSERT_ALWAYS(f == -26);
319 // template <class T, class U, class V, class Op1, class Op2>
320 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
321 // <mpz_t, __gmp_binary_expr<U, __gmp_expr<mpz_t, V>, Op1> >, Op2> >
323 mpz_class a(1), b(2);
324 unsigned int c = 3, d = 4, e = 5;
326 f = (a - c) + d * (b - e); ASSERT_ALWAYS(f == -14);
329 mpz_class a(1), b(2);
330 unsigned int c = 3, d = 4, e = 5;
332 f = (a - c) - d * (b - e); ASSERT_ALWAYS(f == 10);
340 // template <class T, class U, class V, class Op1, class Op2>
341 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr
342 // <mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, __gmp_expr<mpz_t, V>,
345 mpz_class a(1), b(2), c(3);
346 double d = 4.0, e = 5.0, f = 6.0;
348 g = (a + d) + (b - e) * (c + f); ASSERT_ALWAYS(g == -22);
351 mpz_class a(1), b(2), c(3);
352 double d = 4.0, e = 5.0, f = 6.0;
354 g = (a + d) - (b - e) * (c + f); ASSERT_ALWAYS(g == 32);
361 // template <class Op1, class Op2>
362 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
363 // <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, Op1> >, mpz_class, Op2> >
365 mpz_class a(2), b(3), c(4);
367 d = a * b + c; ASSERT_ALWAYS(d == 10);
370 mpz_class a(2), b(3), c(4);
372 d = a * b - c; ASSERT_ALWAYS(d == 2);
379 // template <class T, class Op1, class Op2>
380 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
381 // <mpz_t, __gmp_binary_expr<mpz_class, T, Op1> >, mpz_class, Op2> >
383 mpz_class a(2), b(3);
386 d = a * c + b; ASSERT_ALWAYS(d == 11);
389 mpz_class a(2), b(3);
392 d = a * c - b; ASSERT_ALWAYS(d == 5);
400 // template <class T, class Op1, class Op2>
401 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr
402 // <mpz_t, __gmp_binary_expr<T, mpz_class, Op1> >, mpz_class, Op2> >
404 mpz_class a(2), b(3);
407 d = c * a + b; ASSERT_ALWAYS(d == 11);
410 mpz_class a(2), b(3);
413 d = c * a - b; ASSERT_ALWAYS(d == 5);
420 // template <class T, class Op1, class Op2>
421 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
422 // <mpz_class, __gmp_expr<mpz_t, T>, Op1> >, mpz_class, Op2> >
424 mpz_class a(2), b(3), c(4);
427 e = a * (b + d) + c; ASSERT_ALWAYS(e == 20);
430 mpz_class a(2), b(3), c(4);
433 e = a * (b + d) - c; ASSERT_ALWAYS(e == 12);
440 // template <class T, class Op1, class Op2>
441 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
442 // <__gmp_expr<mpz_t, T>, mpz_class, Op1> >, mpz_class, Op2> >
444 mpz_class a(2), b(3), c(4);
447 e = (a - d) * b + c; ASSERT_ALWAYS(e == -5);
450 mpz_class a(2), b(3), c(4);
453 e = (a - d) * b - c; ASSERT_ALWAYS(e == -13);
460 // template <class T, class U, class Op1, class Op2>
461 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
462 // <__gmp_expr<mpz_t, T>, U, Op1> >, mpz_class, Op2> >
464 mpz_class a(2), b(3);
465 unsigned int c = 4, d = 5;
467 e = (a + c) * d + b; ASSERT_ALWAYS(e == 33);
470 mpz_class a(2), b(3);
471 unsigned int c = 4, d = 5;
473 e = (a + c) * d - b; ASSERT_ALWAYS(e == 27);
480 // template <class T, class U, class Op1, class Op2>
481 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
482 // <T, __gmp_expr<mpz_t, U>, Op1> >, mpz_class, Op2> >
484 mpz_class a(2), b(3);
485 double c = 4.0, d = 5.0;
487 e = c * (a + d) + b; ASSERT_ALWAYS(e == 31);
490 mpz_class a(2), b(3);
491 double c = 4.0, d = 5.0;
493 e = c * (a + d) - b; ASSERT_ALWAYS(e == 25);
501 // template <class T, class U, class Op1, class Op2>
502 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
503 // <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, Op1> >, mpz_class, Op2> >
505 mpz_class a(2), b(3), c(4);
506 signed int d = 5, e = 6;
508 f = (a - d) * (b + e) + c; ASSERT_ALWAYS(f == -23);
511 mpz_class a(2), b(3), c(4);
512 signed int d = 5, e = 6;
514 f = (a - d) * (b + e) - c; ASSERT_ALWAYS(f == -31);
521 // template <class T, class Op1, class Op2>
522 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
523 // <mpz_class, mpz_class, Op1> >, __gmp_expr<mpz_t, T>, Op2> >
525 mpz_class a(2), b(3), c(4);
528 e = a * b + (c - d); ASSERT_ALWAYS(e == 5);
531 mpz_class a(2), b(3), c(4);
534 e = a * b - (c - d); ASSERT_ALWAYS(e == 7);
541 // template <class T, class U, class Op1, class Op2>
542 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
543 // <mpz_class, T, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
545 mpz_class a(2), b(3);
546 double c = 4.0, d = 5.0;
548 e = a * c + (b + d); ASSERT_ALWAYS(e == 16);
551 mpz_class a(2), b(3);
552 double c = 4.0, d = 5.0;
554 e = a * c - (b + d); ASSERT_ALWAYS(e == 0);
561 // template <class T, class U, class Op1, class Op2>
562 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
563 // <T, mpz_class, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
565 mpz_class a(2), b(3);
566 signed int c = 4, d = 5;
568 e = c * a + (b - d); ASSERT_ALWAYS(e == 6);
571 mpz_class a(2), b(3);
572 signed int c = 4, d = 5;
574 e = c * a - (b - d); ASSERT_ALWAYS(e == 10);
581 // template <class T, class U, class Op1, class Op2>
582 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
583 // <mpz_class, __gmp_expr<mpz_t, T>, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
585 mpz_class a(2), b(3), c(4);
586 unsigned int d = 5, e = 6;
588 f = a * (b - d) + (c + e); ASSERT_ALWAYS(f == 6);
591 mpz_class a(2), b(3), c(4);
592 unsigned int d = 5, e = 6;
594 f = a * (b - d) - (c + e); ASSERT_ALWAYS(f == -14);
601 // template <class T, class U, class Op1, class Op2>
602 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
603 // <__gmp_expr<mpz_t, T>, mpz_class, Op1> >, __gmp_expr<mpz_t, U>, Op2> >
605 mpz_class a(2), b(3), c(4);
606 double d = 5.0, e = 6.0;
608 f = (a + d) * b + (c - e); ASSERT_ALWAYS(f == 19);
611 mpz_class a(2), b(3), c(4);
612 double d = 5.0, e = 6.0;
614 f = (a + d) * b - (c - e); ASSERT_ALWAYS(f == 23);
621 // template <class T, class U, class V, class Op1, class Op2>
622 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
623 // <__gmp_expr<mpz_t, T>, U, Op1> >, __gmp_expr<mpz_t, V>, Op2> >
625 mpz_class a(2), b(3);
626 signed int c = 4, d = 5, e = 6;
628 f = (a + c) * d + (b + e); ASSERT_ALWAYS(f == 39);
631 mpz_class a(2), b(3);
632 signed int c = 4, d = 5, e = 6;
634 f = (a + c) * d - (b + e); ASSERT_ALWAYS(f == 21);
641 // template <class T, class U, class V, class Op1, class Op2>
642 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
643 // <T, __gmp_expr<mpz_t, U>, Op1> >, __gmp_expr<mpz_t, V>, Op2> >
645 mpz_class a(2), b(3);
646 unsigned int c = 4, d = 5, e = 6;
648 f = c * (a + d) + (b - e); ASSERT_ALWAYS(f == 25);
651 mpz_class a(2), b(3);
652 unsigned int c = 4, d = 5, e = 6;
654 f = c * (a + d) - (b - e); ASSERT_ALWAYS(f == 31);
661 // template <class T, class U, class V, class Op1, class Op2>
662 // __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, __gmp_binary_expr
663 // <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, Op1> >,
664 // __gmp_expr<mpz_t, V>, Op2> >
666 mpz_class a(2), b(3), c(4);
667 double d = 5.0, e = 6.0, f = 7.0;
669 g = (a + d) * (b - e) + (c + f); ASSERT_ALWAYS(g == -10);
672 mpz_class a(2), b(3), c(4);
673 double d = 5.0, e = 6.0, f = 7.0;
675 g = (a + d) * (b - e) - (c + f); ASSERT_ALWAYS(g == -32);
682 // currently there's no ternary mpq operation
688 // currently there's no ternary mpf operation