File indexing completed on 2024-04-14 05:42:52

0001 /*
0002     SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "knumber_base.h"
0010 
0011 class KNumber;
0012 
0013 namespace detail
0014 {
0015 class knumber_integer : public knumber_base
0016 {
0017     friend class ::KNumber;
0018     friend class knumber_error;
0019     friend class knumber_fraction;
0020     friend class knumber_float;
0021 
0022 public:
0023     explicit knumber_integer(const QString &s);
0024     explicit knumber_integer(qint32 value);
0025     explicit knumber_integer(qint64 value);
0026     explicit knumber_integer(quint32 value);
0027     explicit knumber_integer(quint64 value);
0028     explicit knumber_integer(mpz_t mpz);
0029     ~knumber_integer() override;
0030 
0031 public:
0032     knumber_base *clone() override;
0033 
0034 public:
0035     QString toString(int precision) const override;
0036     quint64 toUint64() const override;
0037     qint64 toInt64() const override;
0038 
0039 public:
0040     virtual bool is_even() const;
0041     virtual bool is_odd() const;
0042     bool is_integer() const override;
0043     bool is_zero() const override;
0044     int sign() const override;
0045 
0046 public:
0047     knumber_base *add(knumber_base *rhs) override;
0048     knumber_base *sub(knumber_base *rhs) override;
0049     knumber_base *mul(knumber_base *rhs) override;
0050     knumber_base *div(knumber_base *rhs) override;
0051     knumber_base *mod(knumber_base *rhs) override;
0052 
0053 public:
0054     knumber_base *bitwise_and(knumber_base *rhs) override;
0055     knumber_base *bitwise_xor(knumber_base *rhs) override;
0056     knumber_base *bitwise_or(knumber_base *rhs) override;
0057     knumber_base *bitwise_shift(knumber_base *rhs) override;
0058 
0059 public:
0060     knumber_base *pow(knumber_base *rhs) override;
0061     knumber_base *neg() override;
0062     knumber_base *cmp() override;
0063     knumber_base *abs() override;
0064     knumber_base *sqrt() override;
0065     knumber_base *cbrt() override;
0066     knumber_base *factorial() override;
0067     knumber_base *reciprocal() override;
0068 
0069 public:
0070     knumber_base *log2() override;
0071     knumber_base *log10() override;
0072     knumber_base *ln() override;
0073     knumber_base *exp2() override;
0074     knumber_base *floor() override;
0075     knumber_base *ceil() override;
0076     knumber_base *exp10() override;
0077     knumber_base *exp() override;
0078     knumber_base *bin(knumber_base *rhs) override;
0079 
0080 public:
0081     knumber_base *sin() override;
0082     knumber_base *cos() override;
0083     knumber_base *tan() override;
0084     knumber_base *asin() override;
0085     knumber_base *acos() override;
0086     knumber_base *atan() override;
0087     knumber_base *sinh() override;
0088     knumber_base *cosh() override;
0089     knumber_base *tanh() override;
0090     knumber_base *asinh() override;
0091     knumber_base *acosh() override;
0092     knumber_base *atanh() override;
0093     knumber_base *tgamma() override;
0094 
0095 public:
0096     int compare(knumber_base *rhs) override;
0097 
0098 private:
0099     // conversion constructors
0100     explicit knumber_integer(const knumber_integer *value);
0101     explicit knumber_integer(const knumber_fraction *value);
0102     explicit knumber_integer(const knumber_float *value);
0103     explicit knumber_integer(const knumber_error *value);
0104 
0105 private:
0106     mpz_t mpz_;
0107 };
0108 
0109 }
0110