File indexing completed on 2025-08-28 08:27:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef DOUBLE_CONVERSION_BIGNUM_H_
0029 #define DOUBLE_CONVERSION_BIGNUM_H_
0030
0031 #include "utils.h"
0032
0033 namespace arrow_vendored {
0034 namespace double_conversion {
0035
0036 class Bignum {
0037 public:
0038
0039
0040
0041 static const int kMaxSignificantBits = 3584;
0042
0043 Bignum() : used_bigits_(0), exponent_(0) {}
0044
0045 void AssignUInt16(const uint16_t value);
0046 void AssignUInt64(uint64_t value);
0047 void AssignBignum(const Bignum& other);
0048
0049 void AssignDecimalString(const Vector<const char> value);
0050 void AssignHexString(const Vector<const char> value);
0051
0052 void AssignPowerUInt16(uint16_t base, const int exponent);
0053
0054 void AddUInt64(const uint64_t operand);
0055 void AddBignum(const Bignum& other);
0056
0057 void SubtractBignum(const Bignum& other);
0058
0059 void Square();
0060 void ShiftLeft(const int shift_amount);
0061 void MultiplyByUInt32(const uint32_t factor);
0062 void MultiplyByUInt64(const uint64_t factor);
0063 void MultiplyByPowerOfTen(const int exponent);
0064 void Times10() { return MultiplyByUInt32(10); }
0065
0066
0067
0068
0069 uint16_t DivideModuloIntBignum(const Bignum& other);
0070
0071 bool ToHexString(char* buffer, const int buffer_size) const;
0072
0073
0074
0075
0076
0077 static int Compare(const Bignum& a, const Bignum& b);
0078 static bool Equal(const Bignum& a, const Bignum& b) {
0079 return Compare(a, b) == 0;
0080 }
0081 static bool LessEqual(const Bignum& a, const Bignum& b) {
0082 return Compare(a, b) <= 0;
0083 }
0084 static bool Less(const Bignum& a, const Bignum& b) {
0085 return Compare(a, b) < 0;
0086 }
0087
0088 static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c);
0089
0090 static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
0091 return PlusCompare(a, b, c) == 0;
0092 }
0093
0094 static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
0095 return PlusCompare(a, b, c) <= 0;
0096 }
0097
0098 static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) {
0099 return PlusCompare(a, b, c) < 0;
0100 }
0101 private:
0102 typedef uint32_t Chunk;
0103 typedef uint64_t DoubleChunk;
0104
0105 static const int kChunkSize = sizeof(Chunk) * 8;
0106 static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8;
0107
0108
0109 static const int kBigitSize = 28;
0110 static const Chunk kBigitMask = (1 << kBigitSize) - 1;
0111
0112
0113 static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
0114
0115 static void EnsureCapacity(const int size) {
0116 if (size > kBigitCapacity) {
0117 DOUBLE_CONVERSION_UNREACHABLE();
0118 }
0119 }
0120 void Align(const Bignum& other);
0121 void Clamp();
0122 bool IsClamped() const {
0123 return used_bigits_ == 0 || RawBigit(used_bigits_ - 1) != 0;
0124 }
0125 void Zero() {
0126 used_bigits_ = 0;
0127 exponent_ = 0;
0128 }
0129
0130
0131
0132 void BigitsShiftLeft(const int shift_amount);
0133
0134 int BigitLength() const { return used_bigits_ + exponent_; }
0135 Chunk& RawBigit(const int index);
0136 const Chunk& RawBigit(const int index) const;
0137 Chunk BigitOrZero(const int index) const;
0138 void SubtractTimes(const Bignum& other, const int factor);
0139
0140
0141
0142
0143
0144 int16_t used_bigits_;
0145 int16_t exponent_;
0146 Chunk bigits_buffer_[kBigitCapacity];
0147
0148 DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(Bignum);
0149 };
0150
0151 }
0152 }
0153
0154 #endif