/* Test mp*_class assignment operators (+=, -=, etc) Copyright 2011 Free Software Foundation, Inc. This file is part of the GNU MP Library test suite. The GNU MP Library test suite is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. The GNU MP Library test suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ #include "config.h" #include "gmp.h" #include "gmpxx.h" #include "gmp-impl.h" #include "tests.h" using namespace std; #define FOR_ALL_SIGNED_BUILTIN(F) \ F(signed char) \ F(signed short) \ F(signed int) \ F(signed long) \ F(float) \ F(double) #define FOR_ALL_BUILTIN(F) \ FOR_ALL_SIGNED_BUILTIN(F) \ F(char) \ F(unsigned char) \ F(unsigned short) \ F(unsigned int) \ F(unsigned long) #define FOR_ALL_GMPXX(F) \ F(mpz_class) \ F(mpq_class) \ F(mpf_class) template void f(T t, U u){ T a=t; ASSERT_ALWAYS((a+=u)==(t+u)); ASSERT_ALWAYS(a==(t+u)); ASSERT_ALWAYS((a-=u)==t); ASSERT_ALWAYS(a==t); ASSERT_ALWAYS((a*=u)==(t*u)); ASSERT_ALWAYS(a==(t*u)); ASSERT_ALWAYS((a/=u)==t); ASSERT_ALWAYS(a==t); ASSERT_ALWAYS((a<<=5)==(t<<5)); ASSERT_ALWAYS(a==(t<<5)); ASSERT_ALWAYS((a>>=5)==t); ASSERT_ALWAYS(a==t); } template void g(T t, U u){ T a=t; ASSERT_ALWAYS((a%=u)==(t%u)); ASSERT_ALWAYS(a==(t%u)); a=t; ASSERT_ALWAYS((a&=u)==(t&u)); ASSERT_ALWAYS(a==(t&u)); a=t; ASSERT_ALWAYS((a|=u)==(t|u)); ASSERT_ALWAYS(a==(t|u)); a=t; ASSERT_ALWAYS((a^=u)==(t^u)); ASSERT_ALWAYS(a==(t^u)); } template void h(T t){ T a=t; ASSERT_ALWAYS((a<<=5)==(t<<5)); ASSERT_ALWAYS(a==(t<<5)); ASSERT_ALWAYS((a>>=5)==t); ASSERT_ALWAYS(a==t); } template void ffs(T t, U u){ #define F(V) f(t,(V)u); FOR_ALL_SIGNED_BUILTIN(F) FOR_ALL_GMPXX(F) #undef F #define F(V) f(t,-(V)u); FOR_ALL_GMPXX(F) #undef F } template void ff(T t, U u){ #define F(V) f(t,(V)u); FOR_ALL_BUILTIN(F) FOR_ALL_GMPXX(F) #undef F #define F(V) f(t,-(V)u); FOR_ALL_GMPXX(F) #undef F } template void ggs(mpz_class t, U u){ #define F(V) g(t,(V)u); FOR_ALL_SIGNED_BUILTIN(F) #undef F g(t,(mpz_class)u); g(t,-(mpz_class)u); } template void gg(mpz_class t, U u){ #define F(V) g(t,(V)u); FOR_ALL_BUILTIN(F) #undef F g(t,(mpz_class)u); g(t,-(mpz_class)u); } void check(){ mpz_class z=18; mpq_class q(7,2); mpf_class d=3.375; h(z); h(q); h(d); ff(z,13); ff(q,13); ff(d,13); ffs(z,-42); ffs(q,-42); ffs(d,-42); gg(z,33); ggs(z,-22); } int main (void) { tests_start(); check(); tests_end(); return 0; }