00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef DOUBLE_CONVERSION_BIGNUM_H_
00029 #define DOUBLE_CONVERSION_BIGNUM_H_
00030
00031 #include "utils.h"
00032
00033 namespace double_conversion {
00034
00035 class Bignum {
00036 public:
00037
00038
00039
00040 static const int kMaxSignificantBits = 3584;
00041
00042 Bignum();
00043 void AssignUInt16(uint16_t value);
00044 void AssignUInt64(uint64_t value);
00045 void AssignBignum(const Bignum& other);
00046
00047 void AssignDecimalString(Vector<const char> value);
00048 void AssignHexString(Vector<const char> value);
00049
00050 void AssignPowerUInt16(uint16_t base, int exponent);
00051
00052 void AddUInt16(uint16_t operand);
00053 void AddUInt64(uint64_t operand);
00054 void AddBignum(const Bignum& other);
00055
00056 void SubtractBignum(const Bignum& other);
00057
00058 void Square();
00059 void ShiftLeft(int shift_amount);
00060 void MultiplyByUInt32(uint32_t factor);
00061 void MultiplyByUInt64(uint64_t factor);
00062 void MultiplyByPowerOfTen(int exponent);
00063 void Times10() { return MultiplyByUInt32(10); }
00064
00065
00066
00067
00068 uint16_t DivideModuloIntBignum(const Bignum& other);
00069
00070 bool ToHexString(char* buffer, int buffer_size) const;
00071
00072
00073
00074
00075
00076 static int Compare(const Bignum& a, const Bignum& b);
00077 static bool Equal(const Bignum& a, const Bignum& b) {
00078 return Compare(a, b) == 0;
00079 }
00080 static bool LessEqual(const Bignum& a, const Bignum& b) {
00081 return Compare(a, b) <= 0;
00082 }
00083 static bool Less(const Bignum& a, const Bignum& b) {
00084 return Compare(a, b) < 0;
00085 }
00086
00087 static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c);
00088
00089 static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
00090 return PlusCompare(a, b, c) == 0;
00091 }
00092
00093 static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
00094 return PlusCompare(a, b, c) <= 0;
00095 }
00096
00097 static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) {
00098 return PlusCompare(a, b, c) < 0;
00099 }
00100 private:
00101 typedef uint32_t Chunk;
00102 typedef uint64_t DoubleChunk;
00103
00104 static const int kChunkSize = sizeof(Chunk) * 8;
00105 static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8;
00106
00107
00108 static const int kBigitSize = 28;
00109 static const Chunk kBigitMask = (1 << kBigitSize) - 1;
00110
00111
00112 static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
00113
00114 void EnsureCapacity(int size) {
00115 if (size > kBigitCapacity) {
00116 UNREACHABLE();
00117 }
00118 }
00119 void Align(const Bignum& other);
00120 void Clamp();
00121 bool IsClamped() const;
00122 void Zero();
00123
00124
00125
00126 void BigitsShiftLeft(int shift_amount);
00127
00128 int BigitLength() const { return used_digits_ + exponent_; }
00129 Chunk BigitAt(int index) const;
00130 void SubtractTimes(const Bignum& other, int factor);
00131
00132 Chunk bigits_buffer_[kBigitCapacity];
00133
00134
00135 Vector<Chunk> bigits_;
00136 int used_digits_;
00137
00138 int exponent_;
00139
00140 DISALLOW_COPY_AND_ASSIGN(Bignum);
00141 };
00142
00143 }
00144
00145 #endif // DOUBLE_CONVERSION_BIGNUM_H_