Skip to content

Commit 468012a

Browse files
committed
Introduce qgsRound since std::round is available only in C++11 onwards
1 parent 43c046b commit 468012a

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

‎src/core/geometry/qgsgeos.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,11 +1422,11 @@ GEOSCoordSequence* QgsGeos::createCoordinateSequence( const QgsCurveV2* curve, d
14221422
for ( int i = 0; i < numPoints; ++i )
14231423
{
14241424
QgsPointV2 pt = line->pointN( i ); //todo: create method to get const point reference
1425-
GEOSCoordSeq_setX_r( geosinit.ctxt, coordSeq, i, std::round( pt.x() / precision ) * precision );
1426-
GEOSCoordSeq_setY_r( geosinit.ctxt, coordSeq, i, std::round( pt.y() / precision ) * precision );
1425+
GEOSCoordSeq_setX_r( geosinit.ctxt, coordSeq, i, qgsRound( pt.x() / precision ) * precision );
1426+
GEOSCoordSeq_setY_r( geosinit.ctxt, coordSeq, i, qgsRound( pt.y() / precision ) * precision );
14271427
if ( hasZ )
14281428
{
1429-
GEOSCoordSeq_setOrdinate_r( geosinit.ctxt, coordSeq, i, 2, std::round( pt.z() / precision ) * precision );
1429+
GEOSCoordSeq_setOrdinate_r( geosinit.ctxt, coordSeq, i, 2, qgsRound( pt.z() / precision ) * precision );
14301430
}
14311431
if ( hasM )
14321432
{
@@ -1474,11 +1474,11 @@ GEOSGeometry* QgsGeos::createGeosPoint( const QgsAbstractGeometryV2* point, int
14741474
GEOSCoordSequence* coordSeq = GEOSCoordSeq_create_r( geosinit.ctxt, 1, coordDims );
14751475
if ( precision > 0. )
14761476
{
1477-
GEOSCoordSeq_setX_r( geosinit.ctxt, coordSeq, 0, std::round( pt->x() / precision ) * precision );
1478-
GEOSCoordSeq_setY_r( geosinit.ctxt, coordSeq, 0, std::round( pt->y() / precision ) * precision );
1477+
GEOSCoordSeq_setX_r( geosinit.ctxt, coordSeq, 0, qgsRound( pt->x() / precision ) * precision );
1478+
GEOSCoordSeq_setY_r( geosinit.ctxt, coordSeq, 0, qgsRound( pt->y() / precision ) * precision );
14791479
if ( pt->is3D() )
14801480
{
1481-
GEOSCoordSeq_setOrdinate_r( geosinit.ctxt, coordSeq, 0, 2, std::round( pt->z() / precision ) * precision );
1481+
GEOSCoordSeq_setOrdinate_r( geosinit.ctxt, coordSeq, 0, 2, qgsRound( pt->z() / precision ) * precision );
14821482
}
14831483
}
14841484
else

‎src/core/qgis.h‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,14 @@ inline bool qgsDoubleNearSig( double a, double b, int significantDigits = 10 )
289289
qRound( ar * pow( 10.0, significantDigits ) ) == qRound( br * pow( 10.0, significantDigits ) );
290290
}
291291

292+
//
293+
// a round function which returns a double to guard against overflows
294+
//
295+
inline double qgsRound( double x )
296+
{
297+
return x < 0.0 ? std::ceil( x - 0.5 ) : std::floor( x + 0.5 );
298+
}
299+
292300
bool qgsVariantLessThan( const QVariant& lhs, const QVariant& rhs );
293301

294302
bool qgsVariantGreaterThan( const QVariant& lhs, const QVariant& rhs );

0 commit comments

Comments
 (0)