13 #ifndef XPACE_INTEGER_H 14 #define XPACE_INTEGER_H 99 operator const QByteArray
128 template<
size_t SIZE>
141 memcpy(
this, &rhs,
sizeof(
this));
149 memcpy(&ret.
vals, &this->vals,
sizeof(this->vals));
202 return !!(this->
vals[SIZE - 1] & 0xF000000000000000);
208 return n & 0x7FFFFFFFFFFFFFFF;
214 this->
vals[SIZE - 1] = strip_minus(this->
vals[SIZE - 1]) | (m ? 0xF000000000000000 : 0);
222 return std::numeric_limits<int>::max();
229 return std::numeric_limits<uint>::max();
236 return std::numeric_limits<int64>::max();
243 return std::numeric_limits<uint64>::max();
246 template <
size_t SIZE>
252 for (
size_t i(0); i < SIZE - 1; ++i)
254 ret[SIZE - 1] = std::numeric_limits<Xpace::int64>::max();
258 template <
size_t SIZE>
264 for (
size_t i(0); i < SIZE; ++i)
273 return std::numeric_limits<int>::min();
280 return std::numeric_limits<uint>::min();
287 return std::numeric_limits<int64>::min();
294 return std::numeric_limits<uint64>::min();
297 template <
size_t SIZE>
303 for (
size_t i(0); i < SIZE - 1; ++i)
305 ret[SIZE - 1] = std::numeric_limits<Xpace::int64>::min();
309 template <
size_t SIZE>
315 for (
size_t i(0); i < SIZE; ++i)
331 std::vector<uint64>* val);
336 std::vector<uint64>* val);
341 std::vector<uint64>* val);
346 std::vector<uint64>* val);
354 template<
size_t SIZE>
359 for (
size_t i(SIZE); --i > 0; )
364 template<
size_t SIZE>
379 template<
size_t SIZE>
388 template<
size_t SIZE>
390 bool BigUint<SIZE>::operator==
396 for (
size_t i(1); i < SIZE; ++i)
402 template<
size_t SIZE>
404 bool BigUint<SIZE>::operator!=
408 return !(*
this == rhs);
411 template<
size_t SIZE>
417 for (
size_t i(SIZE); --i; )
423 template<
size_t SIZE>
429 for (
size_t i(SIZE); --i; )
435 template<
size_t SIZE>
443 for (
size_t i(0); i < SIZE; ++i)
448 template<
size_t SIZE>
456 ret.
vals[0] = add_carry(
vals[0], n, &carry);
457 for (
size_t i(1); i < SIZE; ++i)
458 ret.
vals[i] = add_carry(
vals[i], 0, &carry);
462 template<
size_t SIZE>
470 for (
size_t i(0); i < SIZE; ++i)
471 ret.
vals[i] = sub_borrow(
vals[i], rhs.
vals[i], &borrow);
475 template<
size_t SIZE>
485 const uint32* vv(reinterpret_cast<const uint32*>(
vals));
486 for (
const uint32* v(vv); v < &vv[SIZE * 2]; ++v, ++r)
490 for (
uint s(0); s < SIZE; ++s)
491 ret.
vals[s] = add_carry(rr[s * 2], rr[s * 2 + 1] << 32, &carry);
496 template<
size_t SIZE>
514 for (
uint s(0); ; ++s)
525 const uint32* vals32(reinterpret_cast<const uint32*>(
vals));
526 uint32* quot(reinterpret_cast<uint32*>(ret.
vals));
528 uint s(SIZE * 2 - 1);
546 template<
size_t SIZE>
556 template<
size_t SIZE>
558 uint64 BigUint<SIZE>::operator[]
565 template<
size_t SIZE>
567 uint64& BigUint<SIZE>::operator[]
573 template<
size_t SIZE>
582 template<
size_t SIZE>
597 template<
size_t SIZE>
599 BigUint<SIZE>::operator
const QByteArray
603 return QByteArray(reinterpret_cast<const char*>(
vals),
sizeof(
vals));
607 template<
size_t SIZE>
614 *c = (*c && (a++ == ~
uint64(0)))
620 template<
size_t SIZE>
627 *borrow = (*borrow && (a-- == 0)) ?
true : a < b;
633 template<
size_t SIZE>
638 this->
vals[0] = strip_minus(n);
642 template<
size_t SIZE>
648 if (this->
vals.size() > rhs.
vals.size())
651 memset(&this->
vals[rhs.
vals.size()], 0, rhs.
vals.size() - this->
vals.size());
654 memcpy(this->
vals, rhs.
vals,
sizeof(this->vals));
657 template<
size_t SIZE>
663 return !memcmp(this->
vals, rhs.
vals,
sizeof(this->vals));
666 template<
size_t SIZE>
668 bool BigInt<SIZE>::operator==
672 if ((
uint64(rhs) != this->
vals[0]) || (is_minus() != (rhs < 0)))
674 for (
size_t i(1); i < SIZE; ++i)
680 template<
size_t SIZE>
682 bool BigInt<SIZE>::operator!=
686 return !(*
this == rhs);
689 template<
size_t SIZE>
691 bool BigInt<SIZE>::operator<
695 return (is_minus() == rhs.is_minus()) ?
lt(rhs) : is_minus();
698 template<
size_t SIZE>
700 bool BigInt<SIZE>::operator>
704 return (is_minus() == rhs.is_minus()) ?
gt(rhs) : rhs.is_minus();
707 template<
size_t SIZE>
715 ret.set_minus(is_minus());
719 template<
size_t SIZE>
726 return div(rhs, &rem);
729 template<
size_t SIZE>
738 ret.set_minus(is_minus());
BigUint< SIZE > div(uint32, uint32 *rem) const
const BytesRef get() const
A low-level const data holder.
void set(const BytesRef &)
unsigned long long uint64
bool stringToInt(const String8 &str, uint radix, std::vector< uint64 > *val)
BigInt div(uint32, uint32 *rem) const
bool stringToUint(const String8 &str, uint radix, std::vector< uint64 > *val)
bool lt(const BigUint &) const
bool gt(const BigUint &) const
size_t length
number of Ts
Xpace project main namespace