From a423d2db41e026280cd883e31a20975fa814cb7e Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Mon, 30 Jan 2012 23:59:39 +0100 Subject: Initial C++11 support. --- gmpxx.h | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) (limited to 'gmpxx.h') diff --git a/gmpxx.h b/gmpxx.h index c629e14fa..16d90a44f 100644 --- a/gmpxx.h +++ b/gmpxx.h @@ -48,6 +48,18 @@ along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ #define __GMPXX_CONSTANT(X) false #endif +// Use C++11 features +#ifndef __GMPXX_USE_CXX11 +#if (__cplusplus >= 201103L) \ + || (__GMP_GNUC_PREREQ(4, 6) && defined __GXX_EXPERIMENTAL_CXX0X__) +#define __GMPXX_USE_CXX11 1 +#define __GMPXX_NOEXCEPT noexcept +#else +#define __GMPXX_USE_CXX11 0 +#define __GMPXX_NOEXCEPT +#endif +#endif + // Max allocations for plain types when converted to mpz_t #define __GMPZ_DBL_LIMBS (2 + DBL_MAX_EXP / GMP_NUMB_BITS) @@ -1412,6 +1424,10 @@ public: __gmp_expr() { mpz_init(mp); } __gmp_expr(const __gmp_expr &z) { mpz_init_set(mp, z.mp); } +#if __GMPXX_USE_CXX11 + __gmp_expr(__gmp_expr &&z) + { *mp = *z.mp; mpz_init(z.mp); } +#endif template __gmp_expr(const __gmp_expr &expr) { mpz_init(mp); __gmp_set_expr(mp, expr); } @@ -1456,11 +1472,15 @@ public: ~__gmp_expr() { mpz_clear(mp); } - void swap(__gmp_expr& z) { std::swap(*mp, *z.mp); } + void swap(__gmp_expr& z) __GMPXX_NOEXCEPT { std::swap(*mp, *z.mp); } // assignment operators __gmp_expr & operator=(const __gmp_expr &z) { mpz_set(mp, z.mp); return *this; } +#if __GMPXX_USE_CXX11 + __gmp_expr & operator=(__gmp_expr &&z) noexcept + { swap(z); return *this; } +#endif template __gmp_expr & operator=(const __gmp_expr &expr) { __gmp_set_expr(mp, expr); return *this; } @@ -1573,6 +1593,10 @@ public: mpz_init_set(mpq_numref(mp), mpq_numref(q.mp)); mpz_init_set(mpq_denref(mp), mpq_denref(q.mp)); } +#if __GMPXX_USE_CXX11 + __gmp_expr(__gmp_expr &&q) + { *mp = *q.mp; mpq_init(q.mp); } +#endif template __gmp_expr(const __gmp_expr &expr) { mpq_init(mp); __gmp_set_expr(mp, expr); } @@ -1631,11 +1655,17 @@ public: ~__gmp_expr() { mpq_clear(mp); } - void swap(__gmp_expr& q) { std::swap(*mp, *q.mp); } + void swap(__gmp_expr& q) __GMPXX_NOEXCEPT { std::swap(*mp, *q.mp); } // assignment operators __gmp_expr & operator=(const __gmp_expr &q) { mpq_set(mp, q.mp); return *this; } +#if __GMPXX_USE_CXX11 + __gmp_expr & operator=(__gmp_expr &&q) noexcept + { swap(q); return *this; } + __gmp_expr & operator=(mpz_class &&z) noexcept + { get_num() = std::move(z); get_den() = 1u; return *this; } +#endif template __gmp_expr & operator=(const __gmp_expr &expr) { __gmp_set_expr(mp, expr); return *this; } @@ -1749,6 +1779,10 @@ public: __gmp_expr(const __gmp_expr &f) { mpf_init2(mp, f.get_prec()); mpf_set(mp, f.mp); } +#if __GMPXX_USE_CXX11 + __gmp_expr(__gmp_expr &&f) + { *mp = *f.mp; mpf_init2(f.mp, get_prec()); } +#endif __gmp_expr(const __gmp_expr &f, mp_bitcnt_t prec) { mpf_init2(mp, prec); mpf_set(mp, f.mp); } template @@ -1838,11 +1872,15 @@ public: ~__gmp_expr() { mpf_clear(mp); } - void swap(__gmp_expr& f) { std::swap(*mp, *f.mp); } + void swap(__gmp_expr& f) __GMPXX_NOEXCEPT { std::swap(*mp, *f.mp); } // assignment operators __gmp_expr & operator=(const __gmp_expr &f) { mpf_set(mp, f.mp); return *this; } +#if __GMPXX_USE_CXX11 + __gmp_expr & operator=(__gmp_expr &&f) noexcept + { swap(f); return *this; } +#endif template __gmp_expr & operator=(const __gmp_expr &expr) { __gmp_set_expr(mp, expr); return *this; } @@ -2065,7 +2103,7 @@ private: __gmp_unary_expr expr; public: - __gmp_expr(const val_type &val) : expr(val) { } + explicit __gmp_expr(const val_type &val) : expr(val) { } void eval(typename __gmp_resolve_expr::ptr_type p, mp_bitcnt_t = 0) const { Op::eval(p, expr.val.__get_mp()); } @@ -2084,7 +2122,7 @@ private: __gmp_unary_expr expr; public: - __gmp_expr(const val_type &val) : expr(val) { } + explicit __gmp_expr(const val_type &val) : expr(val) { } void eval(typename __gmp_resolve_expr::ptr_type p) const { expr.val.eval(p); Op::eval(p, p); } void eval(typename __gmp_resolve_expr::ptr_type p, @@ -3008,7 +3046,8 @@ __GMP_DEFINE_UNARY_TYPE_FUNCTION(int, sgn, __gmp_sgn_function) __GMP_DEFINE_BINARY_TYPE_FUNCTION(int, cmp, __gmp_cmp_function) template -void swap(__gmp_expr& x, __gmp_expr& y) { x.swap(y); } +void swap(__gmp_expr& x, __gmp_expr& y) __GMPXX_NOEXCEPT +{ x.swap(y); } // member operators for mpz_class -- cgit v1.2.1