#ifndef GMP_API_USER_H #define GMP_API_USER_H #include #include class IGmpZVal; class IGmpZVal_RO; class IGmpZVal_WO; typedef shared_ptr GmpZVal; typedef shared_ptr GmpZVal_RO; typedef shared_ptr GmpZVal_WO; class IGmpZVal_RO : public virtual IVal_Base { public: virtual unsigned getVal(mpz_t *p, unsigned nelms = 1, IndexRange *range = 0) = 0; virtual unsigned getVal(AsyncIO aio, mpz_t *p, unsigned nelms = 1, IndexRange *range = 0) = 0; virtual ~IGmpZVal_RO(){} static GmpZVal_RO create(Path path); }; class IGmpZVal_WO : public virtual IVal_Base { public: virtual unsigned setVal(mpz_t *p, unsigned nelms = 1, IndexRange *range = 0) = 0; virtual ~IGmpZVal_WO(){} static GmpZVal_WO create(Path path); }; class IGmpZVal : public virtual IGmpZVal_RO, public virtual IGmpZVal_WO { public: virtual ~IGmpZVal() {} static GmpZVal create(Path path); }; // small helper class... class MPZ { public: mpz_t m_; MPZ() { mpz_init( m_ ); } ~MPZ() { mpz_clear( m_ ); } MPZ(const MPZ &orig) { mpz_init( m_ ); mpz_set( m_, orig.m_ ); } MPZ & operator= (const MPZ &orig) { mpz_set( m_, orig.m_ ); return *this; } void swap(MPZ &orig) { mpz_swap( m_, orig.m_ ); } }; class MPZArray { private: mpz_t *m_; unsigned n_; MPZArray(const MPZArray&); MPZArray &operator=(const MPZArray&); public: mpz_t *getBufp() { return m_; } unsigned getNelms() { return n_; } MPZArray(unsigned nelms) : m_( new mpz_t[nelms] ), n_( nelms ) { unsigned i; for ( i = 0; i