blob: baf49e1a3a1687858b7bbad89c06866631097be1 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Test mp*_class assignment operators (+=, -=, etc)
2
3Copyright 2011 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
19
20#include "config.h"
21
22#include "gmpxx.h"
23#include "gmp-impl.h"
24#include "tests.h"
25
26using namespace std;
27
28#define FOR_ALL_SIGNED_BUILTIN(F) \
29 F(signed char) \
30 F(signed short) \
31 F(signed int) \
32 F(signed long) \
33 F(float) \
34 F(double)
35
36#define FOR_ALL_BUILTIN(F) \
37 FOR_ALL_SIGNED_BUILTIN(F) \
38 F(char) \
39 F(unsigned char) \
40 F(unsigned short) \
41 F(unsigned int) \
42 F(unsigned long)
43
44#define FOR_ALL_GMPXX(F) \
45 F(mpz_class) \
46 F(mpq_class) \
47 F(mpf_class)
48
49template<class T,class U> void f(T t, U u){
50 T a=t;
51 ASSERT_ALWAYS((a+=u)==(t+u)); ASSERT_ALWAYS(a==(t+u));
52 ASSERT_ALWAYS((a-=u)==t); ASSERT_ALWAYS(a==t);
53 ASSERT_ALWAYS((a*=u)==(t*u)); ASSERT_ALWAYS(a==(t*u));
54 ASSERT_ALWAYS((a/=u)==t); ASSERT_ALWAYS(a==t);
55 ASSERT_ALWAYS((a<<=5)==(t<<5)); ASSERT_ALWAYS(a==(t<<5));
56 ASSERT_ALWAYS((a>>=5)==t); ASSERT_ALWAYS(a==t);
57}
58
59template<class T,class U> void g(T t, U u){
60 T a=t;
61 ASSERT_ALWAYS((a%=u)==(t%u)); ASSERT_ALWAYS(a==(t%u));
62 a=t;
63 ASSERT_ALWAYS((a&=u)==(t&u)); ASSERT_ALWAYS(a==(t&u));
64 a=t;
65 ASSERT_ALWAYS((a|=u)==(t|u)); ASSERT_ALWAYS(a==(t|u));
66 a=t;
67 ASSERT_ALWAYS((a^=u)==(t^u)); ASSERT_ALWAYS(a==(t^u));
68}
69
70template<class T> void h(T t){
71 T a=t;
72 ASSERT_ALWAYS((a<<=5)==(t<<5)); ASSERT_ALWAYS(a==(t<<5));
73 ASSERT_ALWAYS((a>>=5)==t); ASSERT_ALWAYS(a==t);
74}
75
76template<class T, class U> void ffs(T t, U u){
77#define F(V) f(t,(V)u);
78 FOR_ALL_SIGNED_BUILTIN(F)
79 FOR_ALL_GMPXX(F)
80#undef F
81#define F(V) f(t,-(V)u);
82 FOR_ALL_GMPXX(F)
83#undef F
84}
85
86template<class T, class U> void ff(T t, U u){
87#define F(V) f(t,(V)u);
88 FOR_ALL_BUILTIN(F)
89 FOR_ALL_GMPXX(F)
90#undef F
91#define F(V) f(t,-(V)u);
92 FOR_ALL_GMPXX(F)
93#undef F
94}
95
96template<class U> void ggs(mpz_class t, U u){
97#define F(V) g(t,(V)u);
98 FOR_ALL_SIGNED_BUILTIN(F)
99#undef F
100 g(t,(mpz_class)u);
101 g(t,-(mpz_class)u);
102}
103
104template<class U> void gg(mpz_class t, U u){
105#define F(V) g(t,(V)u);
106 FOR_ALL_BUILTIN(F)
107#undef F
108 g(t,(mpz_class)u);
109 g(t,-(mpz_class)u);
110}
111
112void check(){
113 mpz_class z=18;
114 mpq_class q(7,2);
115 mpf_class d=3.375;
116 h(z); h(q); h(d);
117 ff(z,13); ff(q,13); ff(d,13);
118 ffs(z,-42); ffs(q,-42); ffs(d,-42);
119 gg(z,33); ggs(z,-22);
120}
121
122
123int
124main (void)
125{
126 tests_start();
127
128 check();
129
130 tests_end();
131 return 0;
132}