[Libreoffice-commits] core.git: svx/source
Stephan Bergmann
sbergman at redhat.com
Wed Jan 24 18:44:13 UTC 2018
svx/source/xoutdev/_xpoly.cxx | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
New commits:
commit d5af010a3287381db9accbf20063087ee18fcb62
Author: Stephan Bergmann <sbergman at redhat.com>
Date: Wed Jan 24 11:09:42 2018 +0100
Allocate ImpXPolygon::pPointAry as a true Point[]
...as the default Point ctor already zero-initializes its members, remvoing the
need for some memset calls (that cause -Werror=class-memaccess, "clearing an
object of non-trivial type ‘class Point’" with upcoming GCC 8). Other such
problematic memset calls are replaced with std::fill, which appears to produce
adequate code with recent compilers (looked at GCC 7.2 and 8, Clang 7, at -O2),
a tight loop of filling the memory with zeroes.
A follow-up commit might want to use unique_ptr or vector for pPointAry.
Change-Id: I566422b2213643ab762f0d87a25e745ec2f35ee4
Reviewed-on: https://gerrit.libreoffice.org/48488
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/svx/source/xoutdev/_xpoly.cxx b/svx/source/xoutdev/_xpoly.cxx
index 4718a873228e..07ff1d214ec3 100644
--- a/svx/source/xoutdev/_xpoly.cxx
+++ b/svx/source/xoutdev/_xpoly.cxx
@@ -17,6 +17,10 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
+#include <sal/config.h>
+
+#include <algorithm>
+
#include <osl/endian.h>
#include <tools/stream.hxx>
#include <tools/debug.hxx>
@@ -67,10 +71,10 @@ ImpXPolygon::ImpXPolygon( const ImpXPolygon& rImpXPoly )
ImpXPolygon::~ImpXPolygon()
{
- delete[] reinterpret_cast<char*>(pPointAry);
+ delete[] pPointAry;
if ( bDeleteOldPoints )
{
- delete[] reinterpret_cast<char*>(pOldPointAry);
+ delete[] pOldPointAry;
pOldPointAry = nullptr;
}
}
@@ -111,8 +115,7 @@ void ImpXPolygon::Resize( sal_uInt16 nNewSize, bool bDeletePoints )
}
// create point array
nSize = nNewSize;
- pPointAry = reinterpret_cast<Point*>(new char[ nSize*sizeof( Point ) ]);
- memset( pPointAry, 0, nSize*sizeof( Point ) );
+ pPointAry = new Point[ nSize ];
// create flag array
pFlagAry.reset( new PolyFlags[ nSize ] );
@@ -137,7 +140,7 @@ void ImpXPolygon::Resize( sal_uInt16 nNewSize, bool bDeletePoints )
}
if ( bDeletePoints )
{
- delete[] reinterpret_cast<char*>(pOldPointAry);
+ delete[] pOldPointAry;
pOldPointAry = nullptr;
}
else
@@ -165,7 +168,7 @@ void ImpXPolygon::InsertSpace( sal_uInt16 nPos, sal_uInt16 nCount )
nMove * sizeof(Point) );
memmove( &pFlagAry[nPos+nCount], &pFlagAry[nPos], nMove );
}
- memset( &pPointAry[nPos], 0, nCount * sizeof( Point ) );
+ std::fill(pPointAry + nPos, pPointAry + nPos + nCount, Point());
memset( &pFlagAry [nPos], 0, nCount );
nPoints = nPoints + nCount;
@@ -185,7 +188,7 @@ void ImpXPolygon::Remove( sal_uInt16 nPos, sal_uInt16 nCount )
nMove * sizeof(Point) );
memmove( &pFlagAry[nPos], &pFlagAry[nPos+nCount], nMove );
}
- memset( &pPointAry[nPoints - nCount], 0, nCount * sizeof( Point ) );
+ std::fill(pPointAry + (nPoints - nCount), pPointAry + nPoints, Point());
memset( &pFlagAry [nPoints - nCount], 0, nCount );
nPoints = nPoints - nCount;
}
@@ -195,7 +198,7 @@ void ImpXPolygon::CheckPointDelete() const
{
if ( bDeleteOldPoints )
{
- delete[] reinterpret_cast<char*>(pOldPointAry);
+ delete[] pOldPointAry;
const_cast< ImpXPolygon* >(this)->pOldPointAry = nullptr;
const_cast< ImpXPolygon* >(this)->bDeleteOldPoints = false;
}
@@ -344,7 +347,8 @@ void XPolygon::SetPointCount( sal_uInt16 nPoints )
if ( nPoints < pImpXPolygon->nPoints )
{
sal_uInt16 nSize = pImpXPolygon->nPoints - nPoints;
- memset( &pImpXPolygon->pPointAry[nPoints], 0, nSize * sizeof( Point ) );
+ std::fill(
+ pImpXPolygon->pPointAry + nPoints, pImpXPolygon->pPointAry + nPoints + nSize, Point());
memset( &pImpXPolygon->pFlagAry [nPoints], 0, nSize );
}
pImpXPolygon->nPoints = nPoints;
More information about the Libreoffice-commits
mailing list