/* 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 "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 <
class T,
class U>
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 <
class T,
class U>
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 <
class T>
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 <
class T,
class U>
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 <
class T,
class U>
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 <
class U>
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 <
class U>
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 ;
}
Messung V0.5 in Prozent C=97 H=94 G=95
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland