diff options
author | Noel Grandin <noel@peralex.com> | 2020-12-23 10:57:00 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-12-24 12:00:35 +0100 |
commit | 5dae4238ea6e21df42f4437a43d152954fc494fd (patch) | |
tree | 770f92f3c56cb954c7b764ad43a7dc93312d28ba /tools | |
parent | 88c0e46e139fe44f7f2a6f9fbaa6b3fd7a827a8d (diff) |
add sal*Int64 conversions to BigInt
we have the capability, so lets use it
Change-Id: Ie5aa7999bb457d274bbcc07ba5c4e6ee2f286df1
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108231
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/source/generic/bigint.cxx | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tools/source/generic/bigint.cxx b/tools/source/generic/bigint.cxx index 62350a30c311..1239868b1432 100644 --- a/tools/source/generic/bigint.cxx +++ b/tools/source/generic/bigint.cxx @@ -594,6 +594,83 @@ BigInt::BigInt( sal_Int64 nValue ) } } +BigInt::BigInt( sal_uInt64 nValue ) + : nVal(0) +{ + bIsNeg = false; + nLen = 0; + + if (nValue <= SAL_MAX_INT32) + { + bIsBig = false; + nVal = static_cast<sal_Int32>(nValue); + } + else + { + bIsBig = true; + for (int i = 0; (i != sizeof(sal_uInt64) / 2) && (nValue != 0); ++i) + { + nNum[i] = static_cast<sal_uInt16>(nValue & 0xffffUL); + nValue = nValue >> 16; + ++nLen; + } + } +} + +BigInt::operator sal_uInt32() const +{ + if ( !bIsBig ) + { + assert(nVal >= 0 && "out of range"); + return static_cast<sal_uInt32>(nVal); + } + else + { + assert(nLen <= 2 && "out of range"); + assert(!bIsNeg && "out of range"); + + int i = nLen-1; + sal_uInt32 nRet = nNum[i]; + + while ( i ) + { + nRet = nRet << 16; + i--; + nRet |= nNum[i]; + } + + return nRet; + } +} + +BigInt::operator sal_Int64() const +{ + if ( !bIsBig ) + { + return nVal; + } + else + { + assert(nLen <= 4 && "out of range"); + assert((nLen < 4 || nNum[4] <= SAL_MAX_INT16) && "out of range"); + + int i = nLen-1; + sal_Int64 nRet = nNum[i]; + + while ( i ) + { + nRet = nRet << 16; + i--; + nRet |= nNum[i]; + } + + if ( bIsNeg ) + nRet *= -1; + + return nRet; + } +} + BigInt::operator double() const { if ( !bIsBig ) |