[geos-commits] [SCM] GEOS branch main updated. 26cd20a73d72032da3812e77431334cdae620c5c

git at osgeo.org git at osgeo.org
Thu Aug 26 14:23:50 PDT 2021


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GEOS".

The branch, main has been updated
       via  26cd20a73d72032da3812e77431334cdae620c5c (commit)
      from  907636d6bbd5c29f0cfb6713b30323902704f6aa (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 26cd20a73d72032da3812e77431334cdae620c5c
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date:   Thu Aug 26 14:23:46 2021 -0700

    Change BufferOp to return unique_ptr result. Removes potential double-free/memory-leak condition by clarifying semantics of return. Incidentally repair small memleak in GeoJSON tests and add CI facility to save memcheck results log on failure.

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fbedddb..13e6548 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -125,7 +125,15 @@ jobs:
           --overwrite MemoryCheckCommandOptions="--leak-check=full --error-exitcode=100" \
           -R ^all-unit -C Valgrind -T memcheck
 
-    - name: Upload coverage to Codecov
+    - name: 'Upload Valgrind Log'
+      if: failure()
+      uses: actions/upload-artifact at v2
+      with:
+        name: valgrind-log
+        path: build.cmake/Testing/Temporary/MemoryChecker.**.log
+        retention-days: 1
+
+    - name: Upload Coverage to Codecov
       if: matrix.ci.build_type == 'Coverage'
       run: |
         curl -o codecov.sh https://codecov.io/bash
diff --git a/capi/geos_ts_c.cpp b/capi/geos_ts_c.cpp
index 4a1b299..2211d0f 100644
--- a/capi/geos_ts_c.cpp
+++ b/capi/geos_ts_c.cpp
@@ -1120,9 +1120,9 @@ extern "C" {
             );
             bp.setMitreLimit(mitreLimit);
             BufferOp op(g1, bp);
-            Geometry* g3 = op.getResultGeometry(width);
+            std::unique_ptr<Geometry> g3 = op.getResultGeometry(width);
             g3->setSRID(g1->getSRID());
-            return g3;
+            return g3.release();
         });
     }
 
@@ -1163,9 +1163,9 @@ extern "C" {
                 width = -width;
             }
             BufferBuilder bufBuilder(bp);
-            Geometry* g3 = bufBuilder.bufferLineSingleSided(g1, width, isLeftSide);
+            std::unique_ptr<Geometry> g3 = bufBuilder.bufferLineSingleSided(g1, width, isLeftSide);
             g3->setSRID(g1->getSRID());
-            return g3;
+            return g3.release();
         });
     }
 
@@ -1189,9 +1189,9 @@ extern "C" {
 
             bool isLeftSide = leftSide == 0 ? false : true;
             BufferBuilder bufBuilder(bp);
-            Geometry* g3 = bufBuilder.bufferLineSingleSided(g1, width, isLeftSide);
+            std::unique_ptr<Geometry> g3 = bufBuilder.bufferLineSingleSided(g1, width, isLeftSide);
             g3->setSRID(g1->getSRID());
-            return g3;
+            return g3.release();
         });
     }
 
@@ -3642,9 +3642,9 @@ extern "C" {
 
         return execute(extHandle, [&]() {
             BufferOp op(g1, *bp);
-            Geometry* g3 = op.getResultGeometry(width);
+            std::unique_ptr<Geometry> g3 = op.getResultGeometry(width);
             g3->setSRID(g1->getSRID());
-            return g3;
+            return g3.release();
         });
     }
 
diff --git a/include/geos/operation/buffer/BufferBuilder.h b/include/geos/operation/buffer/BufferBuilder.h
index 651aa2c..1feda77 100644
--- a/include/geos/operation/buffer/BufferBuilder.h
+++ b/include/geos/operation/buffer/BufferBuilder.h
@@ -156,8 +156,7 @@ public:
     }
 
 
-    geom::Geometry* buffer(const geom::Geometry* g, double distance);
-    // throw (GEOSException);
+    std::unique_ptr<geom::Geometry> buffer(const geom::Geometry* g, double distance);
 
     /**
      * Generates offset curve for linear geometry.
@@ -177,9 +176,9 @@ public:
      *
      * @note Not in JTS: this is a GEOS extension
      */
-    geom::Geometry* bufferLineSingleSided(const geom::Geometry* g,
-                                          double distance, bool leftSide) ;
-    // throw (GEOSException);
+    std::unique_ptr<geom::Geometry> bufferLineSingleSided(
+        const geom::Geometry* g,
+        double distance, bool leftSide);
 
 private:
 
@@ -255,7 +254,7 @@ private:
      *
      * @return the empty result geometry, transferring ownership to caller.
      */
-    geom::Geometry* createEmptyResultGeometry() const;
+    std::unique_ptr<geom::Geometry> createEmptyResultGeometry() const;
 
     // Declare type as noncopyable
     BufferBuilder(const BufferBuilder& other) = delete;
diff --git a/include/geos/operation/buffer/BufferOp.h b/include/geos/operation/buffer/BufferOp.h
index c166e55..4280c20 100644
--- a/include/geos/operation/buffer/BufferOp.h
+++ b/include/geos/operation/buffer/BufferOp.h
@@ -89,7 +89,19 @@ private:
      *
      *  This value should be less than the decimal precision of double-precision values (16).
      */
-    static const int MAX_PRECISION_DIGITS = 12;
+    static constexpr int MAX_PRECISION_DIGITS = 12;
+
+    const geom::Geometry* argGeom;
+
+    util::TopologyException saveException;
+
+    double distance;
+
+    BufferParameters bufParams;
+
+    std::unique_ptr<geom::Geometry> resultGeometry;
+
+    bool isInvertOrientation = false;
 
     /**
      * Compute a reasonable scale factor to limit the precision of
@@ -110,19 +122,6 @@ private:
     static double precisionScaleFactor(const geom::Geometry* g,
                                        double distance, int maxPrecisionDigits);
 
-    const geom::Geometry* argGeom;
-
-    util::TopologyException saveException;
-
-    double distance;
-
-    //int quadrantSegments;
-    //int endCapStyle;
-    BufferParameters bufParams;
-
-    geom::Geometry* resultGeometry;
-
-    bool isInvertOrientation = false;
 
     void computeGeometry();
 
@@ -134,22 +133,9 @@ private:
 
     void bufferFixedPrecision(const geom::PrecisionModel& fixedPM);
 
-    /**
-    * Combines the elements of two polygonal geometries together.
-    * The input geometries must be non-adjacent, to avoid
-    * creating an invalid result.
-    *
-    * @param poly0 a polygonal geometry (which may be empty)
-    * @param poly1 a polygonal geometry (which may be empty)
-    * @return a combined polygonal geometry
-    */
-    static geom::Geometry* combine(
-        const geom::Geometry* poly0,
-        const geom::Geometry* poly1);
-
     static void extractPolygons(
         geom::Geometry* poly0,
-        std::vector<std::unique_ptr<geom::Geometry>>& polys) ;
+        std::vector<std::unique_ptr<geom::Geometry>>& polys);
 
 public:
 
@@ -179,11 +165,11 @@ public:
      * @return the buffer of the input geometry
      *
      */
-    static geom::Geometry* bufferOp(const geom::Geometry* g,
-                                    double distance,
-                                    int quadrantSegments =
-                                        BufferParameters::DEFAULT_QUADRANT_SEGMENTS,
-                                    int endCapStyle = BufferParameters::CAP_ROUND);
+    static std::unique_ptr<geom::Geometry> bufferOp(
+        const geom::Geometry* g,
+        double distance,
+        int quadrantSegments = BufferParameters::DEFAULT_QUADRANT_SEGMENTS,
+        int endCapStyle = BufferParameters::CAP_ROUND);
 
     /** \brief
      * Initializes a buffer computation for the given geometry.
@@ -262,7 +248,7 @@ public:
      * @param nDistance the buffer distance
      * @return the buffer of the input geometry
      */
-    geom::Geometry* getResultGeometry(double nDistance);
+    std::unique_ptr<geom::Geometry> getResultGeometry(double nDistance);
 
     /**
     * Buffers a geometry with distance zero.
diff --git a/src/operation/buffer/BufferBuilder.cpp b/src/operation/buffer/BufferBuilder.cpp
index 9da2749..a942034 100644
--- a/src/operation/buffer/BufferBuilder.cpp
+++ b/src/operation/buffer/BufferBuilder.cpp
@@ -127,7 +127,7 @@ BufferBuilder::~BufferBuilder()
 }
 
 /*public*/
-Geometry*
+std::unique_ptr<Geometry>
 BufferBuilder::bufferLineSingleSided(const Geometry* g, double distance,
                                      bool leftSide)
 {
@@ -140,7 +140,7 @@ BufferBuilder::bufferLineSingleSided(const Geometry* g, double distance,
 
     // Nothing to do for a distance of zero
     if(distance == 0) {
-        return g->clone().release();
+        return g->clone();
     }
 
     // Get geometry factory and precision model.
@@ -260,7 +260,7 @@ BufferBuilder::bufferLineSingleSided(const Geometry* g, double distance,
         // Remove end points if they are a part of the original line to be
         // buffered.
         CoordinateSequence::Ptr coords(mergedLines.back()->getCoordinates());
-        if(nullptr != coords.get()) {
+        if(nullptr != coords) {
             // Use 98% of the buffer width as the point-distance requirement - this
             // is to ensure that the point that is "distance" +/- epsilon is not
             // included.
@@ -358,22 +358,22 @@ BufferBuilder::bufferLineSingleSided(const Geometry* g, double distance,
     intersectedLines.reset();
 
     if(mergedLinesGeom->size() > 1) {
-        return geomFact->createMultiLineString(mergedLinesGeom);
+        return std::unique_ptr<Geometry>(geomFact->createMultiLineString(mergedLinesGeom));
     }
     else if(mergedLinesGeom->size() == 1) {
 
-        Geometry* single = (*mergedLinesGeom)[0];
+        std::unique_ptr<Geometry> single((*mergedLinesGeom)[0]);
         delete mergedLinesGeom;
         return single;
     }
     else {
         delete mergedLinesGeom;
-        return geomFact->createLineString().release();
+        return geomFact->createLineString();
     }
 }
 
 /*public*/
-Geometry*
+std::unique_ptr<Geometry>
 BufferBuilder::buffer(const Geometry* g, double distance)
 // throw(GEOSException *)
 {
@@ -423,7 +423,7 @@ BufferBuilder::buffer(const Geometry* g, double distance)
     std::cerr << std::endl << edgeList << std::endl;
 #endif
 
-    Geometry* resultGeom = nullptr;
+    std::unique_ptr<Geometry> resultGeom(nullptr);
     std::unique_ptr< std::vector<Geometry*> > resultPolyList;
     std::vector<BufferSubgraph*> subgraphList;
 
@@ -476,7 +476,7 @@ BufferBuilder::buffer(const Geometry* g, double distance)
         }
 
         // resultPolyList ownership transferred here
-        resultGeom = geomFact->buildGeometry(resultPolyList.release());
+        resultGeom.reset(geomFact->buildGeometry(resultPolyList.release()));
 
     }
     catch(const util::GEOSException& /* exc */) {
@@ -714,11 +714,10 @@ BufferBuilder::buildSubgraphs(const std::vector<BufferSubgraph*>& subgraphList,
 }
 
 /*private*/
-geom::Geometry*
+std::unique_ptr<geom::Geometry>
 BufferBuilder::createEmptyResultGeometry() const
 {
-    geom::Geometry* emptyGeom = geomFact->createPolygon().release();
-    return emptyGeom;
+    return geomFact->createPolygon();
 }
 
 } // namespace geos.operation.buffer
diff --git a/src/operation/buffer/BufferOp.cpp b/src/operation/buffer/BufferOp.cpp
index 772688f..95dd9e2 100644
--- a/src/operation/buffer/BufferOp.cpp
+++ b/src/operation/buffer/BufferOp.cpp
@@ -61,24 +61,6 @@ namespace buffer { // geos.operation.buffer
 static Profiler* profiler = Profiler::instance();
 #endif
 
-#if 0
-double
-OLDprecisionScaleFactor(const Geometry* g,
-                        double distance, int maxPrecisionDigits)
-{
-    const Envelope* env = g->getEnvelopeInternal();
-    double envSize = std::max(env->getHeight(), env->getWidth());
-    double expandByDistance = distance > 0.0 ? distance : 0.0;
-    double bufEnvSize = envSize + 2 * expandByDistance;
-    // the smallest power of 10 greater than the buffer envelope
-    int bufEnvLog10 = (int)(std::log(bufEnvSize) / std::log(10.0) + 1.0);
-    int minUnitLog10 = bufEnvLog10 - maxPrecisionDigits;
-    // scale factor is inverse of min Unit size, so flip sign of exponent
-    double scaleFactor = std::pow(10.0, -minUnitLog10);
-    return scaleFactor;
-}
-#endif
-
 /*private*/
 double
 BufferOp::precisionScaleFactor(const Geometry* g,
@@ -104,7 +86,7 @@ BufferOp::precisionScaleFactor(const Geometry* g,
 }
 
 /*public static*/
-Geometry*
+std::unique_ptr<Geometry>
 BufferOp::bufferOp(const Geometry* g, double distance,
                    int quadrantSegments,
                    int nEndCapStyle)
@@ -116,12 +98,12 @@ BufferOp::bufferOp(const Geometry* g, double distance,
 }
 
 /*public*/
-Geometry*
+std::unique_ptr<Geometry>
 BufferOp::getResultGeometry(double nDistance)
 {
     distance = nDistance;
     computeGeometry();
-    return resultGeometry;
+    return std::unique_ptr<Geometry>(resultGeometry.release());
 }
 
 /*private*/
@@ -174,8 +156,6 @@ BufferOp::bufferReducedPrecision()
         }
 
         if(resultGeometry != nullptr) {
-            // debug
-            //if ( saveException ) std::cerr<<saveException->toString()<<std::endl;
             return;
         }
     }
@@ -190,7 +170,6 @@ BufferOp::bufferOriginalPrecision()
     BufferBuilder bufBuilder(bufParams);
     bufBuilder.setInvertOrientation(isInvertOrientation);
 
-    //std::cerr<<"computing with original precision"<<std::endl;
     try {
         resultGeometry = bufBuilder.buffer(argGeom, distance);
     }
@@ -198,10 +177,7 @@ BufferOp::bufferOriginalPrecision()
         // don't propagate the exception - it will be detected by
         // fact that resultGeometry is null
         saveException = ex;
-
-        //std::cerr<<ex->toString()<<std::endl;
     }
-    //std::cerr<<"done"<<std::endl;
 }
 
 void
diff --git a/src/operation/buffer/OffsetCurveBuilder.cpp b/src/operation/buffer/OffsetCurveBuilder.cpp
index b51b514..4058c8d 100644
--- a/src/operation/buffer/OffsetCurveBuilder.cpp
+++ b/src/operation/buffer/OffsetCurveBuilder.cpp
@@ -25,7 +25,6 @@
 #include <geos/algorithm/Angle.h>
 #include <geos/operation/buffer/OffsetCurveBuilder.h>
 #include <geos/operation/buffer/BufferInputLineSimplifier.h>
-#include <geos/operation/buffer/BufferOp.h>
 #include <geos/operation/buffer/BufferParameters.h>
 #include <geos/geom/Position.h>
 #include <geos/geom/CoordinateArraySequence.h>
diff --git a/src/operation/buffer/OffsetSegmentGenerator.cpp b/src/operation/buffer/OffsetSegmentGenerator.cpp
index 9d76427..885f576 100644
--- a/src/operation/buffer/OffsetSegmentGenerator.cpp
+++ b/src/operation/buffer/OffsetSegmentGenerator.cpp
@@ -24,7 +24,6 @@
 #include <geos/algorithm/Angle.h>
 #include <geos/operation/buffer/OffsetSegmentGenerator.h>
 #include <geos/operation/buffer/OffsetSegmentString.h>
-#include <geos/operation/buffer/BufferOp.h>
 #include <geos/operation/buffer/BufferInputLineSimplifier.h>
 #include <geos/operation/buffer/BufferParameters.h>
 #include <geos/geom/Position.h>
diff --git a/tests/unit/capi/GEOSGeomGeoJSONReadTest.cpp b/tests/unit/capi/GEOSGeomGeoJSONReadTest.cpp
index 0b1f852..b16dd36 100644
--- a/tests/unit/capi/GEOSGeomGeoJSONReadTest.cpp
+++ b/tests/unit/capi/GEOSGeomGeoJSONReadTest.cpp
@@ -30,7 +30,8 @@ struct test_capigeosgeomreadgeojson_data : public capitest::utility {
     {
         geom1_ = GEOSGeoJSONReader_readGeometry(reader_, &geojson[0]);
         ensure("GEOSGeoJSONReader_readGeometry failed to create geometry", nullptr != geom1_);
-        ensure_geometry_equals(geom1_, fromWKT(&wkt[0]));
+        geom2_ = fromWKT(wkt.c_str());
+        ensure_geometry_equals(geom1_, geom2_);
     }
 };
 
diff --git a/tests/unit/operation/buffer/BufferOpTest.cpp b/tests/unit/operation/buffer/BufferOpTest.cpp
index 1b0318d..59846f0 100644
--- a/tests/unit/operation/buffer/BufferOpTest.cpp
+++ b/tests/unit/operation/buffer/BufferOpTest.cpp
@@ -69,7 +69,7 @@ void object::test<1>
 
     double const distance = 0.0;
     BufferOp op(g0.get());
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     ensure(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
@@ -90,7 +90,7 @@ void object::test<2>
     // Buffer point with default buffering parameters
     double const distance = 1.0;
     BufferOp op(g0.get());
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
@@ -116,7 +116,7 @@ void object::test<3>
     BufferOp op(g0.get(), params);
 
     double const distance = 1.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
@@ -143,7 +143,7 @@ void object::test<4>
         BufferParameters params(segments);
         BufferOp op(g0.get(), params);
         double const distance = 0.0001;
-        GeomPtr gBuffer(op.getResultGeometry(distance));
+        GeomPtr gBuffer = op.getResultGeometry(distance);
         ensure_not(gBuffer->isEmpty());
         ensure(gBuffer->isValid());
         ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -156,7 +156,7 @@ void object::test<4>
         BufferParameters params(segments);
         BufferOp op(g0.get(), params);
         double const distance = 0.0001;
-        GeomPtr gBuffer(op.getResultGeometry(distance));
+        GeomPtr gBuffer = op.getResultGeometry(distance);
         ensure_not(gBuffer->isEmpty());
         ensure(gBuffer->isValid());
         ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -181,7 +181,7 @@ void object::test<5>
     BufferParameters params(default_quadrant_segments * 4);
     BufferOp op(g0.get(), params);
     double const distance = -75.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
     ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -206,7 +206,7 @@ void object::test<6>
     BufferParameters params(segments);
     BufferOp op(g0.get(), params);
     double const distance = -75.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
     ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -231,7 +231,7 @@ void object::test<7>
     BufferParameters params(segments);
     BufferOp op(g0.get(), params);
     double const distance = -75.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
     ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -256,7 +256,7 @@ void object::test<8>
     BufferParameters params(segments);
     BufferOp op(g0.get(), params);
     double const distance = -75.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
     ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -281,7 +281,7 @@ void object::test<9>
     BufferParameters params(segments);
     BufferOp op(g0.get(), params);
     double const distance = -75.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
     ensure_equals(gBuffer->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -310,7 +310,7 @@ void object::test<10>
 
     BufferParameters params1(segments, BufferParameters::CAP_ROUND);
     BufferOp op1(g0.get(), params1);
-    GeomPtr gBuffer1(op1.getResultGeometry(distance));
+    GeomPtr gBuffer1 = op1.getResultGeometry(distance);
     ensure_not(gBuffer1->isEmpty());
     ensure(gBuffer1->isValid());
     ensure_equals(gBuffer1->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
@@ -363,7 +363,7 @@ MULTILINESTRING(  \
                             1.0);
     const double distance = 5.0;
     BufferOp op(g0.get(), params);
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     // We're basically only interested an rough sense of a
     // meaningful result.
@@ -390,7 +390,7 @@ void object::test<12>
     BufferOp op(g0.get(), params);
 
     double const distance = 80.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
@@ -418,7 +418,7 @@ void object::test<13>
     BufferOp op(g0.get(), param);
 
     double const distance = 40.0;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     ensure_not(gBuffer->isEmpty());
     ensure(gBuffer->isValid());
@@ -440,7 +440,7 @@ void object::test<14>
     BufferOp op(g0.get());
 
     double const distance = 0.5;
-    GeomPtr gBuffer(op.getResultGeometry(distance));
+    GeomPtr gBuffer = op.getResultGeometry(distance);
 
     // std::cout << wktwriter.write(gBuffer.get()) << std::endl;
 
diff --git a/tests/xmltester/XMLTester.cpp b/tests/xmltester/XMLTester.cpp
index 01f22f7..0f430dd 100644
--- a/tests/xmltester/XMLTester.cpp
+++ b/tests/xmltester/XMLTester.cpp
@@ -1710,7 +1710,7 @@ XMLTester::parseTest(const tinyxml2::XMLNode* node)
 
 
             BufferOp op(p_gT, params);
-            gRealRes.reset(op.getResultGeometry(dist));
+            gRealRes = op.getResultGeometry(dist);
 
             profile.stop();
             gRealRes->normalize();
@@ -1754,8 +1754,7 @@ XMLTester::parseTest(const tinyxml2::XMLNode* node)
             }
 
             BufferBuilder bufBuilder(params) ;
-            gRealRes.reset(bufBuilder.bufferLineSingleSided(
-                               p_gT, dist, leftSide)) ;
+            gRealRes = bufBuilder.bufferLineSingleSided(p_gT, dist, leftSide);
 
             profile.stop();
             gRealRes->normalize();
@@ -1796,7 +1795,7 @@ XMLTester::parseTest(const tinyxml2::XMLNode* node)
             }
 
             BufferOp op(p_gT, params);
-            gRealRes.reset(op.getResultGeometry(dist));
+            gRealRes = op.getResultGeometry(dist);
 
             profile.stop();
             gRealRes->normalize();

-----------------------------------------------------------------------

Summary of changes:
 .github/workflows/ci.yml                        | 10 ++++-
 capi/geos_ts_c.cpp                              | 16 ++++----
 include/geos/operation/buffer/BufferBuilder.h   | 11 +++--
 include/geos/operation/buffer/BufferOp.h        | 54 +++++++++----------------
 src/operation/buffer/BufferBuilder.cpp          | 23 +++++------
 src/operation/buffer/BufferOp.cpp               | 30 ++------------
 src/operation/buffer/OffsetCurveBuilder.cpp     |  1 -
 src/operation/buffer/OffsetSegmentGenerator.cpp |  1 -
 tests/unit/capi/GEOSGeomGeoJSONReadTest.cpp     |  3 +-
 tests/unit/operation/buffer/BufferOpTest.cpp    | 30 +++++++-------
 tests/xmltester/XMLTester.cpp                   |  7 ++--
 11 files changed, 76 insertions(+), 110 deletions(-)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list