3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00
z3/lib/scoped_numeral.h
Leonardo de Moura e9eab22e5c Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:35:25 -07:00

164 lines
3.8 KiB
C++

/*++
Copyright (c) 2011 Microsoft Corporation
Module Name:
scoped_numeral.h
Abstract:
Wrapper for easying the pain when using primitive numeral objects such as:
mpz, mpq, mpbq, mpf, mpzp
Author:
Leonardo de Moura (leonardo) 2011-12-03
Revision History:
--*/
#ifndef _SCOPED_NUMERAL_H_
#define _SCOPED_NUMERAL_H_
template<typename Manager>
class _scoped_numeral {
public:
typedef typename Manager::numeral numeral;
private:
Manager & m_manager;
numeral m_num;
public:
_scoped_numeral(Manager & m):m_manager(m) {}
_scoped_numeral(_scoped_numeral const & n):m_manager(n.m_manager) { m().set(m_num, n.m_num); }
~_scoped_numeral() { m_manager.del(m_num); }
Manager & m() const { return m_manager; }
operator numeral const &() const { return m_num; }
operator numeral&() { return m_num; }
numeral const & get() const { return m_num; }
numeral & get() { return m_num; }
_scoped_numeral & operator=(_scoped_numeral & n) {
if (this == &n)
return *this;
m().set(m_num, n.m_num);
return *this;
}
_scoped_numeral & operator=(int n) {
m().set(m_num, n);
return *this;
}
_scoped_numeral & operator=(numeral const & n) {
m().set(m_num, n);
return *this;
}
void reset() {
m().reset(m_num);
}
void swap(_scoped_numeral & n) {
m_num.swap(n.m_num);
}
void swap(numeral & n) {
m_num.swap(n);
}
_scoped_numeral & operator+=(numeral const & a) {
m().add(m_num, a, m_num);
return *this;
}
_scoped_numeral & operator-=(numeral const & a) {
m().sub(m_num, a, m_num);
return *this;
}
_scoped_numeral & operator*=(numeral const & a) {
m().mul(m_num, a, m_num);
return *this;
}
_scoped_numeral & operator/=(numeral const & a) {
m().div(m_num, a, m_num);
return *this;
}
_scoped_numeral & operator%=(numeral const & a) {
m().rem(m_num, a, m_num);
return *this;
}
friend bool operator==(_scoped_numeral const & a, numeral const & b) {
return a.m().eq(a, b);
}
friend bool operator<(_scoped_numeral const & a, numeral const & b) {
return a.m().lt(a, b);
}
friend bool operator>(_scoped_numeral const & a, numeral const & b) {
return a.m().gt(a, b);
}
friend bool operator<=(_scoped_numeral const & a, numeral const & b) {
return a.m().le(a, b);
}
friend bool operator>=(_scoped_numeral const & a, numeral const & b) {
return a.m().ge(a, b);
}
friend bool is_zero(_scoped_numeral const & a) {
return a.m().is_zero(a);
}
friend bool is_pos(_scoped_numeral const & a) {
return a.m().is_pos(a);
}
friend bool is_neg(_scoped_numeral const & a) {
return a.m().is_neg(a);
}
friend bool is_nonneg(_scoped_numeral const & a) {
return a.m().is_nonneg(a);
}
friend bool is_nonpos(_scoped_numeral const & a) {
return a.m().is_nonpos(a);
}
void neg() {
m().neg(m_num);
}
friend _scoped_numeral operator+(_scoped_numeral const & r1, numeral const & r2) {
return _scoped_numeral(r1) += r2;
}
friend _scoped_numeral operator-(_scoped_numeral const & r1, numeral const & r2) {
return _scoped_numeral(r1) -= r2;
}
friend _scoped_numeral operator*(_scoped_numeral const & r1, numeral const & r2) {
return _scoped_numeral(r1) *= r2;
}
friend _scoped_numeral operator/(_scoped_numeral const & r1, numeral const & r2) {
return _scoped_numeral(r1) /= r2;
}
friend std::ostream & operator<<(std::ostream & out, _scoped_numeral const & s) {
s.m().display(out, s);
return out;
}
};
#endif