1 #ifndef SYMENGINE_MP_WRAPPER_H
2 #define SYMENGINE_MP_WRAPPER_H
4 #include <symengine/symengine_rcp.h>
7 #define SYMENGINE_UI(f) f##_ui
8 #define SYMENGINE_SI(f) f##_si
10 #define SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(op, func, val, rev_op) \
11 template <typename T, \
12 typename std::enable_if<std::is_integral<T>::value \
13 && std::is_unsigned<T>::value, \
16 inline friend bool operator op(const mpz_wrapper &a, const T b) \
18 return SYMENGINE_UI(func)(a.get_mpz_t(), b) op val; \
20 template <typename T, \
21 typename std::enable_if<std::is_integral<T>::value, int>::type \
23 inline friend bool operator op(const T a, const mpz_wrapper &b) \
29 typename std::enable_if< \
30 std::is_integral<T>::value && std::is_signed<T>::value, int>::type \
32 inline friend bool operator op(const mpz_wrapper &a, const T b) \
34 return SYMENGINE_SI(func)(a.get_mpz_t(), b) op val; \
36 inline friend bool operator op(const mpz_wrapper &a, const mpz_wrapper &b) \
38 return func(a.get_mpz_t(), b.get_mpz_t()) op val; \
41 #define SYMENGINE_MPZ_WRAPPER_IMPLEMENT_IN_PLACE(op, func) \
42 inline mpz_wrapper operator op(const mpz_wrapper &a) \
44 func(get_mpz_t(), get_mpz_t(), a.get_mpz_t()); \
47 template <typename T, \
48 typename std::enable_if<std::is_integral<T>::value \
49 && std::is_unsigned<T>::value, \
52 inline mpz_wrapper operator op(const T a) \
54 SYMENGINE_UI(func)(get_mpz_t(), get_mpz_t(), a); \
58 #define SYMENGINE_MPZ_WRAPPER_IMPLEMENT_NON_COMMUTATIVE(op, func, op_eq) \
59 template <typename T, \
60 typename std::enable_if<std::is_integral<T>::value \
61 && std::is_unsigned<T>::value, \
64 inline friend mpz_wrapper operator op(const mpz_wrapper &a, const T b) \
67 SYMENGINE_UI(func)(res.get_mpz_t(), a.get_mpz_t(), b); \
70 inline friend mpz_wrapper operator op(const mpz_wrapper &a, \
71 const mpz_wrapper &b) \
74 func(res.get_mpz_t(), a.get_mpz_t(), b.get_mpz_t()); \
77 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_IN_PLACE(op_eq, func)
79 #define SYMENGINE_MPZ_WRAPPER_IMPLEMENT_COMMUTATIVE(op, func, op_eq) \
80 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_NON_COMMUTATIVE(op, func, op_eq) \
81 template <typename T, \
82 typename std::enable_if<std::is_integral<T>::value, int>::type \
84 inline friend mpz_wrapper operator op(const T a, mpz_wrapper &b) \
89 #if SYMENGINE_INTEGER_CLASS == SYMENGINE_FLINT
91 #include <symengine/flint_wrapper.h>
93 #elif SYMENGINE_INTEGER_CLASS == SYMENGINE_GMP
109 mpz_wrapper(
const T i)
111 mpz_init_set_ui(mp, i);
118 mpz_wrapper(
const T i)
120 mpz_init_set_si(mp, i);
126 inline mpz_wrapper(
const mpz_t m)
130 inline mpz_wrapper(
const std::string &s,
unsigned base = 10)
132 mpz_init_set_str(mp, s.
c_str(), base);
134 inline mpz_wrapper(
const mpz_wrapper &other)
136 mpz_init_set(mp, other.get_mpz_t());
138 inline mpz_wrapper(mpz_wrapper &&other) SYMENGINE_NOEXCEPT
141 mpz_swap(mp, other.get_mpz_t());
143 inline mpz_wrapper &operator=(
const mpz_wrapper &other)
145 if (mp->_mp_d ==
nullptr) {
146 mpz_init_set(mp, other.get_mpz_t());
148 mpz_set(mp, other.get_mpz_t());
152 inline mpz_wrapper &operator=(mpz_wrapper &&other) SYMENGINE_NOEXCEPT
154 mpz_swap(mp, other.get_mpz_t());
162 inline mpz_wrapper &operator=(T other)
164 if (mp->_mp_d ==
nullptr) {
165 mpz_init_set_ui(mp, other);
167 mpz_set_ui(mp, other);
176 inline mpz_wrapper &operator=(T other)
178 if (mp->_mp_d ==
nullptr) {
179 mpz_init_set_si(mp, other);
181 mpz_set_si(mp, other);
185 inline ~mpz_wrapper() SYMENGINE_NOEXCEPT
187 if (mp->_mp_d !=
nullptr) {
191 inline mpz_ptr get_mpz_t()
195 inline mpz_srcptr get_mpz_t()
const
201 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_COMMUTATIVE(+, mpz_add, +=)
203 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_COMMUTATIVE(*, mpz_mul, *=)
205 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_NON_COMMUTATIVE(-, mpz_sub, -=)
209 typename
std::enable_if<
210 std::is_integral<T>::value &&
std::is_unsigned<T>::value,
int>::type
212 inline friend mpz_wrapper operator-(const T b, const mpz_wrapper &a)
215 mpz_ui_sub(res.get_mpz_t(), b, a.get_mpz_t());
219 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_NON_COMMUTATIVE(/, mpz_tdiv_q, /=)
221 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_NON_COMMUTATIVE(%, mpz_tdiv_r, %=)
223 inline mpz_wrapper operator-()
const
226 mpz_neg(res.get_mpz_t(), mp);
230 inline mpz_wrapper operator++()
232 mpz_add_ui(mp, mp, 1);
235 inline mpz_wrapper operator++(
int)
237 mpz_wrapper orig = *
this;
241 inline mpz_wrapper operator--()
243 mpz_sub_ui(mp, mp, 1);
246 inline mpz_wrapper operator--(
int)
248 mpz_wrapper orig = *
this;
254 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(<, mpz_cmp, 0, >)
256 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(<=, mpz_cmp, 0, >=)
258 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(>, mpz_cmp, 0, <)
260 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(>=, mpz_cmp, 0, <=)
262 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(==, mpz_cmp, 0, ==)
264 SYMENGINE_MPZ_WRAPPER_IMPLEMENT_RELATIONAL(!=, mpz_cmp, 0, !=)
266 inline mpz_wrapper operator<<=(
unsigned long u)
268 mpz_mul_2exp(mp, mp, u);
271 inline mpz_wrapper
operator<<(
unsigned long u)
const
274 mpz_mul_2exp(res.get_mpz_t(), mp, u);
277 inline mpz_wrapper operator>>=(
unsigned long u)
279 mpz_tdiv_q_2exp(mp, mp, u);
282 inline mpz_wrapper operator>>(
unsigned long u)
const
285 mpz_tdiv_q_2exp(res.get_mpz_t(), mp, u);
288 inline unsigned long get_ui()
const
290 return mpz_get_ui(mp);
292 inline signed long get_si()
const
294 return mpz_get_si(mp);
296 inline double long get_d()
const
298 return mpz_get_d(mp);
300 inline int fits_ulong_p()
const
302 return mpz_fits_ulong_p(mp);
304 inline int fits_slong_p()
const
306 return mpz_fits_slong_p(mp);
320 mpq_srcptr get_mpq_t()
const
328 mpq_wrapper(
const mpz_t m)
331 mpz_set(mpq_numref(mp), m);
333 mpq_wrapper(
const mpq_t m)
343 mpq_wrapper(
const T i)
346 mpz_set_ui(mpq_numref(mp), i);
353 mpq_wrapper(
const T i)
356 mpz_set_si(mpq_numref(mp), i);
358 mpq_wrapper(
const mpz_wrapper &n,
const mpz_wrapper &d = 1)
361 mpz_set(mpq_numref(mp), n.get_mpz_t());
362 mpz_set(mpq_denref(mp), d.get_mpz_t());
363 mpq_canonicalize(mp);
365 mpq_wrapper(
const mpq_wrapper &other)
368 mpq_set(mp, other.get_mpq_t());
370 mpq_wrapper(mpq_wrapper &&other) SYMENGINE_NOEXCEPT
373 mpq_swap(mp, other.get_mpq_t());
375 mpq_wrapper &operator=(
const mpq_wrapper &other)
377 mpq_set(mp, other.get_mpq_t());
380 mpq_wrapper &operator=(mpq_wrapper &&other) SYMENGINE_NOEXCEPT
382 mpq_swap(mp, other.get_mpq_t());
385 ~mpq_wrapper() SYMENGINE_NOEXCEPT
389 const mpz_wrapper &get_den()
const
391 return reinterpret_cast<const mpz_wrapper &
>(*mpq_denref(mp));
393 const mpz_wrapper &get_num()
const
395 return reinterpret_cast<const mpz_wrapper &
>(*mpq_numref(mp));
397 mpz_wrapper &get_den()
399 return reinterpret_cast<mpz_wrapper &
>(*mpq_denref(mp));
401 mpz_wrapper &get_num()
403 return reinterpret_cast<mpz_wrapper &
>(*mpq_numref(mp));
405 friend mpq_wrapper operator+(
const mpq_wrapper &a,
const mpq_wrapper &b)
408 mpq_add(res.get_mpq_t(), a.get_mpq_t(), b.get_mpq_t());
411 mpq_wrapper operator+=(
const mpq_wrapper &a)
413 mpq_add(mp, mp, a.get_mpq_t());
416 friend mpq_wrapper operator-(
const mpq_wrapper &a,
const mpq_wrapper &b)
419 mpq_sub(res.get_mpq_t(), a.get_mpq_t(), b.get_mpq_t());
422 mpq_wrapper operator-=(
const mpq_wrapper &a)
424 mpq_sub(mp, mp, a.get_mpq_t());
427 mpq_wrapper operator-()
const
430 mpq_neg(res.get_mpq_t(), mp);
433 friend mpq_wrapper operator*(
const mpq_wrapper &a,
const mpq_wrapper &b)
436 mpq_mul(res.get_mpq_t(), a.get_mpq_t(), b.get_mpq_t());
439 mpq_wrapper operator*=(
const mpq_wrapper &a)
441 mpq_mul(mp, mp, a.get_mpq_t());
444 friend mpq_wrapper operator/(
const mpq_wrapper &a,
const mpq_wrapper &b)
447 mpq_div(res.get_mpq_t(), a.get_mpq_t(), b.get_mpq_t());
450 mpq_wrapper operator/=(
const mpq_wrapper &a)
452 mpq_div(mp, mp, a.get_mpq_t());
455 bool operator==(
const mpq_wrapper &other)
const
457 return mpq_cmp(mp, other.get_mpq_t()) == 0;
459 bool operator!=(
const mpq_wrapper &other)
const
461 return not(*
this == other);
463 bool operator<(
const mpq_wrapper &other)
const
465 return mpq_cmp(mp, other.get_mpq_t()) < 0;
467 bool operator<=(
const mpq_wrapper &other)
const
469 return mpq_cmp(mp, other.get_mpq_t()) <= 0;
471 bool operator>(
const mpq_wrapper &other)
const
473 return mpq_cmp(mp, other.get_mpq_t()) > 0;
475 bool operator>=(
const mpq_wrapper &other)
const
477 return mpq_cmp(mp, other.get_mpq_t()) >= 0;
481 return mpq_get_d(mp);
485 mpq_canonicalize(mp);
496 #if SYMENGINE_INTEGER_CLASS == SYMENGINE_FLINT
499 #elif SYMENGINE_INTEGER_CLASS == SYMENGINE_GMP
Main namespace for SymEngine package.
std::ostream & operator<<(std::ostream &out, const SymEngine::Basic &p)
<< Operator