[Gmp-commit] /var/hg/gmp: Test the C++ operators +=, -=, etc.
mercurial at gmplib.org
mercurial at gmplib.org
Sat May 7 12:54:33 CEST 2011
details: /var/hg/gmp/rev/bcfafd61a35f
changeset: 14173:bcfafd61a35f
user: Marc Glisse <marc.glisse at inria.fr>
date: Sat May 07 12:54:30 2011 +0200
description:
Test the C++ operators +=, -=, etc.
diffstat:
ChangeLog | 3 +
tests/cxx/Makefile.am | 4 +-
tests/cxx/t-ops3.cc | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 139 insertions(+), 1 deletions(-)
diffs (171 lines):
diff -r e0ac218917f8 -r bcfafd61a35f ChangeLog
--- a/ChangeLog Sat May 07 09:47:17 2011 +0200
+++ b/ChangeLog Sat May 07 12:54:30 2011 +0200
@@ -17,6 +17,9 @@
(mpz_class): Dedup the string constructors.
(mpq_class): Likewise.
+ * tests/cxx/t-ops3.cc: New file.
+ * tests/cxx/Makefile.am: Added t-ops3.
+
2011-05-05 Torbjorn Granlund <tege at gmplib.org>
* mpz/gcdext.c: Correct sgn computation.
diff -r e0ac218917f8 -r bcfafd61a35f tests/cxx/Makefile.am
--- a/tests/cxx/Makefile.am Sat May 07 09:47:17 2011 +0200
+++ b/tests/cxx/Makefile.am Sat May 07 12:54:30 2011 +0200
@@ -31,7 +31,8 @@
if WANT_CXX
check_PROGRAMS = t-assign t-binary t-cast t-constr t-headers t-istream \
- t-locale t-misc t-mix t-ops t-ops2 t-ostream t-prec t-rand t-ternary t-unary
+ t-locale t-misc t-mix t-ops t-ops2 t-ops3 t-ostream t-prec t-rand \
+ t-ternary t-unary
TESTS = $(check_PROGRAMS)
endif
@@ -46,6 +47,7 @@
t_mix_SOURCES = t-mix.cc
t_ops_SOURCES = t-ops.cc
t_ops2_SOURCES = t-ops2.cc
+t_ops3_SOURCES = t-ops3.cc
t_ostream_SOURCES = t-ostream.cc
t_prec_SOURCES = t-prec.cc
t_rand_SOURCES = t-rand.cc
diff -r e0ac218917f8 -r bcfafd61a35f tests/cxx/t-ops3.cc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/cxx/t-ops3.cc Sat May 07 12:54:30 2011 +0200
@@ -0,0 +1,133 @@
+/* Test mp*_class assignment operators (+=, -=, etc)
+
+Copyright 2011 Free Software Foundation, Inc.
+
+This file is part of the GNU MP Library.
+
+The GNU MP Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser 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 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the GNU MP Library. If not, see http://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<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;
+}
More information about the gmp-commit
mailing list