]> www.ginac.de Git - ginac.git/blobdiff - ginac/numeric.h
[PATCH 2/3] Make a stronger normalisation for expressions with exponents.
[ginac.git] / ginac / numeric.h
index bf5c70134cedcfafcad15a06d3c8f003a1777bca..975da7a03158ca232d222dd8f57ff7811aadce3e 100644 (file)
@@ -3,7 +3,7 @@
  *  Makes the interface to the underlying bignum package available. */
 
 /*
- *  GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2020 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#ifndef __GINAC_NUMERIC_H__
-#define __GINAC_NUMERIC_H__
+#ifndef GINAC_NUMERIC_H
+#define GINAC_NUMERIC_H
 
 #include "basic.h"
 #include "ex.h"
+#include "archive.h"
 
+#include <cln/complex.h>
 #include <stdexcept>
 #include <vector>
 
-#include <cln/complex.h>
-
-#if defined(G__CINTVERSION) && !defined(__MAKECINT__)
-// Cint @$#$! doesn't like forward declaring classes used for casting operators
-// so we have to include the definition of cln::cl_N here, but it is enough to
-// do so for the compiler, hence the !defined(__MAKECINT__).
-  #include <cln/complex_class.h>
-#endif
-
 namespace GiNaC {
 
 /** Function pointer to implement callbacks in the case 'Digits' gets changed.
@@ -51,7 +44,7 @@ typedef void (* digits_changed_callback)(long);
  *  than a dumber basic type since as a side-effect we let it change
  *  cl_default_float_format when it gets changed.  The only other
  *  meaningful thing to do with it is converting it to an unsigned,
- *  for temprary storing its value e.g.  The user must not create an
+ *  for temporarily storing its value e.g.  The user must not create an
  *  own working object of this class!  Since C++ forces us to make the
  *  class definition visible in order to use an object we put in a
  *  flag which prevents other objects of that class to be created. */
@@ -97,37 +90,43 @@ public:
        numeric(unsigned int i);
        numeric(long i);
        numeric(unsigned long i);
+       numeric(long long i);
+       numeric(unsigned long long i);
        numeric(long numer, long denom);
        numeric(double d);
        numeric(const char *);
        
        // functions overriding virtual functions from base classes
 public:
-       unsigned precedence() const {return 30;}
-       bool info(unsigned inf) const;
-       bool is_polynomial(const ex & var) const;
-       int degree(const ex & s) const;
-       int ldegree(const ex & s) const;
-       ex coeff(const ex & s, int n = 1) const;
-       bool has(const ex &other, unsigned options = 0) const;
-       ex eval(int level = 0) const;
-       ex evalf(int level = 0) const;
-       ex subs(const exmap & m, unsigned options = 0) const { return subs_one_level(m, options); } // overwrites basic::subs() for performance reasons
-       ex normal(exmap & repl, exmap & rev_lookup, int level = 0) const;
-       ex to_rational(exmap & repl) const;
-       ex to_polynomial(exmap & repl) const;
-       numeric integer_content() const;
-       ex smod(const numeric &xi) const;
-       numeric max_coefficient() const;
-       ex conjugate() const;
-       ex real_part() const;
-       ex imag_part() const;
+       unsigned precedence() const override {return 30;}
+       bool info(unsigned inf) const override;
+       bool is_polynomial(const ex & var) const override;
+       int degree(const ex & s) const override;
+       int ldegree(const ex & s) const override;
+       ex coeff(const ex & s, int n = 1) const override;
+       bool has(const ex &other, unsigned options = 0) const override;
+       ex eval() const override;
+       ex evalf() const override;
+       ex subs(const exmap & m, unsigned options = 0) const override { return subs_one_level(m, options); } // overwrites basic::subs() for performance reasons
+       ex normal(exmap & repl, exmap & rev_lookup, lst & modifier) const override;
+       ex to_rational(exmap & repl) const override;
+       ex to_polynomial(exmap & repl) const override;
+       numeric integer_content() const override;
+       ex smod(const numeric &xi) const override;
+       numeric max_coefficient() const override;
+       ex conjugate() const override;
+       ex real_part() const override;
+       ex imag_part() const override;
+       /** Save (a.k.a. serialize) object into archive. */
+       void archive(archive_node& n) const override;
+       /** Read (a.k.a. deserialize) object from archive. */
+       void read_archive(const archive_node& n, lst& syms) override;
 protected:
        /** Implementation of ex::diff for a numeric always returns 0.
         *  @see ex::diff */
-       ex derivative(const symbol &s) const { return 0; }
-       bool is_equal_same_type(const basic &other) const;
-       unsigned calchash() const;
+       ex derivative(const symbol &s) const override { return 0; }
+       bool is_equal_same_type(const basic &other) const override;
+       unsigned calchash() const override;
        
        // new virtual functions which can be overridden by derived classes
        // (none)
@@ -200,6 +199,7 @@ protected:
 protected:
        cln::cl_N value;
 };
+GINAC_DECLARE_UNARCHIVER(numeric); 
 
 
 // global constants
@@ -329,9 +329,4 @@ ex CatalanEvalf();
 
 } // namespace GiNaC
 
-#ifdef __MAKECINT__
-#pragma link off defined_in cln/number.h;
-#pragma link off defined_in cln/complex_class.h;
-#endif
-
-#endif // ndef __GINAC_NUMERIC_H__
+#endif // ndef GINAC_NUMERIC_H