File indexing completed on 2024-05-12 04:45:54

0001 /*
0002 Copyright (C) 2001 - 2013 Evan Teran
0003                           evan.teran@gmail.com
0004 
0005 This program is free software: you can redistribute it and/or modify
0006 it under the terms of the GNU General Public License as published by
0007 the Free Software Foundation, either version 2 of the License, or
0008 (at your option) any later version.
0009 
0010 This program is distributed in the hope that it will be useful,
0011 but WITHOUT ANY WARRANTY; without even the implied warranty of
0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013 GNU General Public License for more details.
0014 
0015 You should have received a copy of the GNU General Public License
0016 along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017 */
0018 
0019 #ifndef KNUMBER_INTEGER_H_
0020 #define KNUMBER_INTEGER_H_
0021 
0022 #include "knumber_base.h"
0023 class BinaryNumber;
0024 class KNumber;
0025 
0026 namespace detail {
0027 
0028 class knumber_integer : public knumber_base {
0029     friend class ::KNumber;
0030     friend class knumber_error;
0031     friend class knumber_fraction;
0032     friend class knumber_float;
0033 
0034 public:
0035     static knumber_integer *binaryFromString(const QString &s);
0036     explicit knumber_integer(const QString &s);
0037     explicit knumber_integer(qint32 value);
0038     explicit knumber_integer(qint64 value);
0039     explicit knumber_integer(quint32 value);
0040     explicit knumber_integer(quint64 value);
0041     explicit knumber_integer(mpz_t mpz);
0042     ~knumber_integer() override;
0043 
0044 public:
0045     knumber_base *clone() override;
0046 
0047 public:
0048     QString toString(int precision) const override;
0049     QString toBinaryString(int precision) const override;
0050     QString toHexString(int precision) const override;
0051     quint64 toUint64() const override;
0052     qint64 toInt64() const override;
0053 
0054 public:
0055     virtual bool is_even() const;
0056     virtual bool is_odd() const;
0057     bool is_integer() const override;
0058     bool is_zero() const override;
0059     int sign() const override;
0060 
0061 public:
0062     knumber_base *add(knumber_base *rhs) override;
0063     knumber_base *sub(knumber_base *rhs) override;
0064     knumber_base *mul(knumber_base *rhs) override;
0065     knumber_base *div(knumber_base *rhs) override;
0066     knumber_base *mod(knumber_base *rhs) override;
0067 
0068 public:
0069     knumber_base *bitwise_and(knumber_base *rhs) override;
0070     knumber_base *bitwise_xor(knumber_base *rhs) override;
0071     knumber_base *bitwise_or(knumber_base *rhs) override;
0072     knumber_base *bitwise_shift(knumber_base *rhs) override;
0073 
0074 public:
0075     knumber_base *pow(knumber_base *rhs) override;
0076     knumber_base *neg() override;
0077     knumber_base *cmp() override;
0078     knumber_base *abs() override;
0079     knumber_base *sqrt() override;
0080     knumber_base *cbrt() override;
0081     knumber_base *factorial() override;
0082     knumber_base *reciprocal() override;
0083 
0084 public:
0085     knumber_base *log2() override;
0086     knumber_base *log10() override;
0087     knumber_base *ln() override;
0088     knumber_base *exp2() override;
0089     knumber_base *floor() override;
0090     knumber_base *ceil() override;
0091     knumber_base *exp10() override;
0092     knumber_base *exp() override;
0093     knumber_base *bin(knumber_base *rhs) override;
0094 
0095 public:
0096     knumber_base *sin() override;
0097     knumber_base *cos() override;
0098     knumber_base *tan() override;
0099     knumber_base *asin() override;
0100     knumber_base *acos() override;
0101     knumber_base *atan() override;
0102     knumber_base *sinh() override;
0103     knumber_base *cosh() override;
0104     knumber_base *tanh() override;
0105     knumber_base *asinh() override;
0106     knumber_base *acosh() override;
0107     knumber_base *atanh() override;
0108     knumber_base *tgamma() override;
0109 
0110 public:
0111     int compare(knumber_base *rhs) override;
0112 protected:
0113     mpz_t &mpz();
0114 private:
0115     // conversion constructors
0116     explicit knumber_integer(const knumber_integer *value);
0117     explicit knumber_integer(const knumber_fraction *value);
0118     explicit knumber_integer(const knumber_float *value);
0119     explicit knumber_integer(const knumber_error *value);
0120 
0121 private:
0122     mpz_t mpz_;
0123 };
0124 
0125 }
0126 
0127 #endif