knowL: Knowledge Libraries
Loading...
Searching...
No Matches
BigNumber.h
1#ifndef _KNOW_CORE_BIGNUMBER_H_
2#define _KNOW_CORE_BIGNUMBER_H_
3
4#include <QList>
5#include "ReturnValue.h"
6
7#include <Cyqlops/Crypto/Hash.h>
8
9class QVariant;
10
11namespace std
12{
13 template<>
14 struct is_floating_point<knowCore::BigNumber> : public true_type
15 {
16 };
17 template<>
18 struct is_signed<knowCore::BigNumber> : public true_type
19 {
20 };
21 template<>
22 struct is_unsigned<knowCore::BigNumber> : public false_type
23 {
24 };
25 template<>
26 struct is_integral<knowCore::BigNumber> : public false_type
27 {
28 };
29}
30
31namespace knowCore
32{
46 {
47 public:
48 enum class Sign
49 {
50 Positive,
51 Negative,
52 NaN,
53 PositiveInfinite,
54 NegativeInfinite
55 };
56 public:
57 BigNumber();
58 BigNumber(qint16 weight, Sign sign, qint16 dscale, const QList<quint16>& digits);
59 ~BigNumber();
60
61 BigNumber(std::intmax_t _value);
62 BigNumber(std::uintmax_t _value);
63 template<typename _T_, std::enable_if_t<std::is_integral_v<_T_> and std::is_unsigned_v<_T_>, int> = 0>
64 BigNumber(_T_ _value) : BigNumber(std::uintmax_t(_value)) {}
65 template<typename _T_, std::enable_if_t<std::is_integral_v<_T_> and std::is_signed_v<_T_>, int> = 0>
66 BigNumber(_T_ _value) : BigNumber(std::intmax_t(_value)) {}
67 BigNumber(double _value);
68 static ReturnValue<BigNumber> fromString(const QString& _value);
69 static ReturnValue<BigNumber> fromString(const char* _value) { return fromString(QString(_value)); }
70 static ReturnValue<BigNumber> fromVariant(const QVariant& _value);
71 static ReturnValue<BigNumber> fromValue(const knowCore::Value& _value);
72 static BigNumber zero();
73 static BigNumber nan();
74 static BigNumber positiveInfinite();
75 static BigNumber negativeInfinite();
76 bool isNaN() const;
77 bool isFinite() const;
78 bool isInfinite() const;
82 bool isFloating() const;
83 QString toString() const;
89 QVariant toVariant() const;
96 double toDouble() const;
102 ReturnValue<qint64> toInt64(bool _truncate = false) const;
103 ReturnValue<quint64> toUInt64(bool _truncate = false) const;
104 bool operator==(const BigNumber& _rhs) const;
105 bool operator!=(const BigNumber& _rhs) const { return not (*this == _rhs); }
106 QByteArray md5() const;
110 void hash(QCryptographicHash* _hash) const;
111
112 BigNumber operator+(const BigNumber& _rhs) const;
113 BigNumber operator-(const BigNumber& _rhs) const;
114 BigNumber operator*(const BigNumber& _rhs) const;
115 BigNumber operator/(const BigNumber& _rhs) const;
116 BigNumber operator-() const;
117 bool operator<(const BigNumber& _rhs) const;
118 bool operator<=(const BigNumber& _rhs) const;
119 bool operator>(const BigNumber& _rhs) const;
120 bool operator>=(const BigNumber& _rhs) const;
121
122 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
123 BigNumber operator+(const _T_& _rhs) const { return operator+(BigNumber(_rhs)); }
124 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
125 BigNumber operator-(const _T_& _rhs) const { return operator-(BigNumber(_rhs)); }
126 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
127 BigNumber operator*(const _T_& _rhs) const { return operator*(BigNumber(_rhs)); }
128 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
129 BigNumber operator/(const _T_& _rhs) const { return operator/(BigNumber(_rhs)); }
130 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
131 bool operator<(const _T_& _rhs) const { return operator<(BigNumber(_rhs)); }
132 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
133 bool operator<=(const _T_& _rhs) const { return operator<=(BigNumber(_rhs)); }
134 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
135 bool operator>(const _T_& _rhs) const { return operator>(BigNumber(_rhs)); }
136 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
137 bool operator>=(const _T_& _rhs) const { return operator>=(BigNumber(_rhs)); }
138
139 public:
140 quint16 weight() const { return m_weight; }
141 Sign sign() const { return m_sign; }
142 quint16 dscale() const { return m_dscale; }
143 QList<quint16> digits() const { return m_digits; }
144 private:
145 void simplify();
146 void roundVar();
147 void exponenfy(int exp);
148 BigNumber add_abs(const BigNumber& _rhs) const;
149 BigNumber sub_abs(const BigNumber& _rhs) const;
150 enum class ComparisonResult { Bigger /* this < _rhs */, Smaller /* this > _rhs */, Equal };
151 ComparisonResult compare_abs(const BigNumber& _rhs) const;
152 ComparisonResult compare(const BigNumber& _rhs) const;
156 std::tuple<bool, quint64> toUInt64_ignore_sign() const;
157 template<typename _T_>
158 _T_ toVariantValue() const;
159 private:
160 qint16 m_weight, m_dscale;
161 Sign m_sign;
162 QList<quint16> m_digits;
163 };
164 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
165 static inline BigNumber operator+(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) + _rhs; }
166 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
167 static inline BigNumber operator-(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) - _rhs; }
168 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
169 static inline BigNumber operator*(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) * _rhs; }
170 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
171 static inline BigNumber operator/(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) / _rhs; }
172 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
173 static inline bool operator<(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) < _rhs; }
174 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
175 static inline bool operator<=(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) <= _rhs; }
176 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
177 static inline bool operator>(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) > _rhs; }
178 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
179 static inline bool operator>=(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) >= _rhs; }
180 template<typename _T_, std::enable_if_t<std::is_arithmetic_v<_T_>, bool> = true>
181 static inline bool operator==(const _T_& _lhs, const BigNumber& _rhs) { return BigNumber(_lhs) == _rhs; }
182}
183
184#include "MetaType.h"
185KNOWCORE_DECLARE_FULL_METATYPE(knowCore, BigNumber)
186
187#include "Formatter.h"
188
189KNOWCORE_CORE_DECLARE_FORMATTER(knowCore::BigNumber)
190{
191 return forward(p.toString(), ctx);
192}
193
194namespace Cyqlops::Crypto::Hash
195{
196 template<>
197 struct Compute<knowCore::BigNumber>
198 {
199 Compute(QCryptographicHash& _algorithm, const knowCore::BigNumber& _v)
200 {
201 _v.hash(&_algorithm);
202 }
203 };
204}
205
206#endif
Definition Forward.h:12
Class that can contains large numeric value.
Definition BigNumber.h:46
bool isFloating() const
Definition BigNumber.cpp:224
void hash(QCryptographicHash *_hash) const
Definition BigNumber.cpp:517
ReturnValue< qint64 > toInt64(bool _truncate=false) const
Definition BigNumber.cpp:267
knowCore::Value toValue() const
return an optimal value representation This function try to return a variant with an optimal represen...
Definition BigNumber.cpp:498
QVariant toVariant() const
return an optimal variant representation This function try to return a variant with an optimal repres...
Definition BigNumber.cpp:493
Definition ReturnValue.h:29
Definition Value.h:13