[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