diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2021-08-10 22:53:46 +0200 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2021-08-11 08:16:35 +0200 |
commit | 84bf981a4fdf94cae40dd199762dc03d681618fe (patch) | |
tree | feef673c747f405b7d5cd42c1a59a34af5e947fa | |
parent | 0ff5eb97b89f89e770d4397bf76f24fb7cd76b57 (diff) |
Deduplicate number read/write
Change-Id: I58808e208ac8b3406497a4e512ec3372434d2ed3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/120246
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
-rw-r--r-- | include/tools/stream.hxx | 3 | ||||
-rw-r--r-- | tools/source/stream/stream.cxx | 185 |
2 files changed, 33 insertions, 155 deletions
diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx index e99d41c8ac45..884b95f07290 100644 --- a/include/tools/stream.hxx +++ b/include/tools/stream.hxx @@ -409,6 +409,9 @@ public: bool good() const { return !(eof() || bad()); } private: + template <typename T> SvStream& ReadNumber(T& r); + template <typename T> SvStream& WriteNumber(T n); + template<typename T> void readNumberWithoutSwap(T& rDataDest) { readNumberWithoutSwap_(&rDataDest, sizeof(rDataDest)); } diff --git a/tools/source/stream/stream.cxx b/tools/source/stream/stream.cxx index 515f3a1657ab..d42cefdf63cf 100644 --- a/tools/source/stream/stream.cxx +++ b/tools/source/stream/stream.cxx @@ -53,44 +53,23 @@ static void swapNibbles(unsigned char &c) #include <algorithm> // !!! Do not inline if already the operators <<,>> are inline -static void SwapUShort( sal_uInt16& r ) +template <typename T, std::enable_if_t<std::is_integral_v<T> && sizeof(T) == 2, int> = 0> +static void SwapNumber(T& r) { r = OSL_SWAPWORD(r); } -static void SwapShort( short& r ) - { r = OSL_SWAPWORD(r); } -static void SwapULong( sal_uInt32& r ) - { r = OSL_SWAPDWORD(r); } -static void SwapLongInt( sal_Int32& r ) +template <typename T, std::enable_if_t<std::is_integral_v<T> && sizeof(T) == 4, int> = 0> +static void SwapNumber(T& r) { r = OSL_SWAPDWORD(r); } - -static void SwapUInt64( sal_uInt64& r ) +template <typename T, std::enable_if_t<std::is_integral_v<T> && sizeof(T) == 8, int> = 0> +static void SwapNumber(T& r) { union { - sal_uInt64 n; + T n; sal_uInt32 c[2]; } s; s.n = r; - s.c[0] ^= s.c[1]; // swap the 32 bit words - s.c[1] ^= s.c[0]; - s.c[0] ^= s.c[1]; - // swap the bytes in the words - s.c[0] = OSL_SWAPDWORD(s.c[0]); - s.c[1] = OSL_SWAPDWORD(s.c[1]); - r = s.n; - } -static void SwapInt64( sal_Int64& r ) - { - union - { - sal_Int64 n; - sal_Int32 c[2]; - } s; - - s.n = r; - s.c[0] ^= s.c[1]; // swap the 32 bit words - s.c[1] ^= s.c[0]; - s.c[0] ^= s.c[1]; + std::swap(s.c[0], s.c[1]); // swap the 32 bit words // swap the bytes in the words s.c[0] = OSL_SWAPDWORD(s.c[0]); s.c[1] = OSL_SWAPDWORD(s.c[1]); @@ -136,8 +115,6 @@ static void SwapDouble( double& r ) } #endif -static void SwapUnicode(sal_Unicode & r) { r = OSL_SWAPWORD(r); } - //SDO void SvStream::readNumberWithoutSwap_(void * pDataDest, int nDataSize) @@ -554,7 +531,7 @@ bool SvStream::ReadUniStringLine( OUString& rStr, sal_Int32 nMaxCodepointsToRead for( j = n = 0; j < nLen ; ++j ) { if (m_isSwap) - SwapUnicode( buf[n] ); + SwapNumber( buf[n] ); c = buf[j]; if ( c == '\n' || c == '\r' ) { @@ -596,7 +573,7 @@ bool SvStream::ReadUniStringLine( OUString& rStr, sal_Int32 nMaxCodepointsToRead sal_Unicode cTemp; ReadBytes( &cTemp, sizeof(cTemp) ); if (m_isSwap) - SwapUnicode( cTemp ); + SwapNumber( cTemp ); if( cTemp == c || (cTemp != '\n' && cTemp != '\r') ) Seek( nOldFilePos ); } @@ -677,7 +654,7 @@ std::size_t write_uInt16s_FromOUString(SvStream& rStrm, std::u16string_view rStr const sal_Unicode* const pStop = pTmp + nLen; while ( p < pStop ) { - SwapUnicode( *p ); + SwapNumber( *p ); p++; } nWritten = rStrm.WriteBytes( pTmp, nLen * sizeof(sal_Unicode) ); @@ -813,83 +790,25 @@ sal_uInt64 SvStream::SeekRel(sal_Int64 const nPos) return Seek( nActualPos ); } -SvStream& SvStream::ReadUInt16(sal_uInt16& r) -{ - sal_uInt16 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapUShort(n); - r = n; - } - return *this; -} - -SvStream& SvStream::ReadUInt32(sal_uInt32& r) -{ - sal_uInt32 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapULong(n); - r = n; - } - return *this; -} - -SvStream& SvStream::ReadUInt64(sal_uInt64& r) -{ - sal_uInt64 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapUInt64(n); - r = n; - } - return *this; -} - -SvStream& SvStream::ReadInt16(sal_Int16& r) -{ - sal_Int16 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapShort(n); - r = n; - } - return *this; -} - -SvStream& SvStream::ReadInt32(sal_Int32& r) +template <typename T> SvStream& SvStream::ReadNumber(T& r) { - sal_Int32 n = 0; + T n = 0; readNumberWithoutSwap(n); if (good()) { if (m_isSwap) - SwapLongInt(n); + SwapNumber(n); r = n; } return *this; } -SvStream& SvStream::ReadInt64(sal_Int64& r) -{ - sal_Int64 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapInt64(n); - r = n; - } - return *this; -} +SvStream& SvStream::ReadUInt16(sal_uInt16& r) { return ReadNumber(r); } +SvStream& SvStream::ReadUInt32(sal_uInt32& r) { return ReadNumber(r); } +SvStream& SvStream::ReadUInt64(sal_uInt64& r) { return ReadNumber(r); } +SvStream& SvStream::ReadInt16(sal_Int16& r) { return ReadNumber(r); } +SvStream& SvStream::ReadInt32(sal_Int32& r) { return ReadNumber(r); } +SvStream& SvStream::ReadInt64(sal_Int64& r) { return ReadNumber(r); } SvStream& SvStream::ReadSChar( signed char& r ) { @@ -935,18 +854,7 @@ SvStream& SvStream::ReadUChar( unsigned char& r ) return *this; } -SvStream& SvStream::ReadUtf16(sal_Unicode& r) -{ - sal_uInt16 n = 0; - readNumberWithoutSwap(n); - if (good()) - { - if (m_isSwap) - SwapUShort(n); - r = sal_Unicode(n); - } - return *this; -} +SvStream& SvStream::ReadUtf16(sal_Unicode& r) { return ReadNumber(r); } SvStream& SvStream::ReadCharAsBool( bool& r ) { @@ -1015,53 +923,20 @@ SvStream& SvStream::ReadStream( SvStream& rStream ) return *this; } -SvStream& SvStream::WriteUInt16( sal_uInt16 v ) +template <typename T> SvStream& SvStream::WriteNumber(T n) { if (m_isSwap) - SwapUShort(v); - writeNumberWithoutSwap(v); + SwapNumber(n); + writeNumberWithoutSwap(n); return *this; } -SvStream& SvStream::WriteUInt32( sal_uInt32 v ) -{ - if (m_isSwap) - SwapULong(v); - writeNumberWithoutSwap(v); - return *this; -} - -SvStream& SvStream::WriteUInt64( sal_uInt64 v ) -{ - if (m_isSwap) - SwapUInt64(v); - writeNumberWithoutSwap(v); - return *this; -} - -SvStream& SvStream::WriteInt16( sal_Int16 v ) -{ - if (m_isSwap) - SwapShort(v); - writeNumberWithoutSwap(v); - return *this; -} - -SvStream& SvStream::WriteInt32( sal_Int32 v ) -{ - if (m_isSwap) - SwapLongInt(v); - writeNumberWithoutSwap(v); - return *this; -} - -SvStream& SvStream::WriteInt64 (sal_Int64 v) -{ - if (m_isSwap) - SwapInt64(v); - writeNumberWithoutSwap(v); - return *this; -} +SvStream& SvStream::WriteUInt16(sal_uInt16 v) { return WriteNumber(v); } +SvStream& SvStream::WriteUInt32(sal_uInt32 v) { return WriteNumber(v); } +SvStream& SvStream::WriteUInt64(sal_uInt64 v) { return WriteNumber(v); } +SvStream& SvStream::WriteInt16(sal_Int16 v) { return WriteNumber(v); } +SvStream& SvStream::WriteInt32(sal_Int32 v) { return WriteNumber(v); } +SvStream& SvStream::WriteInt64(sal_Int64 v) { return WriteNumber(v); } SvStream& SvStream::WriteSChar( signed char v ) { |