Index: runtime/vm/bigint_operations.h |
=================================================================== |
--- runtime/vm/bigint_operations.h (revision 40060) |
+++ runtime/vm/bigint_operations.h (working copy) |
@@ -1,159 +0,0 @@ |
-// Copyright 2012 Google Inc. All Rights Reserved. |
- |
-#ifndef VM_BIGINT_OPERATIONS_H_ |
-#define VM_BIGINT_OPERATIONS_H_ |
- |
-#include "platform/utils.h" |
- |
-#include "vm/object.h" |
- |
-namespace dart { |
- |
-class BigintOperations : public AllStatic { |
- public: |
- static RawBigint* NewFromSmi(const Smi& smi, Heap::Space space = Heap::kNew); |
- static RawBigint* NewFromInt64(int64_t value, Heap::Space space = Heap::kNew); |
- static RawBigint* NewFromUint64(uint64_t value, |
- Heap::Space space = Heap::kNew); |
- // The given string must be a valid integer representation. It may be |
- // prefixed by a minus and/or "0x". |
- // Returns Bigint::null() if the string cannot be parsed. |
- static RawBigint* NewFromCString(const char* str, |
- Heap::Space space = Heap::kNew); |
- static RawBigint* NewFromDouble(double d, Heap::Space space = Heap::kNew); |
- |
- // Compute chunk length of the bigint instance created for the |
- // specified hex string. The specified hex string must be a |
- // nul-terminated string of hex-digits. It must only contain |
- // hex-digits. Leading "0x" is not allowed. |
- static intptr_t ComputeChunkLength(const char* hex_string); |
- |
- // Create a bigint instance from the specified hex string. The given string |
- // must be a nul-terminated string of hex-digits. It must only contain |
- // hex-digits. Leading "0x" is not allowed. |
- static RawBigint* FromHexCString(const char* hex_string, |
- Heap::Space space = Heap::kNew); |
- |
- // Helper method to initialize a bigint instance object with the bigint value |
- // in the specified string. The given string must be a nul-terminated string |
- // of hex-digits. It must only contain hex-digits, leading "0x" is not |
- // allowed. |
- static void FromHexCString(const char* hex_string, const Bigint& value); |
- |
- // The given string must be a nul-terminated string of decimal digits. It |
- // must only contain decimal digits (0-9). No sign is allowed. Leading |
- // zeroes are ignored. |
- static RawBigint* FromDecimalCString(const char* str, |
- Heap::Space space = Heap::kNew); |
- |
- // Converts the bigint to a HEX string. The returned string is prepended by |
- // a "0x" (after the optional minus-sign). |
- static const char* ToHexCString(intptr_t length, |
- bool is_negative, |
- void* data, |
- uword (*allocator)(intptr_t size)); |
- |
- static const char* ToHexCString(const Bigint& bigint, |
- uword (*allocator)(intptr_t size)); |
- |
- static const char* ToDecimalCString(const Bigint& bigint, |
- uword (*allocator)(intptr_t size)); |
- |
- static bool FitsIntoSmi(const Bigint& bigint); |
- static RawSmi* ToSmi(const Bigint& bigint); |
- |
- static bool FitsIntoInt64(const Bigint& bigint); |
- static int64_t ToInt64(const Bigint& bigint); |
- |
- static bool FitsIntoUint64(const Bigint& bigint); |
- static bool AbsFitsIntoUint64(const Bigint& bigint); |
- static uint64_t ToUint64(const Bigint& bigint); |
- static uint32_t TruncateToUint32(const Bigint& bigint); |
- static uint64_t AbsToUint64(const Bigint& bigint); |
- |
- static RawDouble* ToDouble(const Bigint& bigint); |
- |
- static RawBigint* Add(const Bigint& a, const Bigint& b) { |
- bool negate_b = false; |
- return AddSubtract(a, b, negate_b); |
- } |
- static RawBigint* Subtract(const Bigint& a, const Bigint& b) { |
- bool negate_b = true; |
- return AddSubtract(a, b, negate_b); |
- } |
- static RawBigint* Multiply(const Bigint& a, const Bigint& b); |
- // TODO(floitsch): what to do for divisions by zero. |
- static RawBigint* Divide(const Bigint& a, const Bigint& b); |
- static RawBigint* Modulo(const Bigint& a, const Bigint& b); |
- static RawBigint* Remainder(const Bigint& a, const Bigint& b); |
- |
- static RawBigint* ShiftLeft(const Bigint& bigint, intptr_t amount); |
- static RawBigint* ShiftRight(const Bigint& bigint, intptr_t amount); |
- static RawBigint* BitAnd(const Bigint& a, const Bigint& b); |
- static RawBigint* BitOr(const Bigint& a, const Bigint& b); |
- static RawBigint* BitXor(const Bigint& a, const Bigint& b); |
- static RawBigint* BitNot(const Bigint& bigint); |
- static int64_t BitLength(const Bigint& bigint); |
- |
- static int Compare(const Bigint& a, const Bigint& b); |
- |
- static bool IsClamped(const Bigint& bigint) { |
- intptr_t length = bigint.Length(); |
- return (length == 0) || (bigint.GetChunkAt(length - 1) != 0); |
- } |
- |
- private: |
- typedef Bigint::Chunk Chunk; |
- typedef Bigint::DoubleChunk DoubleChunk; |
- |
- static const int kDigitBitSize = 28; |
- static const Chunk kDigitMask = (static_cast<Chunk>(1) << kDigitBitSize) - 1; |
- static const Chunk kDigitMaxValue = kDigitMask; |
- static const int kChunkSize = sizeof(Chunk); |
- static const int kChunkBitSize = kChunkSize * kBitsPerByte; |
- static const int kHexCharsPerDigit = kDigitBitSize / 4; |
- |
- static RawBigint* Zero() { return Bigint::Allocate(0); } |
- static RawBigint* One() { |
- Bigint& result = Bigint::Handle(Bigint::Allocate(1)); |
- result.SetChunkAt(0, 1); |
- return result.raw(); |
- } |
- static RawBigint* MinusOne() { |
- Bigint& result = Bigint::Handle(One()); |
- result.ToggleSign(); |
- return result.raw(); |
- } |
- |
- // Performs an addition or subtraction depending on the negate_b argument. |
- static RawBigint* AddSubtract(const Bigint& a, |
- const Bigint& b, |
- bool negate_b); |
- |
- static int UnsignedCompare(const Bigint& a, const Bigint& b); |
- static int UnsignedCompareNonClamped(const Bigint& a, const Bigint& b); |
- static RawBigint* UnsignedAdd(const Bigint& a, const Bigint& b); |
- static RawBigint* UnsignedSubtract(const Bigint& a, const Bigint& b); |
- |
- static RawBigint* MultiplyWithDigit(const Bigint& bigint, Chunk digit); |
- static RawBigint* DigitsShiftLeft(const Bigint& bigint, intptr_t amount) { |
- return ShiftLeft(bigint, amount * kDigitBitSize); |
- } |
- static void DivideRemainder(const Bigint& a, const Bigint& b, |
- Bigint* quotient, Bigint* remainder); |
- static Chunk InplaceUnsignedDivideRemainderDigit( |
- const Bigint& dividend_quotient, Chunk divisor_digit); |
- |
- // Removes leading zero-chunks by adjusting the bigint's length. |
- static void Clamp(const Bigint& bigint); |
- |
- static RawBigint* Copy(const Bigint& bigint); |
- |
- static intptr_t CountBits(Chunk digit); |
- |
- DISALLOW_IMPLICIT_CONSTRUCTORS(BigintOperations); |
-}; |
- |
-} // namespace dart |
- |
-#endif // VM_BIGINT_OPERATIONS_H_ |