[geos-commits] [SCM] GEOS branch master updated. a64c3d737ae771d9734a987c5620dee6720a87df

git at osgeo.org git at osgeo.org
Tue Jun 18 06:57:47 PDT 2019


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, master has been updated
       via  a64c3d737ae771d9734a987c5620dee6720a87df (commit)
       via  ee679ead0071ecbab99d7957294129c8ec285dee (commit)
       via  573caf8e33c70d1e435d9aa5db2e4dbcc93432d4 (commit)
      from  e83855d40d8ce0645a5d47469e82245e630d3290 (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 a64c3d737ae771d9734a987c5620dee6720a87df
Merge: e83855d ee679ea
Author: Daniel Baston <dbaston at gmail.com>
Date:   Tue Jun 18 09:57:30 2019 -0400

    Merge branch 'io-unique-ptr'


commit ee679ead0071ecbab99d7957294129c8ec285dee
Author: Daniel Baston <dbaston at gmail.com>
Date:   Mon Jun 17 07:47:48 2019 -0400

    Simplify constuction of base class unique_ptr from subclass unique_ptr

diff --git a/src/io/WKBReader.cpp b/src/io/WKBReader.cpp
index 39abe92..95df676 100644
--- a/src/io/WKBReader.cpp
+++ b/src/io/WKBReader.cpp
@@ -241,25 +241,25 @@ WKBReader::readGeometry()
 
     switch(geometryType) {
     case WKBConstants::wkbPoint :
-        result.reset(readPoint().release());
+        result = readPoint();
         break;
     case WKBConstants::wkbLineString :
-        result.reset(readLineString().release());
+        result = readLineString();
         break;
     case WKBConstants::wkbPolygon :
-        result.reset(readPolygon().release());
+        result = readPolygon();
         break;
     case WKBConstants::wkbMultiPoint :
-        result.reset(readMultiPoint().release());
+        result = readMultiPoint();
         break;
     case WKBConstants::wkbMultiLineString :
-        result.reset(readMultiLineString().release());
+        result = readMultiLineString();
         break;
     case WKBConstants::wkbMultiPolygon :
-        result.reset(readMultiPolygon().release());
+        result = readMultiPolygon();
         break;
     case WKBConstants::wkbGeometryCollection :
-        result.reset(readGeometryCollection().release());
+        result = readGeometryCollection();
         break;
     default:
         stringstream err;
diff --git a/src/io/WKTReader.cpp b/src/io/WKTReader.cpp
index 7738c89..ff2d360 100644
--- a/src/io/WKTReader.cpp
+++ b/src/io/WKTReader.cpp
@@ -220,30 +220,30 @@ WKTReader::readGeometryTaggedText(StringTokenizer* tokenizer)
 {
     string type = getNextWord(tokenizer);
     if(type == "POINT") {
-        return std::unique_ptr<Geometry>(readPointText(tokenizer).release());
+        return readPointText(tokenizer);
     }
     else if(type == "LINESTRING") {
-        return std::unique_ptr<Geometry>(readLineStringText(tokenizer));
+        return readLineStringText(tokenizer);
     }
     else if(type == "LINEARRING") {
-        return std::unique_ptr<Geometry>(readLinearRingText(tokenizer));
+        return readLinearRingText(tokenizer);
     }
     else if(type == "POLYGON") {
-        return std::unique_ptr<Geometry>(readPolygonText(tokenizer));
+        return readPolygonText(tokenizer);
     }
     else if(type == "MULTIPOINT") {
-        return std::unique_ptr<Geometry>(readMultiPointText(tokenizer));
+        return readMultiPointText(tokenizer);
     }
     else if(type == "MULTILINESTRING") {
-        return std::unique_ptr<Geometry>(readMultiLineStringText(tokenizer));
+        return readMultiLineStringText(tokenizer);
     }
     else if(type == "MULTIPOLYGON") {
-        return std::unique_ptr<Geometry>(readMultiPolygonText(tokenizer));
+        return readMultiPolygonText(tokenizer);
     }
     else if(type == "GEOMETRYCOLLECTION") {
-        return std::unique_ptr<Geometry>(readGeometryCollectionText(tokenizer));
+        return readGeometryCollectionText(tokenizer);
     }
-    throw  ParseException("Unknown type", type);
+    throw ParseException("Unknown type", type);
 }
 
 std::unique_ptr<Point>

commit 573caf8e33c70d1e435d9aa5db2e4dbcc93432d4
Author: Daniel Baston <dbaston at gmail.com>
Date:   Sun Jun 16 20:59:46 2019 -0400

    Return unique_ptr from WKTReader and WKBReader

diff --git a/capi/geos_ts_c.cpp b/capi/geos_ts_c.cpp
index c2c2c3b..826cb71 100644
--- a/capi/geos_ts_c.cpp
+++ b/capi/geos_ts_c.cpp
@@ -1324,8 +1324,8 @@ extern "C" {
             const std::string wktstring(wkt);
             WKTReader r(static_cast<GeometryFactory const*>(handle->geomFactory));
 
-            Geometry* g = r.read(wktstring);
-            return g;
+            auto g = r.read(wktstring);
+            return g.release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
@@ -1427,8 +1427,8 @@ extern "C" {
             std::istringstream is(std::ios_base::binary);
             is.str(wkbstring);
             is.seekg(0, std::ios::beg); // rewind reader pointer
-            Geometry* g = r.read(is);
-            return g;
+            auto g = r.read(is);
+            return g.release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
@@ -1501,8 +1501,8 @@ extern "C" {
             is.str(hexstring);
             is.seekg(0, std::ios::beg); // rewind reader pointer
 
-            Geometry* g = r.readHEX(is);
-            return g;
+            auto g = r.readHEX(is);
+            return g.release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
@@ -4638,8 +4638,7 @@ extern "C" {
 
         try {
             const std::string wktstring(wkt);
-            Geometry* g = reader->read(wktstring);
-            return g;
+            return reader->read(wktstring).release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
@@ -4950,8 +4949,7 @@ extern "C" {
             membuf mb((char*)wkb, size);
             istream is(&mb);
 
-            Geometry* g = reader->read(is);
-            return g;
+            return reader->read(is).release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
@@ -4985,8 +4983,7 @@ extern "C" {
             is.str(hexstring);
             is.seekg(0, std::ios::beg); // rewind reader pointer
 
-            Geometry* g = reader->readHEX(is);
-            return g;
+            return reader->readHEX(is).release();
         }
         catch(const std::exception& e) {
             handle->ERROR_MESSAGE("%s", e.what());
diff --git a/doc/example.cpp b/doc/example.cpp
index 68eb354..9d5ad07 100644
--- a/doc/example.cpp
+++ b/doc/example.cpp
@@ -160,7 +160,7 @@ WKBtest(vector<Geometry*>* geoms)
              " fail:" << s.fail() << endl;
 #endif
 
-        gout = wkbReader.read(s);
+        gout = wkbReader.read(s).release();
 
 #if DEBUG_STREAM_STATE
         cout << "State of stream after READ: ";
diff --git a/include/geos/io/WKBReader.h b/include/geos/io/WKBReader.h
index d507815..affdb1c 100644
--- a/include/geos/io/WKBReader.h
+++ b/include/geos/io/WKBReader.h
@@ -26,8 +26,8 @@
 #include <geos/io/ByteOrderDataInStream.h> // for composition
 
 #include <iosfwd> // ostream, istream
+#include <memory>
 #include <vector>
-#include <string>
 
 #define BAD_GEOM_TYPE_MSG "Bad geometry type encountered in"
 
@@ -93,8 +93,7 @@ public:
      * @throws IOException
      * @throws ParseException
      */
-    geom::Geometry* read(std::istream& is);
-    // throws IOException, ParseException
+    std::unique_ptr<geom::Geometry> read(std::istream& is);
 
     /**
      * \brief Reads a Geometry from an istream in hex format.
@@ -104,8 +103,7 @@ public:
      * @throws IOException
      * @throws ParseException
      */
-    geom::Geometry* readHEX(std::istream& is);
-    // throws IOException, ParseException
+    std::unique_ptr<geom::Geometry> readHEX(std::istream& is);
 
     /**
      * \brief Print WKB in HEX form to out stream
@@ -126,32 +124,23 @@ private:
 
     std::vector<double> ordValues;
 
-    geom::Geometry* readGeometry();
-    // throws IOException, ParseException
+    std::unique_ptr<geom::Geometry> readGeometry();
 
-    geom::Point* readPoint();
-    // throws IOException
+    std::unique_ptr<geom::Point> readPoint();
 
-    geom::LineString* readLineString();
-    // throws IOException
+    std::unique_ptr<geom::LineString> readLineString();
 
-    geom::LinearRing* readLinearRing();
-    // throws IOException
+    std::unique_ptr<geom::LinearRing> readLinearRing();
 
-    geom::Polygon* readPolygon();
-    // throws IOException
+    std::unique_ptr<geom::Polygon> readPolygon();
 
-    geom::MultiPoint* readMultiPoint();
-    // throws IOException, ParseException
+    std::unique_ptr<geom::MultiPoint> readMultiPoint();
 
-    geom::MultiLineString* readMultiLineString();
-    // throws IOException, ParseException
+    std::unique_ptr<geom::MultiLineString> readMultiLineString();
 
-    geom::MultiPolygon* readMultiPolygon();
-    // throws IOException, ParseException
+    std::unique_ptr<geom::MultiPolygon> readMultiPolygon();
 
-    geom::GeometryCollection* readGeometryCollection();
-    // throws IOException, ParseException
+    std::unique_ptr<geom::GeometryCollection> readGeometryCollection();
 
     std::unique_ptr<geom::CoordinateSequence> readCoordinateSequence(int); // throws IOException
 
diff --git a/include/geos/io/WKTReader.h b/include/geos/io/WKTReader.h
index 4916995..a43bffa 100644
--- a/include/geos/io/WKTReader.h
+++ b/include/geos/io/WKTReader.h
@@ -24,6 +24,7 @@
 
 #include <geos/geom/GeometryFactory.h>
 #include <geos/geom/CoordinateSequence.h>
+#include <geos/geom/Geometry.h>
 #include <string>
 
 // Forward declarations
@@ -34,7 +35,6 @@ class StringTokenizer;
 namespace geom {
 
 class Coordinate;
-class Geometry;
 class GeometryCollection;
 class Point;
 class LineString;
@@ -81,7 +81,7 @@ public:
     ~WKTReader();
 
     /// Parse a WKT string returning a Geometry
-    geom::Geometry* read(const std::string& wellKnownText);
+    std::unique_ptr<geom::Geometry> read(const std::string& wellKnownText);
 
 //	Geometry* read(Reader& reader);	//Not implemented yet
 
@@ -92,15 +92,15 @@ protected:
     std::string getNextCloserOrComma(io::StringTokenizer* tokenizer);
     std::string getNextCloser(io::StringTokenizer* tokenizer);
     std::string getNextWord(io::StringTokenizer* tokenizer);
-    geom::Geometry* readGeometryTaggedText(io::StringTokenizer* tokenizer);
-    geom::Point* readPointText(io::StringTokenizer* tokenizer);
-    geom::LineString* readLineStringText(io::StringTokenizer* tokenizer);
-    geom::LinearRing* readLinearRingText(io::StringTokenizer* tokenizer);
-    geom::MultiPoint* readMultiPointText(io::StringTokenizer* tokenizer);
-    geom::Polygon* readPolygonText(io::StringTokenizer* tokenizer);
-    geom::MultiLineString* readMultiLineStringText(io::StringTokenizer* tokenizer);
-    geom::MultiPolygon* readMultiPolygonText(io::StringTokenizer* tokenizer);
-    geom::GeometryCollection* readGeometryCollectionText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::Geometry> readGeometryTaggedText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::Point> readPointText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::LineString> readLineStringText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::LinearRing> readLinearRingText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::MultiPoint> readMultiPointText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::Polygon> readPolygonText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::MultiLineString> readMultiLineStringText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::MultiPolygon> readMultiPolygonText(io::StringTokenizer* tokenizer);
+    std::unique_ptr<geom::GeometryCollection> readGeometryCollectionText(io::StringTokenizer* tokenizer);
 private:
     const geom::GeometryFactory* geometryFactory;
     const geom::PrecisionModel* precisionModel;
diff --git a/src/io/WKBReader.cpp b/src/io/WKBReader.cpp
index 6b29aac..39abe92 100644
--- a/src/io/WKBReader.cpp
+++ b/src/io/WKBReader.cpp
@@ -127,7 +127,7 @@ ASCIIHexToUChar(char val)
 
 // Must be an even number of characters in the istream.
 // Throws a ParseException if there are an odd number of characters.
-Geometry*
+std::unique_ptr<Geometry>
 WKBReader::readHEX(istream& is)
 {
     // setup input/output stream
@@ -164,14 +164,14 @@ WKBReader::readHEX(istream& is)
     return this->read(os);
 }
 
-Geometry*
+std::unique_ptr<Geometry>
 WKBReader::read(istream& is)
 {
     dis.setInStream(&is); // will default to machine endian
     return readGeometry();
 }
 
-Geometry*
+std::unique_ptr<Geometry>
 WKBReader::readGeometry()
 {
     // determine byte order
@@ -237,29 +237,29 @@ WKBReader::readGeometry()
         ordValues.resize(inputDimension);
     }
 
-    Geometry* result;
+    std::unique_ptr<Geometry> result;
 
     switch(geometryType) {
     case WKBConstants::wkbPoint :
-        result = readPoint();
+        result.reset(readPoint().release());
         break;
     case WKBConstants::wkbLineString :
-        result = readLineString();
+        result.reset(readLineString().release());
         break;
     case WKBConstants::wkbPolygon :
-        result = readPolygon();
+        result.reset(readPolygon().release());
         break;
     case WKBConstants::wkbMultiPoint :
-        result = readMultiPoint();
+        result.reset(readMultiPoint().release());
         break;
     case WKBConstants::wkbMultiLineString :
-        result = readMultiLineString();
+        result.reset(readMultiLineString().release());
         break;
     case WKBConstants::wkbMultiPolygon :
-        result = readMultiPolygon();
+        result.reset(readMultiPolygon().release());
         break;
     case WKBConstants::wkbGeometryCollection :
-        result = readGeometryCollection();
+        result.reset(readGeometryCollection().release());
         break;
     default:
         stringstream err;
@@ -271,19 +271,19 @@ WKBReader::readGeometry()
     return result;
 }
 
-Point*
+std::unique_ptr<Point>
 WKBReader::readPoint()
 {
     readCoordinate();
     if(inputDimension == 3) {
-        return factory.createPoint(Coordinate(ordValues[0], ordValues[1], ordValues[2]));
+        return std::unique_ptr<Point>(factory.createPoint(Coordinate(ordValues[0], ordValues[1], ordValues[2])));
     }
     else {
-        return factory.createPoint(Coordinate(ordValues[0], ordValues[1]));
+        return std::unique_ptr<Point>(factory.createPoint(Coordinate(ordValues[0], ordValues[1])));
     }
 }
 
-LineString*
+std::unique_ptr<LineString>
 WKBReader::readLineString()
 {
     int size = dis.readInt();
@@ -291,10 +291,10 @@ WKBReader::readLineString()
     cout << "WKB npoints: " << size << endl;
 #endif
     auto pts = readCoordinateSequence(size);
-    return factory.createLineString(pts.release());
+    return std::unique_ptr<LineString>(factory.createLineString(pts.release()));
 }
 
-LinearRing*
+std::unique_ptr<LinearRing>
 WKBReader::readLinearRing()
 {
     int size = dis.readInt();
@@ -302,10 +302,10 @@ WKBReader::readLinearRing()
     cout << "WKB npoints: " << size << endl;
 #endif
     auto pts = readCoordinateSequence(size);
-    return factory.createLinearRing(pts.release());
+    return std::unique_ptr<LinearRing>(factory.createLinearRing(pts.release()));
 }
 
-Polygon*
+std::unique_ptr<Polygon>
 WKBReader::readPolygon()
 {
     int numRings = dis.readInt();
@@ -314,7 +314,7 @@ WKBReader::readPolygon()
     cout << "WKB numRings: " << numRings << endl;
 #endif
 
-    LinearRing* shell = nullptr;
+    std::unique_ptr<LinearRing> shell;
     if(numRings > 0) {
         shell = readLinearRing();
     }
@@ -324,7 +324,7 @@ WKBReader::readPolygon()
         try {
             holes = new vector<LinearRing*>(numRings - 1);
             for(int i = 0; i < numRings - 1; i++) {
-                (*holes)[i] = readLinearRing();
+                (*holes)[i] = readLinearRing().release();
             }
         }
         catch(...) {
@@ -332,14 +332,13 @@ WKBReader::readPolygon()
                 delete(*holes)[i];
             }
             delete holes;
-            delete shell;
             throw;
         }
     }
-    return factory.createPolygon(shell, holes);
+    return std::unique_ptr<Polygon>(factory.createPolygon(shell.release(), holes));
 }
 
-MultiPoint*
+std::unique_ptr<MultiPoint>
 WKBReader::readMultiPoint()
 {
     int numGeoms = dis.readInt();
@@ -347,13 +346,13 @@ WKBReader::readMultiPoint()
 
     try {
         for(int i = 0; i < numGeoms; i++) {
-            Geometry* g = readGeometry();
-            if(!dynamic_cast<Point*>(g)) {
+            auto g = readGeometry();
+            if(!dynamic_cast<Point*>(g.get())) {
                 stringstream err;
                 err << BAD_GEOM_TYPE_MSG << " MultiPoint";
                 throw ParseException(err.str());
             }
-            (*geoms)[i] = g;
+            (*geoms)[i] = g.release();
         }
     }
     catch(...) {
@@ -363,10 +362,10 @@ WKBReader::readMultiPoint()
         delete geoms;
         throw;
     }
-    return factory.createMultiPoint(geoms);
+    return std::unique_ptr<MultiPoint>(factory.createMultiPoint(geoms));
 }
 
-MultiLineString*
+std::unique_ptr<MultiLineString>
 WKBReader::readMultiLineString()
 {
     int numGeoms = dis.readInt();
@@ -374,13 +373,13 @@ WKBReader::readMultiLineString()
 
     try {
         for(int i = 0; i < numGeoms; i++) {
-            Geometry* g = readGeometry();
-            if(!dynamic_cast<LineString*>(g)) {
+            auto g = readGeometry();
+            if(!dynamic_cast<LineString*>(g.get())) {
                 stringstream err;
                 err << BAD_GEOM_TYPE_MSG << " LineString";
                 throw  ParseException(err.str());
             }
-            (*geoms)[i] = g;
+            (*geoms)[i] = g.release();
         }
     }
     catch(...) {
@@ -390,10 +389,10 @@ WKBReader::readMultiLineString()
         delete geoms;
         throw;
     }
-    return factory.createMultiLineString(geoms);
+    return std::unique_ptr<MultiLineString>(factory.createMultiLineString(geoms));
 }
 
-MultiPolygon*
+std::unique_ptr<MultiPolygon>
 WKBReader::readMultiPolygon()
 {
     int numGeoms = dis.readInt();
@@ -401,13 +400,13 @@ WKBReader::readMultiPolygon()
 
     try {
         for(int i = 0; i < numGeoms; i++) {
-            Geometry* g = readGeometry();
-            if(!dynamic_cast<Polygon*>(g)) {
+            auto g = readGeometry();
+            if(!dynamic_cast<Polygon*>(g.get())) {
                 stringstream err;
                 err << BAD_GEOM_TYPE_MSG << " Polygon";
                 throw  ParseException(err.str());
             }
-            (*geoms)[i] = g;
+            (*geoms)[i] = g.release();
         }
     }
     catch(...) {
@@ -417,10 +416,10 @@ WKBReader::readMultiPolygon()
         delete geoms;
         throw;
     }
-    return factory.createMultiPolygon(geoms);
+    return std::unique_ptr<MultiPolygon>(factory.createMultiPolygon(geoms));
 }
 
-GeometryCollection*
+std::unique_ptr<GeometryCollection>
 WKBReader::readGeometryCollection()
 {
     int numGeoms = dis.readInt();
@@ -428,7 +427,7 @@ WKBReader::readGeometryCollection()
 
     try {
         for(int i = 0; i < numGeoms; i++) {
-            (*geoms)[i] = (readGeometry());
+            (*geoms)[i] = readGeometry().release();
         }
     }
     catch(...) {
@@ -438,7 +437,7 @@ WKBReader::readGeometryCollection()
         delete geoms;
         throw;
     }
-    return factory.createGeometryCollection(geoms);
+    return std::unique_ptr<GeometryCollection>(factory.createGeometryCollection(geoms));
 }
 
 std::unique_ptr<CoordinateSequence>
diff --git a/src/io/WKTReader.cpp b/src/io/WKTReader.cpp
index 544fd38..7738c89 100644
--- a/src/io/WKTReader.cpp
+++ b/src/io/WKTReader.cpp
@@ -59,15 +59,12 @@ using namespace geos::geom;
 namespace geos {
 namespace io { // geos.io
 
-Geometry*
+std::unique_ptr<Geometry>
 WKTReader::read(const string& wellKnownText)
 {
-    //unique_ptr<StringTokenizer> tokenizer(new StringTokenizer(wellKnownText));
     CLocalizer clocale;
     StringTokenizer tokenizer(wellKnownText);
-    Geometry* g = nullptr;
-    g = readGeometryTaggedText(&tokenizer);
-    return g;
+    return readGeometryTaggedText(&tokenizer);
 }
 
 std::unique_ptr<CoordinateSequence>
@@ -77,7 +74,6 @@ WKTReader::getCoordinates(StringTokenizer* tokenizer)
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
         return geometryFactory->getCoordinateSequenceFactory()->create();
-        //new CoordinateArraySequence();
     }
 
     Coordinate coord;
@@ -219,76 +215,76 @@ WKTReader::getNextWord(StringTokenizer* tokenizer)
     return "";
 }
 
-Geometry*
+std::unique_ptr<Geometry>
 WKTReader::readGeometryTaggedText(StringTokenizer* tokenizer)
 {
     string type = getNextWord(tokenizer);
     if(type == "POINT") {
-        return readPointText(tokenizer);
+        return std::unique_ptr<Geometry>(readPointText(tokenizer).release());
     }
     else if(type == "LINESTRING") {
-        return readLineStringText(tokenizer);
+        return std::unique_ptr<Geometry>(readLineStringText(tokenizer));
     }
     else if(type == "LINEARRING") {
-        return readLinearRingText(tokenizer);
+        return std::unique_ptr<Geometry>(readLinearRingText(tokenizer));
     }
     else if(type == "POLYGON") {
-        return readPolygonText(tokenizer);
+        return std::unique_ptr<Geometry>(readPolygonText(tokenizer));
     }
     else if(type == "MULTIPOINT") {
-        return readMultiPointText(tokenizer);
+        return std::unique_ptr<Geometry>(readMultiPointText(tokenizer));
     }
     else if(type == "MULTILINESTRING") {
-        return readMultiLineStringText(tokenizer);
+        return std::unique_ptr<Geometry>(readMultiLineStringText(tokenizer));
     }
     else if(type == "MULTIPOLYGON") {
-        return readMultiPolygonText(tokenizer);
+        return std::unique_ptr<Geometry>(readMultiPolygonText(tokenizer));
     }
     else if(type == "GEOMETRYCOLLECTION") {
-        return readGeometryCollectionText(tokenizer);
+        return std::unique_ptr<Geometry>(readGeometryCollectionText(tokenizer));
     }
     throw  ParseException("Unknown type", type);
 }
 
-Point*
+std::unique_ptr<Point>
 WKTReader::readPointText(StringTokenizer* tokenizer)
 {
     size_t dim;
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createPoint(Coordinate::getNull());
+        return std::unique_ptr<Point>(geometryFactory->createPoint(Coordinate::getNull()));
     }
 
     Coordinate coord;
     getPreciseCoordinate(tokenizer, coord, dim);
     getNextCloser(tokenizer);
 
-    return geometryFactory->createPoint(coord);
+    return std::unique_ptr<Point>(geometryFactory->createPoint(coord));
 }
 
-LineString*
+std::unique_ptr<LineString>
 WKTReader::readLineStringText(StringTokenizer* tokenizer)
 {
     auto coords = getCoordinates(tokenizer);
     LineString* ret = geometryFactory->createLineString(coords.release());
-    return ret;
+    return std::unique_ptr<LineString>(ret);
 }
 
-LinearRing*
+std::unique_ptr<LinearRing>
 WKTReader::readLinearRingText(StringTokenizer* tokenizer)
 {
     auto coords = getCoordinates(tokenizer);
     LinearRing* ret;
     ret = geometryFactory->createLinearRing(coords.release());
-    return ret;
+    return std::unique_ptr<LinearRing>(ret);
 }
 
-MultiPoint*
+std::unique_ptr<MultiPoint>
 WKTReader::readMultiPointText(StringTokenizer* tokenizer)
 {
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createMultiPoint();
+        return std::unique_ptr<MultiPoint>(geometryFactory->createMultiPoint());
     }
 
     int tok = tokenizer->peekNextToken();
@@ -307,8 +303,7 @@ WKTReader::readMultiPointText(StringTokenizer* tokenizer)
         }
         while(nextToken == ",");
 
-        MultiPoint* ret = geometryFactory->createMultiPoint(*coords);
-        return ret;
+        return std::unique_ptr<MultiPoint>(geometryFactory->createMultiPoint(*coords));
     }
 
     else if(tok == '(') {
@@ -316,12 +311,12 @@ WKTReader::readMultiPointText(StringTokenizer* tokenizer)
         vector<Geometry*>* points = new vector<Geometry*>();
         try {
             do {
-                Point* point = readPointText(tokenizer);
-                points->push_back(point);
+                auto point = readPointText(tokenizer);
+                points->push_back(point.release());
                 nextToken = getNextCloserOrComma(tokenizer);
             }
             while(nextToken == ",");
-            return geometryFactory->createMultiPoint(points);
+            return std::unique_ptr<MultiPoint>(geometryFactory->createMultiPoint(points));
         }
         catch(...) {
             // clean up
@@ -365,58 +360,52 @@ WKTReader::readMultiPointText(StringTokenizer* tokenizer)
     }
 }
 
-Polygon*
+std::unique_ptr<Polygon>
 WKTReader::readPolygonText(StringTokenizer* tokenizer)
 {
     Polygon* poly = nullptr;
-    LinearRing* shell = nullptr;
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createPolygon(nullptr, nullptr);
+        return std::unique_ptr<Polygon>(geometryFactory->createPolygon(nullptr, nullptr));
     }
 
     vector<LinearRing*>* holes = new vector<LinearRing*>();
     try {
-        shell = readLinearRingText(tokenizer);
+        auto shell = readLinearRingText(tokenizer);
         nextToken = getNextCloserOrComma(tokenizer);
         while(nextToken == ",") {
-            LinearRing* hole = readLinearRingText(tokenizer);
-            holes->push_back(hole);
+            auto hole = readLinearRingText(tokenizer);
+            holes->push_back(hole.release());
             nextToken = getNextCloserOrComma(tokenizer);
         }
-        poly = geometryFactory->createPolygon(shell, holes);
+        poly = geometryFactory->createPolygon(shell.get(), holes);
+        shell.release(); // release separately because Polygon constructor may throw
     }
     catch(...) {
         for(unsigned int i = 0; i < holes->size(); i++) {
             delete(*holes)[i];
         }
         delete holes;
-        delete shell;
         throw;
     }
-    return poly;
+    return std::unique_ptr<Polygon>(poly);
 }
 
-MultiLineString*
+std::unique_ptr<MultiLineString>
 WKTReader::readMultiLineStringText(StringTokenizer* tokenizer)
 {
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createMultiLineString(nullptr);
+        return std::unique_ptr<MultiLineString>(geometryFactory->createMultiLineString(nullptr));
     }
     vector<Geometry*>* lineStrings = new vector<Geometry*>();
-    LineString* lineString = nullptr;
+    std::unique_ptr<LineString> lineString;
     try {
-        lineString = readLineStringText(tokenizer);
-        lineStrings->push_back(lineString);
-        lineString = nullptr;
-        nextToken = getNextCloserOrComma(tokenizer);
-        while(nextToken == ",") {
+        do {
             lineString = readLineStringText(tokenizer);
-            lineStrings->push_back(lineString);
-            lineString = nullptr;
+            lineStrings->push_back(lineString.release());
             nextToken = getNextCloserOrComma(tokenizer);
-        }
+        } while (nextToken == ",");
     }
     catch(...) {
         for(size_t i = 0; i < lineStrings->size(); i++) {
@@ -426,31 +415,24 @@ WKTReader::readMultiLineStringText(StringTokenizer* tokenizer)
         throw;
     }
     MultiLineString* ret = geometryFactory->createMultiLineString(lineStrings);
-    //for (int i=0; i<lineStrings->size(); i++) delete (*lineStrings)[i];
-    //delete lineStrings;
-    return ret;
+    return std::unique_ptr<MultiLineString>(ret);
 }
 
-MultiPolygon*
+std::unique_ptr<MultiPolygon>
 WKTReader::readMultiPolygonText(StringTokenizer* tokenizer)
 {
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createMultiPolygon(nullptr);
+        return std::unique_ptr<MultiPolygon>(geometryFactory->createMultiPolygon(nullptr));
     }
     vector<Geometry*>* polygons = new vector<Geometry*>();
-    Polygon* polygon = nullptr;
+    std::unique_ptr<Polygon> polygon;
     try {
-        polygon = readPolygonText(tokenizer);
-        polygons->push_back(polygon);
-        polygon = nullptr;
-        nextToken = getNextCloserOrComma(tokenizer);
-        while(nextToken == ",") {
+        do {
             polygon = readPolygonText(tokenizer);
-            polygons->push_back(polygon);
-            polygon = nullptr;
+            polygons->push_back(polygon.release());
             nextToken = getNextCloserOrComma(tokenizer);
-        }
+        } while(nextToken == ",");
     }
     catch(...) {
         for(size_t i = 0; i < polygons->size(); i++) {
@@ -460,31 +442,24 @@ WKTReader::readMultiPolygonText(StringTokenizer* tokenizer)
         throw;
     }
     MultiPolygon* ret = geometryFactory->createMultiPolygon(polygons);
-    //for (int i=0; i<polygons->size(); i++) delete (*polygons)[i];
-    //delete polygons;
-    return ret;
+    return std::unique_ptr<MultiPolygon>(ret);
 }
 
-GeometryCollection*
+std::unique_ptr<GeometryCollection>
 WKTReader::readGeometryCollectionText(StringTokenizer* tokenizer)
 {
     string nextToken = getNextEmptyOrOpener(tokenizer);
     if(nextToken == "EMPTY") {
-        return geometryFactory->createGeometryCollection(nullptr);
+        return std::unique_ptr<GeometryCollection>(geometryFactory->createGeometryCollection(nullptr));
     }
     vector<Geometry*>* geoms = new vector<Geometry*>();
-    Geometry* geom = nullptr;
+    std::unique_ptr<Geometry> geom;
     try {
-        geom = readGeometryTaggedText(tokenizer);
-        geoms->push_back(geom);
-        geom = nullptr;
-        nextToken = getNextCloserOrComma(tokenizer);
-        while(nextToken == ",") {
+        do {
             geom = readGeometryTaggedText(tokenizer);
-            geoms->push_back(geom);
-            geom = nullptr;
+            geoms->push_back(geom.release());
             nextToken = getNextCloserOrComma(tokenizer);
-        }
+        } while(nextToken == ",");
     }
     catch(...) {
         for(size_t i = 0; i < geoms->size(); i++) {
@@ -494,9 +469,7 @@ WKTReader::readGeometryCollectionText(StringTokenizer* tokenizer)
         throw;
     }
     GeometryCollection* ret = geometryFactory->createGeometryCollection(geoms);
-    //for (int i=0; i<geoms->size(); i++) delete (*geoms)[i];
-    //delete geoms;
-    return ret;
+    return std::unique_ptr<GeometryCollection>(ret);
 }
 
 } // namespace geos.io
diff --git a/tests/unit/algorithm/InteriorPointAreaTest.cpp b/tests/unit/algorithm/InteriorPointAreaTest.cpp
index 32cd3c8..4b30808 100644
--- a/tests/unit/algorithm/InteriorPointAreaTest.cpp
+++ b/tests/unit/algorithm/InteriorPointAreaTest.cpp
@@ -66,7 +66,7 @@ void object::test<1>
 
     // invalid polygon - classic hourglass-shape with a self intersection
     // without a node
-    geom.reset(reader.read("POLYGON((6 54, 15 54, 6 47, 15 47, 6 54))"));
+    geom = reader.read("POLYGON((6 54, 15 54, 6 47, 15 47, 6 54))");
 
     InteriorPointArea interiorPointArea(geom.get());
     interiorPointArea.getInteriorPoint(result);
diff --git a/tests/unit/algorithm/MinimumBoundingCircleTest.cpp b/tests/unit/algorithm/MinimumBoundingCircleTest.cpp
index 17176b1..076e88b 100644
--- a/tests/unit/algorithm/MinimumBoundingCircleTest.cpp
+++ b/tests/unit/algorithm/MinimumBoundingCircleTest.cpp
@@ -55,14 +55,14 @@ struct test_minimumboundingcircle_data {
                                 geos::geom::Coordinate& centreOut, double radiusOut)
     {
 
-        geom.reset(reader.read(wktIn));
+        geom = reader.read(wktIn);
         MinimumBoundingCircle mbc(geom.get());
         std::vector<Coordinate> exPts = mbc.getExtremalPoints();
         std::unique_ptr<Geometry> actual(geomFact->createMultiPoint(exPts));
         double actualRadius = mbc.getRadius();
         geos::geom::Coordinate actualCentre = mbc.getCentre();
 
-        geomOut.reset(reader.read(wktOut));
+        geomOut = reader.read(wktOut);
         bool isEqual = actual->equals(geomOut.get());
 
         // need this hack because apparently equals does not work for MULTIPOINT EMPTY
diff --git a/tests/unit/capi/GEOSContainsTest.cpp b/tests/unit/capi/GEOSContainsTest.cpp
index 4b54e4c..d06ce2e 100644
--- a/tests/unit/capi/GEOSContainsTest.cpp
+++ b/tests/unit/capi/GEOSContainsTest.cpp
@@ -141,9 +141,9 @@ void object::test<4>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
 
@@ -162,9 +162,9 @@ void object::test<4>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
 
@@ -199,9 +199,9 @@ void object::test<5>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
 
@@ -221,9 +221,9 @@ void object::test<5>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
 
diff --git a/tests/unit/capi/GEOSPreparedGeometryTest.cpp b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
index 918d29a..ca760b9 100644
--- a/tests/unit/capi/GEOSPreparedGeometryTest.cpp
+++ b/tests/unit/capi/GEOSPreparedGeometryTest.cpp
@@ -237,9 +237,9 @@ void object::test<8>
     std::string
     line("0102000000070000009909bf203f1f37c05c1d66d6954249404afe386d871d37c0a7eb1124b54149409c266328061c37c056d8bff5db42494098266328061c37c0034f7b5c2a42494060065c5aa01837c08ac001de3a4449408401b189bb1637c0b04e471a4f43494014ef84a6d11537c0b20dabfb62434940");
     std::stringstream sPoint(point);
-    geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sPoint));
+    geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sPoint).release());
     std::stringstream sLine(line);
-    geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sLine));
+    geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sLine).release());
 
     prepGeom1_ = GEOSPrepare(geom1_);
     ensure(nullptr != prepGeom1_);
@@ -289,9 +289,9 @@ void object::test<10>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
         prepGeom1_ = GEOSPrepare(geom1_);
@@ -314,9 +314,9 @@ void object::test<10>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
         prepGeom1_ = GEOSPrepare(geom1_);
@@ -353,9 +353,9 @@ void object::test<11>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
         prepGeom1_ = GEOSPrepare(geom1_);
@@ -378,9 +378,9 @@ void object::test<11>
         geos::io::WKBReader reader(*factory);
 
         std::istringstream sOuter(outer);
-        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter));
+        geom1_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sOuter).release());
         std::istringstream sInner(inner);
-        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner));
+        geom2_ = reinterpret_cast<GEOSGeometry*>(reader.readHEX(sInner).release());
         ensure(nullptr != geom1_);
         ensure(nullptr != geom2_);
         prepGeom1_ = GEOSPrepare(geom1_);
diff --git a/tests/unit/geom/Geometry/coversTest.cpp b/tests/unit/geom/Geometry/coversTest.cpp
index 8134892..75d2128 100644
--- a/tests/unit/geom/Geometry/coversTest.cpp
+++ b/tests/unit/geom/Geometry/coversTest.cpp
@@ -94,9 +94,7 @@ void object::test<3>
     ensure(g2->coveredBy(g1.get()));
     ensure(! g1->contains(g2.get()));
 
-    g2.reset(reader.read(
-                 "POINT(0 2)"
-             ));
+    g2 = reader.read("POINT(0 2)");
 
     ensure(g1->covers(g2.get()));
     ensure(g2->coveredBy(g1.get()));
diff --git a/tests/unit/geom/Geometry/isRectangleTest.cpp b/tests/unit/geom/Geometry/isRectangleTest.cpp
index 0572c0c..89f90b1 100644
--- a/tests/unit/geom/Geometry/isRectangleTest.cpp
+++ b/tests/unit/geom/Geometry/isRectangleTest.cpp
@@ -38,13 +38,11 @@ void object::test<1>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(poly->isRectangle());
-
-    delete g;
 }
 
 // 2 - Test of another valid rectangle
@@ -54,13 +52,11 @@ void object::test<2>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 200, 100 200, 100 0, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(poly->isRectangle());
-
-    delete g;
 }
 
 // 3 - Test of rectangle with hole
@@ -71,13 +67,11 @@ void object::test<3>
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 100 100, 100 0, 0 0), \
                               (10 10, 10 90, 90 90, 90 10, 10 10) ))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(!poly->isRectangle());
-
-    delete g;
 }
 
 // 4 - Test of non-rectilinear rectangle
@@ -87,13 +81,11 @@ void object::test<4>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 99 100, 100 0, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(!poly->isRectangle());
-
-    delete g;
 }
 
 // 5 - Test of rectangle with too many points
@@ -103,13 +95,11 @@ void object::test<5>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 100 50, 100 100, 100 0, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(!poly->isRectangle());
-
-    delete g;
 }
 
 // 6 - Test of rectangle with too few points
@@ -119,13 +109,11 @@ void object::test<6>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 100 0, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(!poly->isRectangle());
-
-    delete g;
 }
 
 // 7 - Test of rectangle with points in wrong order
@@ -135,13 +123,11 @@ void object::test<7>
 ()
 {
     const std::string wkt("POLYGON ((0 0, 0 100, 100 0, 100 100, 0 0))");
-    geos::geom::Geometry* g = reader.read(wkt);
+    auto g = reader.read(wkt);
 
-    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g);
+    geos::geom::Polygon* poly = dynamic_cast<geos::geom::Polygon*>(g.get());
     ensure("Geometry is not a Polygon: " + wkt, poly != nullptr);
     ensure(!poly->isRectangle());
-
-    delete g;
 }
 
 } // namespace tut
diff --git a/tests/unit/geom/GeometryFactoryTest.cpp b/tests/unit/geom/GeometryFactoryTest.cpp
index 255d92e..8bf5085 100644
--- a/tests/unit/geom/GeometryFactoryTest.cpp
+++ b/tests/unit/geom/GeometryFactoryTest.cpp
@@ -760,10 +760,10 @@ void object::test<20>
     ensure(exterior->getLength() != 0.0);
 
     // Create collection of holes
-    GeometryPtr geo = reader_.read(("LINEARRING(7 7, 12 7, 12 12, 7 12, 7 7)"));
+    auto geo = reader_.read(("LINEARRING(7 7, 12 7, 12 12, 7 12, 7 7)"));
     ensure(geo != nullptr);
 
-    LinearRingPtr hole = dynamic_cast<LinearRingPtr>(geo);
+    LinearRingPtr hole = dynamic_cast<LinearRingPtr>(geo.release());
     ensure(hole != nullptr);
     ensure(hole->isRing());
     ensure_equals(hole->getNumPoints(), interiorSize);
diff --git a/tests/unit/geom/LineStringTest.cpp b/tests/unit/geom/LineStringTest.cpp
index a04cbd1..d80397b 100644
--- a/tests/unit/geom/LineStringTest.cpp
+++ b/tests/unit/geom/LineStringTest.cpp
@@ -320,19 +320,16 @@ template<>
 void object::test<15>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
-    LineStringPtr line = dynamic_cast<LineStringPtr>(geo);
+    LineStringPtr line = dynamic_cast<LineStringPtr>(geo.get());
     ensure(line != nullptr);
 
     ensure(!line->isEmpty());
     ensure(!line->isClosed());
     ensure(!line->isRing());
     ensure(line->getCoordinateDimension() == 2);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(line);
 }
 
 // Test of getEnvelope() for non-empty linestring
@@ -341,19 +338,16 @@ template<>
 void object::test<16>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
-    LineStringPtr line = dynamic_cast<LineStringPtr>(geo);
+    LineStringPtr line = dynamic_cast<LineStringPtr>(geo.get());
     ensure(line != nullptr);
 
     auto envelope = line->getEnvelope();
     ensure(envelope != nullptr);
     ensure(!envelope->isEmpty());
     ensure_equals(envelope->getDimension(), geos::geom::Dimension::A);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(line);
 }
 
 // Test of getBoundary() for non-empty linestring
@@ -362,10 +356,10 @@ template<>
 void object::test<17>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
-    LineStringPtr line = dynamic_cast<LineStringPtr>(geo);
+    LineStringPtr line = dynamic_cast<LineStringPtr>(geo.get());
     ensure(line != nullptr);
 
     auto boundary = line->getBoundary();
@@ -373,9 +367,6 @@ void object::test<17>
     ensure(!boundary->isEmpty());
     ensure_equals(boundary->getGeometryTypeId(), geos::geom::GEOS_MULTIPOINT);
     ensure_equals(boundary->getDimension(), geos::geom::Dimension::P);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(line);
 }
 
 // Test of convexHull() for non-empty linestring
@@ -384,10 +375,10 @@ template<>
 void object::test<18>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
-    LineStringPtr line = dynamic_cast<LineStringPtr>(geo);
+    LineStringPtr line = dynamic_cast<LineStringPtr>(geo.get());
     ensure(line != nullptr);
 
     auto hull = line->convexHull();
@@ -395,9 +386,6 @@ void object::test<18>
     ensure(!hull->isEmpty());
     ensure_equals(hull->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
     ensure_equals(hull->getDimension(), geos::geom::Dimension::A);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(line);
 }
 
 // Test of getGeometryTypeId() for non-empty linestring
@@ -406,13 +394,10 @@ template<>
 void object::test<19>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
     ensure_equals(geo->getGeometryTypeId(), geos::geom::GEOS_LINESTRING);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
 // Test of getDimension() for non-empty linestring
@@ -421,13 +406,10 @@ template<>
 void object::test<20>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
     ensure_equals(geo->getDimension(), geos::geom::Dimension::L);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
 // Test of getBoundaryDimension() for non-empty linestring
@@ -436,13 +418,10 @@ template<>
 void object::test<21>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
     ensure_equals(geo->getBoundaryDimension(), geos::geom::Dimension::P);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
 // Test of getNumPoints() for non-empty linestring
@@ -452,13 +431,10 @@ void object::test<22>
 ()
 {
     const size_t size = 4;
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
+    auto geo = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(geo != nullptr);
 
     ensure_equals(geo->getNumPoints(), size);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
 // Test of getLength() for non-empty linestring
@@ -469,16 +445,13 @@ void object::test<23>
 {
     const double tolerance = 0.0001;
     const double expected = 2 * 14.142135600000000;
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
+    auto geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
     ensure(geo != nullptr);
 
     ensure(geo->getLength() != 0.0);
 
     const double diff = std::fabs(geo->getLength() - expected);
     ensure(diff <= tolerance);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
 // Test of getArea() for non-empty linestring
@@ -487,29 +460,23 @@ template<>
 void object::test<24>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
+    auto geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
     ensure(geo != nullptr);
 
     ensure_equals(geo->getArea(), 0.0);
-
-    // FREE TESTED LINESTRING
-    factory_->destroyGeometry(geo);
 }
 
-// Test of getGeometryType() for non-empty Polygon
+// Test of getGeometryType() for non-empty LineString
 template<>
 template<>
 void object::test<25>
 ()
 {
-    GeometryPtr geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
+    auto geo = reader_.read("LINESTRING (0 0, 10 10, 20 0)");
     ensure(geo != nullptr);
 
     const std::string type("LineString");
     ensure_equals(geo->getGeometryType(), type);
-
-    // FREE MEMORY
-    factory_->destroyGeometry(geo);
 }
 
 template<>
diff --git a/tests/unit/geom/LinearRingTest.cpp b/tests/unit/geom/LinearRingTest.cpp
index 9a912d7..8bfb1af 100644
--- a/tests/unit/geom/LinearRingTest.cpp
+++ b/tests/unit/geom/LinearRingTest.cpp
@@ -53,7 +53,7 @@ struct test_linearring_data {
     {
         // Create non-empty LinearRing
         GeometryPtr geo = nullptr;
-        geo = reader_.read("LINEARRING(0 10, 5 5, 10 5, 15 10, 10 15, 5 15, 0 10)");
+        geo = reader_.read("LINEARRING(0 10, 5 5, 10 5, 15 10, 10 15, 5 15, 0 10)").release();
         ring_ = dynamic_cast<LinearRingPtr>(geo);
     }
 
@@ -396,12 +396,8 @@ void object::test<28>
 ()
 {
     try {
-        GeometryPtr geo = reader_.read("LINEARRING(0 0, 5 5, 10 10)");
+        auto geo = reader_.read("LINEARRING(0 0, 5 5, 10 10)");
         ensure(geo != nullptr);
-
-        // FREE TESTED LINEARRING
-        factory_->destroyGeometry(geo);
-
         fail("IllegalArgumentException expected.");
     }
     catch(geos::util::IllegalArgumentException const& e) {
@@ -410,7 +406,7 @@ void object::test<28>
     }
 }
 
-// TTest of exception thrown when constructing a self-intersecting LinearRing
+// Test of exception thrown when constructing a self-intersecting LinearRing
 template<>
 template<>
 void object::test<29>
@@ -418,17 +414,14 @@ void object::test<29>
 {
     try {
         // Construct LinearRing self-intersecting in point (5,5)
-        GeometryPtr geo = reader_.read("LINEARRING(0 0, 5 5, 10 10, 15 5, 5 5, 0 10)");
+        auto geo = reader_.read("LINEARRING(0 0, 5 5, 10 10, 15 5, 5 5, 0 10)");
         ensure(geo != nullptr);
 
-        LinearRingPtr ring = dynamic_cast<LinearRingPtr>(geo);
+        LinearRingPtr ring = dynamic_cast<LinearRingPtr>(geo.get());
         ensure(ring != nullptr);
 
         ensure(!ring->isValid());
 
-        // FREE TESTED LINEARRING
-        factory_->destroyGeometry(geo);
-
         fail("IllegalArgumentException expected.");
     }
     catch(geos::util::IllegalArgumentException const& e) {
diff --git a/tests/unit/geom/MultiPointTest.cpp b/tests/unit/geom/MultiPointTest.cpp
index a2bace0..67c68d3 100644
--- a/tests/unit/geom/MultiPointTest.cpp
+++ b/tests/unit/geom/MultiPointTest.cpp
@@ -40,9 +40,8 @@ struct test_multipoint_data {
         , empty_mp_(factory_->createMultiPoint()), mp_size_(5)
     {
         // Create non-empty MultiPoint
-        GeometryPtr geo = nullptr;
-        geo = reader_.read("MULTIPOINT(0 0, 5 5, 10 10, 15 15, 20 20)");
-        mp_ = dynamic_cast<MultiPointPtr>(geo);
+        auto geo = reader_.read("MULTIPOINT(0 0, 5 5, 10 10, 15 15, 20 20)");
+        mp_ = dynamic_cast<MultiPointPtr>(geo.release());
     }
 
     ~test_multipoint_data()
@@ -107,8 +106,8 @@ void object::test<3>
 ()
 {
     const size_t size0 = 0;
-    GeometryPtr geo = reader_.read("MULTIPOINT EMPTY");
-    MultiPointPtr mp = dynamic_cast<MultiPointPtr>(geo);
+    auto geo = reader_.read("MULTIPOINT EMPTY");
+    MultiPointPtr mp = dynamic_cast<MultiPointPtr>(geo.get());
 
     ensure(mp->isEmpty());
     ensure(mp->isSimple());
@@ -116,9 +115,6 @@ void object::test<3>
     ensure(mp->getCentroid() == nullptr);
     ensure_equals(mp->getNumPoints(), size0);
     ensure_equals(mp->getNumGeometries(), size0);
-
-    // FREE MEMORY
-    factory_->destroyGeometry(geo);
 }
 
 // Test of isEmpty() for empty MultiPoint
@@ -378,12 +374,9 @@ void object::test<28>
 ()
 {
     try {
-        GeometryPtr geo = reader_.read("MULTIPOINT(0 0, 5)");
+        auto geo = reader_.read("MULTIPOINT(0 0, 5)");
         ensure(geo != nullptr);
 
-        // FREE TESTED LINEARRING
-        factory_->destroyGeometry(geo);
-
         fail("ParseException expected.");
     }
     catch(geos::io::ParseException const& e) {
diff --git a/tests/unit/geom/PointTest.cpp b/tests/unit/geom/PointTest.cpp
index a935f42..f6e7ec1 100644
--- a/tests/unit/geom/PointTest.cpp
+++ b/tests/unit/geom/PointTest.cpp
@@ -47,9 +47,8 @@ struct test_point_data {
         , reader_(factory_.get()), empty_point_(factory_->createPoint())
     {
         // Create non-empty Point
-        GeometryPtr geo = nullptr;
-        geo = reader_.read("POINT(1.234 5.678)");
-        point_ = dynamic_cast<PointPtr>(geo);
+        auto geo = reader_.read("POINT(1.234 5.678)");
+        point_ = dynamic_cast<PointPtr>(geo.release());
     }
 
     ~test_point_data()
@@ -404,15 +403,10 @@ template<>
 void object::test<32>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.234 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(1.234 5.678)");
+    auto p1 = reader_.read("POINT(1.234 5.678)");
+    auto p2 = reader_.read("POINT(1.234 5.678)");
 
-    // WARNING! If test fails, memory leaks occur.
-    ensure(p1->equals(p2));
-
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Point (1.23 5.67)
@@ -421,15 +415,10 @@ template<>
 void object::test<33>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.23 5.67)");
-    GeometryPtr p2 = reader_.read("POINT(1.23 5.67)");
-
-    // WARNING! If test fails, memory leaks occur.
-    ensure(p1->equals(p2));
+    auto p1 = reader_.read("POINT(1.23 5.67)");
+    auto p2 = reader_.read("POINT(1.23 5.67)");
 
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points (1.235 5.678) and (1.234 5.678)
@@ -438,15 +427,10 @@ template<>
 void object::test<34>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.235 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(1.234 5.678)");
-
-    // WARNING! If test fails, memory leaks occur.
-    ensure(!p1->equals(p2));
+    auto p1 = reader_.read("POINT(1.235 5.678)");
+    auto p2 = reader_.read("POINT(1.234 5.678)");
 
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(!p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points (1.2334 5.678) and (1.2333 5.678)
@@ -455,15 +439,10 @@ template<>
 void object::test<35>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.2334 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(1.2333 5.678)");
+    auto p1 = reader_.read("POINT(1.2334 5.678)");
+    auto p2 = reader_.read("POINT(1.2333 5.678)");
 
-    // WARNING! If test fails, memory leaks occur.
-    ensure(p1->equals(p2));
-
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points (1.2334 5.678) and (1.2335 5.678)
@@ -472,15 +451,10 @@ template<>
 void object::test<36>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.2334 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(1.2335 5.678)");
-
-    // WARNING! If test fails, memory leaks occur.
-    ensure(!p1->equals(p2));
+    auto p1 = reader_.read("POINT(1.2334 5.678)");
+    auto p2 = reader_.read("POINT(1.2335 5.678)");
 
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(!p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points (1.2324 5.678) and (1.2325 5.678)
@@ -489,15 +463,10 @@ template<>
 void object::test<37>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.2324 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(1.2325 5.678)");
+    auto p1 = reader_.read("POINT(1.2324 5.678)");
+    auto p2 = reader_.read("POINT(1.2325 5.678)");
 
-    // WARNING! If test fails, memory leaks occur.
-    ensure(!p1->equals(p2));
-
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(!p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points (1.2324 5.678) and (EMPTY)
@@ -506,15 +475,10 @@ template<>
 void object::test<38>
 ()
 {
-    GeometryPtr p1 = reader_.read("POINT(1.2324 5.678)");
-    GeometryPtr p2 = reader_.read("POINT EMPTY");
-
-    // WARNING! If test fails, memory leaks occur.
-    ensure(!p1->equals(p2));
+    auto p1 = reader_.read("POINT(1.2324 5.678)");
+    auto p2 = reader_.read("POINT EMPTY");
 
-    // FREE MEMORY
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
+    ensure(!p1->equals(p2.get()));
 }
 
 // Test of equals() for non-empty Points with negative coordiantes
@@ -523,26 +487,19 @@ template<>
 void object::test<39>
 ()
 {
-    GeometryPtr pLo = reader_.read("POINT(-1.233 5.678)");
-    GeometryPtr pHi = reader_.read("POINT(-1.232 5.678)");
-
-    GeometryPtr p1 = reader_.read("POINT(-1.2326 5.678)");
-    GeometryPtr p2 = reader_.read("POINT(-1.2325 5.678)");
-    GeometryPtr p3 = reader_.read("POINT(-1.2324 5.678)");
+    auto pLo = reader_.read("POINT(-1.233 5.678)");
+    auto pHi = reader_.read("POINT(-1.232 5.678)");
 
-    ensure(!p1->equals(p2));
-    ensure(p3->equals(p2));
+    auto p1 = reader_.read("POINT(-1.2326 5.678)");
+    auto p2 = reader_.read("POINT(-1.2325 5.678)");
+    auto p3 = reader_.read("POINT(-1.2324 5.678)");
 
-    ensure(p1->equals(pLo));
-    ensure(p2->equals(pHi));
-    ensure(p3->equals(pHi));
+    ensure(!p1->equals(p2.get()));
+    ensure(p3->equals(p2.get()));
 
-    // FREE MEMORY
-    factory_->destroyGeometry(pLo);
-    factory_->destroyGeometry(pHi);
-    factory_->destroyGeometry(p1);
-    factory_->destroyGeometry(p2);
-    factory_->destroyGeometry(p3);
+    ensure(p1->equals(pLo.get()));
+    ensure(p2->equals(pHi.get()));
+    ensure(p3->equals(pHi.get()));
 }
 
 // Test of getCoordinateDimension() for 2d/3d.
@@ -551,17 +508,13 @@ template<>
 void object::test<40>
 ()
 {
-    GeometryPtr p = reader_.read("POINT(-1.233 5.678 1.0)");
+    auto p = reader_.read("POINT(-1.233 5.678 1.0)");
 
     ensure(p->getCoordinateDimension() == 3);
 
-    delete p;
-
     p = reader_.read("POINT(-1.233 5.678)");
 
     ensure(p->getCoordinateDimension() == 2);
-
-    delete p;
 }
 
 template<>
diff --git a/tests/unit/geom/PolygonTest.cpp b/tests/unit/geom/PolygonTest.cpp
index 21f3279..c164b12 100644
--- a/tests/unit/geom/PolygonTest.cpp
+++ b/tests/unit/geom/PolygonTest.cpp
@@ -39,7 +39,7 @@ struct test_polygon_data {
     geos::io::WKTReader reader_;
 
     PolygonAutoPtr empty_poly_;
-    PolygonPtr poly_;
+    PolygonAutoPtr poly_;
     const size_t poly_size_;
 
     test_polygon_data()
@@ -48,16 +48,9 @@ struct test_polygon_data {
         , reader_(factory_.get())
         , empty_poly_(factory_->createPolygon()), poly_size_(7)
     {
-        // Create non-empty LinearRing
-        GeometryPtr geo = nullptr;
-        geo = reader_.read("POLYGON((0 10, 5 5, 10 5, 15 10, 10 15, 5 15, 0 10))");
-        poly_ = dynamic_cast<PolygonPtr>(geo);
-    }
-
-    ~test_polygon_data()
-    {
-        // FREE MEMORY
-        factory_->destroyGeometry(poly_);
+        // Create non-empty Polygon
+        auto geo = reader_.read("POLYGON((0 10, 5 5, 10 5, 15 10, 10 15, 5 15, 0 10))");
+        poly_.reset(dynamic_cast<PolygonPtr>(geo.release()));
     }
 
 private:
@@ -402,11 +395,9 @@ void object::test<27>
 {
     ensure(poly_ != nullptr);
 
-    GeometryPtr geo = poly_->clone().release();
+    auto geo = poly_->clone();
     ensure(geo != nullptr);
-    ensure(geo->equals(poly_));
-
-    factory_->destroyGeometry(geo);
+    ensure(geo->equals(poly_.get()));
 }
 
 // Test of getExteriorRing() for non-empty Polygon
@@ -441,12 +432,11 @@ void object::test<30>
 {
     const size_t holesNum = 1;
 
-    GeometryPtr geo = nullptr;
-    geo = reader_.read("POLYGON ((0 0, 100 0, 100 100, 0 100, 0 0), (1 1, 1 10, 10 10, 10 1, 1 1) )");
+    auto geo = reader_.read("POLYGON ((0 0, 100 0, 100 100, 0 100, 0 0), (1 1, 1 10, 10 10, 10 1, 1 1) )");
     ensure(geo != nullptr);
     ensure_equals(geo->getGeometryTypeId(), geos::geom::GEOS_POLYGON);
 
-    PolygonPtr poly = dynamic_cast<PolygonPtr>(geo);
+    PolygonPtr poly = dynamic_cast<PolygonPtr>(geo.get());
     ensure(poly != nullptr);
     ensure_equals(poly->getNumInteriorRing(), holesNum);
 
@@ -455,11 +445,9 @@ void object::test<30>
     ensure(interior->isRing());
 
     ensure_equals(interior->getGeometryTypeId(), geos::geom::GEOS_LINEARRING);
-
-    factory_->destroyGeometry(geo);
 }
 
-// Test of getCoordiante() for non-empty Polygon
+// Test of getCoordinate() for non-empty Polygon
 template<>
 template<>
 void object::test<31>
@@ -474,7 +462,7 @@ void object::test<31>
     ensure_equals(coord->y, 10);
 }
 
-// Test of getCoordiantes() for non-empty Polygon
+// Test of getCoordinates() for non-empty Polygon
 template<>
 template<>
 void object::test<32>
diff --git a/tests/unit/geom/prep/PreparedGeometry/touchesTest.cpp b/tests/unit/geom/prep/PreparedGeometry/touchesTest.cpp
index a042c17..4338a8c 100644
--- a/tests/unit/geom/prep/PreparedGeometry/touchesTest.cpp
+++ b/tests/unit/geom/prep/PreparedGeometry/touchesTest.cpp
@@ -27,8 +27,8 @@ struct test_preparedgeometrytouches_data {
 
     geos::geom::GeometryFactory::Ptr factory;
     geos::io::WKTReader reader;
-    GeometryPtr g1;
-    GeometryPtr g2;
+    std::unique_ptr<geos::geom::Geometry> g1;
+    std::unique_ptr<geos::geom::Geometry> g2;
     std::unique_ptr<PreparedGeometry> pg1;
     std::unique_ptr<PreparedGeometry> pg2;
 
@@ -40,11 +40,6 @@ struct test_preparedgeometrytouches_data {
         , pg1(nullptr)
         , pg2(nullptr)
     {}
-    ~test_preparedgeometrytouches_data()
-    {
-        factory->destroyGeometry(g1);
-        factory->destroyGeometry(g2);
-    }
 };
 
 typedef test_group<test_preparedgeometrytouches_data> group;
@@ -68,11 +63,11 @@ void object::test<1>
     g2 = reader.read(
              "POINT (0 0)"
          );
-    pg1 = prep::PreparedGeometryFactory::prepare(g1);
-    pg2 = prep::PreparedGeometryFactory::prepare(g2);
+    pg1 = prep::PreparedGeometryFactory::prepare(g1.get());
+    pg2 = prep::PreparedGeometryFactory::prepare(g2.get());
 
-    ensure(!pg1->touches(g2));
-    ensure(!pg2->touches(g1));
+    ensure(!pg1->touches(g2.get()));
+    ensure(!pg2->touches(g1.get()));
 }
 
 // 2 - Line/Point do not touch if point is not on boundary
@@ -87,11 +82,11 @@ void object::test<2>
     g2 = reader.read(
              "POINT (1 1)"
          );
-    pg1 = prep::PreparedGeometryFactory::prepare(g1);
-    pg2 = prep::PreparedGeometryFactory::prepare(g2);
+    pg1 = prep::PreparedGeometryFactory::prepare(g1.get());
+    pg2 = prep::PreparedGeometryFactory::prepare(g2.get());
 
-    ensure(!pg1->touches(g2));
-    ensure(!pg2->touches(g1));
+    ensure(!pg1->touches(g2.get()));
+    ensure(!pg2->touches(g1.get()));
 }
 
 // 3 - Line/Point touch
@@ -106,11 +101,11 @@ void object::test<3>
     g2 = reader.read(
              "POINT (0 2)"
          );
-    pg1 = prep::PreparedGeometryFactory::prepare(g1);
-    pg2 = prep::PreparedGeometryFactory::prepare(g2);
+    pg1 = prep::PreparedGeometryFactory::prepare(g1.get());
+    pg2 = prep::PreparedGeometryFactory::prepare(g2.get());
 
-    ensure(pg1->touches(g2));
-    ensure(pg2->touches(g1));
+    ensure(pg1->touches(g2.get()));
+    ensure(pg2->touches(g1.get()));
 }
 
 // 4 - Line/Point touch (FP coordinates)
@@ -125,11 +120,11 @@ void object::test<4>
     g2 = reader.read(
              "POINT (-257704.820935236 574364.179187424)"
          );
-    pg1 = prep::PreparedGeometryFactory::prepare(g1);
-    pg2 = prep::PreparedGeometryFactory::prepare(g2);
+    pg1 = prep::PreparedGeometryFactory::prepare(g1.get());
+    pg2 = prep::PreparedGeometryFactory::prepare(g2.get());
 
-    ensure(pg1->touches(g2));
-    ensure(pg2->touches(g1));
+    ensure(pg1->touches(g2.get()));
+    ensure(pg2->touches(g1.get()));
 }
 
 } // namespace tut
diff --git a/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp b/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp
index f2c2168..b5e7e18 100644
--- a/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp
+++ b/tests/unit/geom/prep/PreparedGeometryFactoryTest.cpp
@@ -26,7 +26,7 @@ namespace tut {
 // Common data used by tests
 struct test_preparedgeometryfactory_data {
     typedef geos::geom::GeometryFactory GeometryFactory;
-    GeometryPtr g_;
+    std::unique_ptr<geos::geom::Geometry> g_;
     std::unique_ptr<geos::geom::prep::PreparedGeometry> pg_;
     geos::geom::PrecisionModel pm_;
     geos::geom::GeometryFactory::Ptr factory_;
@@ -41,13 +41,6 @@ struct test_preparedgeometryfactory_data {
         assert(nullptr == pg_);
     }
 
-    ~test_preparedgeometryfactory_data()
-    {
-        // FREE MEMORY per test case
-        factory_->destroyGeometry(g_);
-        g_ = nullptr;
-    }
-
 };
 
 typedef test_group<test_preparedgeometryfactory_data> group;
@@ -114,13 +107,13 @@ template<>
 void object::test<4>
 ()
 {
-    g_ = factory_->createEmptyGeometry();
+    g_.reset(factory_->createEmptyGeometry());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty GEOMETRY
@@ -129,14 +122,14 @@ template<>
 void object::test<5>
 ()
 {
-    g_ = factory_->createEmptyGeometry();
+    g_.reset(factory_->createEmptyGeometry());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty POINT
@@ -145,13 +138,13 @@ template<>
 void object::test<6>
 ()
 {
-    g_ = factory_->createPoint();
+    g_.reset(factory_->createPoint());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty POINT
@@ -160,14 +153,14 @@ template<>
 void object::test<7>
 ()
 {
-    g_ = factory_->createPoint();
+    g_.reset(factory_->createPoint());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty LINESTRING
@@ -176,13 +169,13 @@ template<>
 void object::test<8>
 ()
 {
-    g_ = factory_->createLineString();
+    g_.reset(factory_->createLineString());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty LINESTRING
@@ -191,13 +184,13 @@ template<>
 void object::test<9>
 ()
 {
-    g_ = factory_->createLineString();
+    g_.reset(factory_->createLineString());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty POLYGON
@@ -206,13 +199,13 @@ template<>
 void object::test<10>
 ()
 {
-    g_ = factory_->createPolygon();
+    g_.reset(factory_->createPolygon());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty POLYGON
@@ -221,14 +214,14 @@ template<>
 void object::test<11>
 ()
 {
-    g_ = factory_->createPolygon();
+    g_.reset(factory_->createPolygon());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty MULTIPOINT
@@ -237,13 +230,13 @@ template<>
 void object::test<12>
 ()
 {
-    g_ = factory_->createMultiPoint();
+    g_.reset(factory_->createMultiPoint());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty MULTIPOINT
@@ -252,14 +245,14 @@ template<>
 void object::test<13>
 ()
 {
-    g_ = factory_->createMultiPoint();
+    g_.reset(factory_->createMultiPoint());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty MULTILINESTRING
@@ -268,13 +261,13 @@ template<>
 void object::test<14>
 ()
 {
-    g_ = factory_->createMultiLineString();
+    g_.reset(factory_->createMultiLineString());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty MULTILINESTRING
@@ -283,14 +276,14 @@ template<>
 void object::test<15>
 ()
 {
-    g_ = factory_->createMultiLineString();
+    g_.reset(factory_->createMultiLineString());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare empty MULTIPOLYGON
@@ -299,13 +292,13 @@ template<>
 void object::test<16>
 ()
 {
-    g_ = factory_->createMultiPolygon();
+    g_.reset(factory_->createMultiPolygon());
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create empty MULTIPOLYGON
@@ -314,14 +307,14 @@ template<>
 void object::test<17>
 ()
 {
-    g_ = factory_->createMultiPolygon();
+    g_.reset(factory_->createMultiPolygon());
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty POINT
@@ -333,10 +326,10 @@ void object::test<18>
     g_ = reader_.read("POINT(1.234 5.678)");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty POINT
@@ -349,10 +342,10 @@ void object::test<19>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty LINESTRING
@@ -364,10 +357,10 @@ void object::test<20>
     g_ = reader_.read("LINESTRING (0 0, 5 5, 10 5, 10 10)");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty LINESTRING
@@ -380,10 +373,10 @@ void object::test<21>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty LINESTRING
@@ -395,10 +388,10 @@ void object::test<22>
     g_ = reader_.read("POLYGON((0 10, 5 5, 10 5, 15 10, 10 15, 5 15, 0 10))");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty LINESTRING
@@ -411,10 +404,10 @@ void object::test<23>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty MULTIPOINT
@@ -426,10 +419,10 @@ void object::test<24>
     g_ = reader_.read("MULTIPOINT(0 0, 5 5, 10 10, 15 15, 20 20)");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty MULTIPOINT
@@ -442,10 +435,10 @@ void object::test<25>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty MULTILINESTRING
@@ -457,10 +450,10 @@ void object::test<26>
     g_ = reader_.read("MULTILINESTRING ((20 120, 120 20), (20 20, 120 120))");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty MULTILINESTRING
@@ -473,10 +466,10 @@ void object::test<27>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test prepare non-empty POLYGON
@@ -488,10 +481,10 @@ void object::test<28>
     g_ = reader_.read("MULTIPOLYGON(((0 0, 10 0, 10 10, 0 10, 0 0),(2 2, 2 6, 6 4, 2 2)),((60 60, 60 50, 70 40, 60 60)))");
     ensure(nullptr != g_);
 
-    pg_ = prep::PreparedGeometryFactory::prepare(g_);
+    pg_ = prep::PreparedGeometryFactory::prepare(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 // Test create non-empty POLYGON
@@ -504,10 +497,10 @@ void object::test<29>
     ensure(nullptr != g_);
 
     prep::PreparedGeometryFactory pgf;
-    pg_ = pgf.create(g_);
+    pg_ = pgf.create(g_.get());
     ensure(nullptr != pg_);
 
-    ensure_equals_geometry(g_, pg_.get());
+    ensure_equals_geometry(g_.get(), pg_.get());
 }
 
 } // namespace tut
diff --git a/tests/unit/io/WKBWriterTest.cpp b/tests/unit/io/WKBWriterTest.cpp
index 793e1a3..bf29c88 100644
--- a/tests/unit/io/WKBWriterTest.cpp
+++ b/tests/unit/io/WKBWriterTest.cpp
@@ -57,13 +57,11 @@ template<>
 void object::test<1>
 ()
 {
-    geos::geom::Geometry* geom = wktreader.read("POINT(-117 33)");
+    auto geom = wktreader.read("POINT(-117 33)");
     std::stringstream result_stream;
 
     wkbwriter.setOutputDimension(3);
     wkbwriter.write(*geom, result_stream);
-    delete geom;
-    geom = nullptr;
 
     ensure(result_stream.str().length() == 21);
 
@@ -76,8 +74,6 @@ void object::test<1>
     ensure(geom->getCoordinate()->x == -117.0);
     ensure(geom->getCoordinate()->y == 33.0);
     ensure(std::isnan(geom->getCoordinate()->z) != 0);
-
-    delete geom;
 }
 
 // 2 - Test writing a 3D geometry with the WKBWriter in 3D output dimension.
@@ -86,13 +82,11 @@ template<>
 void object::test<2>
 ()
 {
-    geos::geom::Geometry* geom = wktreader.read("POINT(-117 33 11)");
+    auto geom = wktreader.read("POINT(-117 33 11)");
     std::stringstream result_stream;
 
     wkbwriter.setOutputDimension(3);
     wkbwriter.write(*geom, result_stream);
-    delete geom;
-    geom = nullptr;
 
     ensure(result_stream.str().length() == 29);
 
@@ -103,8 +97,6 @@ void object::test<2>
     ensure(geom->getCoordinate()->x == -117.0);
     ensure(geom->getCoordinate()->y == 33.0);
     ensure(geom->getCoordinate()->z == 11.0);
-
-    delete geom;
 }
 
 // 3 - Test writing a 3D geometry with the WKBWriter in 2D output dimension.
@@ -113,13 +105,11 @@ template<>
 void object::test<3>
 ()
 {
-    geos::geom::Geometry* geom = wktreader.read("POINT(-117 33 11)");
+    auto geom = wktreader.read("POINT(-117 33 11)");
     std::stringstream result_stream;
 
     wkbwriter.setOutputDimension(2);
     wkbwriter.write(*geom, result_stream);
-    delete geom;
-    geom = nullptr;
 
     ensure(result_stream.str().length() == 21);
 
@@ -130,8 +120,6 @@ void object::test<3>
     ensure(geom->getCoordinate()->x == -117.0);
     ensure(geom->getCoordinate()->y == 33.0);
     ensure(std::isnan(geom->getCoordinate()->z) != 0);
-
-    delete geom;
 }
 
 // 4 - Test that SRID is output only once
@@ -144,7 +132,7 @@ void object::test<4>
     typedef geos::geom::Geometry Geom;
     typedef std::vector<Geom*> GeomVect;
     GeomVect* geoms = new GeomVect;
-    geoms->push_back(wktreader.read("POLYGON((0 0,1 0,1 1,0 1,0 0))"));
+    geoms->push_back(wktreader.read("POLYGON((0 0,1 0,1 1,0 1,0 0))").release());
     geoms->back()->setSRID(4326);
     Geom* geom = gf->createGeometryCollection(geoms);
     geom->setSRID(4326);
@@ -169,7 +157,7 @@ template<>
 void object::test<5>
 ()
 {
-    geos::geom::Geometry* geom = wktreader.read("POLYGON EMPTY");
+    auto geom = wktreader.read("POLYGON EMPTY");
     geom->setSRID(4326);
     std::stringstream result_stream;
 
@@ -181,11 +169,8 @@ void object::test<5>
     std::string actual = result_stream.str();
     ensure_equals(actual, "0103000020E610000000000000");
 
-    geos::geom::Geometry* geom2 = wkbreader.readHEX(result_stream);
-    assert(geom->equals(geom2));
-
-    delete geom;
-    delete geom2;
+    auto geom2 = wkbreader.readHEX(result_stream);
+    assert(geom->equals(geom2.get()));
 }
 
 } // namespace tut
diff --git a/tests/unit/io/WKTReaderTest.cpp b/tests/unit/io/WKTReaderTest.cpp
index bbf599a..fe370d0 100644
--- a/tests/unit/io/WKTReaderTest.cpp
+++ b/tests/unit/io/WKTReaderTest.cpp
@@ -125,7 +125,7 @@ void object::test<6>
     GeomPtr geom;
 
     try {
-        geom.reset(wktreader.read("POLYGON( EMPTY, (1 1,2 2,1 2,1 1))"));
+        geom = wktreader.read("POLYGON( EMPTY, (1 1,2 2,1 2,1 1))");
         fail("Didn't get expected exception");
     }
     catch(const geos::util::IllegalArgumentException& ex) {
@@ -153,7 +153,7 @@ void object::test<7>
         ggm::GeometryFactory::Ptr p_gf = ggm::GeometryFactory::create(&p_pm);
         gio::WKTReader wktReader(p_gf.get());
         const std::string str = " POINT (0 0) ";
-        geom.reset(wktReader.read(str)); //HERE IT FAILS
+        geom = wktReader.read(str); //HERE IT FAILS
 
         auto coords = geom->getCoordinates();
         ensure_equals(coords->getDimension(), 2U);
diff --git a/tests/unit/noding/snapround/MCIndexSnapRounderTest.cpp b/tests/unit/noding/snapround/MCIndexSnapRounderTest.cpp
index d021c8d..1b75338 100644
--- a/tests/unit/noding/snapround/MCIndexSnapRounderTest.cpp
+++ b/tests/unit/noding/snapround/MCIndexSnapRounderTest.cpp
@@ -84,11 +84,11 @@ struct test_mcidxsnprndr_data {
         if(wkt[0] == '0' || wkt[0] == '1') {
             WKBReader r;
             std::istringstream is(wkt);
-            g.reset(r.readHEX(is));
+            g = r.readHEX(is);
         }
         else {
             WKTReader r;
-            g.reset(r.read(wkt));
+            g = r.read(wkt);
         }
         return g;
     }
diff --git a/tests/unit/operation/distance/DistanceOpTest.cpp b/tests/unit/operation/distance/DistanceOpTest.cpp
index 1447b8c..b7893ff 100644
--- a/tests/unit/operation/distance/DistanceOpTest.cpp
+++ b/tests/unit/operation/distance/DistanceOpTest.cpp
@@ -467,8 +467,8 @@ void object::test<18>
 
     wkt0 = "LINESTRING(0 0, 0 1, 1 1, 1 0, 0 0)";
     wkt1 = "LINESTRING(2 0, 10 1, 10 10)";
-    g0.reset(wktreader.read(wkt0));
-    g1.reset(wktreader.read(wkt1));
+    g0 = wktreader.read(wkt0);
+    g1 = wktreader.read(wkt1);
 
     ensure_equals(DistanceOp::distance(*g0, *g1), 1);
     ensure(DistanceOp::isWithinDistance(*g0, *g1, 2));
diff --git a/tests/unit/operation/overlay/validate/FuzzyPointLocatorTest.cpp b/tests/unit/operation/overlay/validate/FuzzyPointLocatorTest.cpp
index e000220..b1461ef 100644
--- a/tests/unit/operation/overlay/validate/FuzzyPointLocatorTest.cpp
+++ b/tests/unit/operation/overlay/validate/FuzzyPointLocatorTest.cpp
@@ -36,7 +36,7 @@ struct test_fuzzypointlocator_data {
         wkbreader()
     {
         std::string wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))");
-        g.reset(wktreader.read(wkt));
+        g = wktreader.read(wkt);
     }
 };
 
diff --git a/tests/unit/operation/overlay/validate/OffsetPointGeneratorTest.cpp b/tests/unit/operation/overlay/validate/OffsetPointGeneratorTest.cpp
index 11f3ff8..79c1e30 100644
--- a/tests/unit/operation/overlay/validate/OffsetPointGeneratorTest.cpp
+++ b/tests/unit/operation/overlay/validate/OffsetPointGeneratorTest.cpp
@@ -85,7 +85,7 @@ void object::test<1>
     using std::vector;
 
     std::string wkt("POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))");
-    g.reset(wktreader.read(wkt));
+    g = wktreader.read(wkt);
 
     double dist = 10;
     OffsetPointGenerator gen(*g, dist);
@@ -110,7 +110,7 @@ void object::test<2>
     using std::vector;
 
     std::string wkt("POLYGON((0 0, 10 0, 10 5, 10 10, 0 10, 0 0))");
-    g.reset(wktreader.read(wkt));
+    g = wktreader.read(wkt);
 
     double dist = 0.0003;
 
@@ -135,7 +135,7 @@ void object::test<3>
     using std::vector;
 
     std::string wkt("POINT(10 -10)");
-    g.reset(wktreader.read(wkt));
+    g = wktreader.read(wkt);
 
     double dist = 0.0003;
 
@@ -160,7 +160,7 @@ void object::test<4>
     using std::vector;
 
     std::string wkt("LINESTRING(10 -10, 5 600)");
-    g.reset(wktreader.read(wkt));
+    g = wktreader.read(wkt);
 
     double dist = 0.03;
 
@@ -185,7 +185,7 @@ void object::test<5>
     using std::vector;
 
     std::string wkt("MULTILINESTRING((10 -10, 5 600), (1045 -12, 0 0, -435 34))");
-    g.reset(wktreader.read(wkt));
+    g = wktreader.read(wkt);
 
     double dist = 0.2;
 
diff --git a/tests/unit/operation/polygonize/PolygonizeTest.cpp b/tests/unit/operation/polygonize/PolygonizeTest.cpp
index 510172f..933dcc2 100644
--- a/tests/unit/operation/polygonize/PolygonizeTest.cpp
+++ b/tests/unit/operation/polygonize/PolygonizeTest.cpp
@@ -85,8 +85,8 @@ struct test_polygonizetest_data {
             return false;
         }
         for(typename T::iterator i = ex.begin(), e = ex.end(); i != e; ++i) {
-            if(! contains(ob, *i)) {
-                cout << "Expected " << wktwriter.write(*i)
+            if(! contains(ob, i->get())) {
+                cout << "Expected " << wktwriter.write(i->get())
                      << " not found" << endl;
                 return false;
             }
@@ -102,7 +102,7 @@ struct test_polygonizetest_data {
         using std::cout;
         using std::endl;
 
-        std::vector<Geom*> inputGeoms, expectGeoms;
+        std::vector<std::unique_ptr<geos::geom::Geometry>> inputGeoms, expectGeoms;
 
         for (const auto& wkt : inputWKT) {
             inputGeoms.push_back(wktreader.read(wkt));
@@ -111,11 +111,13 @@ struct test_polygonizetest_data {
         for (const auto& wkt : expectWKT) {
             auto g = wktreader.read(wkt);
             g->normalize();
-            expectGeoms.push_back(g);
+            expectGeoms.push_back(std::move(g));
         }
 
         Polygonizer polygonizer(onlyPolygonal);
-        polygonizer.add(&inputGeoms);
+        for (const auto& p : inputGeoms) {
+            polygonizer.add(p.get());
+        }
 
         std::unique_ptr<std::vector<std::unique_ptr<Poly>> > retGeoms;
         retGeoms = polygonizer.getPolygons();
@@ -123,8 +125,6 @@ struct test_polygonizetest_data {
             g->normalize();
         }
 
-        delAll(inputGeoms);
-
         bool ok = compare(expectGeoms, *retGeoms);
         if(! ok) {
             cout << "EXPECTED(" << expectGeoms.size() << "): " << std::endl;
@@ -136,8 +136,6 @@ struct test_polygonizetest_data {
             ensure("not all expected geometries in the obtained set", 0);
         }
 
-        delAll(expectGeoms);
-
         return ok;
     }
 
diff --git a/tests/unit/operation/union/CascadedPolygonUnionTest.cpp b/tests/unit/operation/union/CascadedPolygonUnionTest.cpp
index 0ebb2d4..2536c63 100644
--- a/tests/unit/operation/union/CascadedPolygonUnionTest.cpp
+++ b/tests/unit/operation/union/CascadedPolygonUnionTest.cpp
@@ -109,7 +109,7 @@ void object::test<1>
     for(char const * const* p = polygons; *p != nullptr; ++p) {
         std::string wkt(*p);
         geos::geom::Polygon* geom =
-            dynamic_cast<geos::geom::Polygon*>(wktreader.read(wkt));
+            dynamic_cast<geos::geom::Polygon*>(wktreader.read(wkt).release());
         g.push_back(geom);
     }
 
diff --git a/tests/unit/operation/union/CoverageUnionTest.cpp b/tests/unit/operation/union/CoverageUnionTest.cpp
index 331f9e6..2bf2513 100644
--- a/tests/unit/operation/union/CoverageUnionTest.cpp
+++ b/tests/unit/operation/union/CoverageUnionTest.cpp
@@ -47,7 +47,7 @@ namespace tut {
         std::vector<Geometry*> geoms;
 
         for (const auto& wkt : wkt_geoms) {
-            geoms.push_back(reader.read(wkt));
+            geoms.push_back(reader.read(wkt).release());
         }
 
         std::unique_ptr<Geometry> coll(gfact->createGeometryCollection(geoms));
@@ -73,7 +73,7 @@ namespace tut {
         std::vector<Geometry*> geoms;
 
         for (const auto& wkt : wkt_geoms) {
-            geoms.push_back(reader.read(wkt));
+            geoms.push_back(reader.read(wkt).release());
         }
 
         std::unique_ptr<Geometry> coll(gfact->createGeometryCollection(geoms));
diff --git a/tests/unit/operation/valid/ValidClosedRingTest.cpp b/tests/unit/operation/valid/ValidClosedRingTest.cpp
index 165f818..84ec86b 100644
--- a/tests/unit/operation/valid/ValidClosedRingTest.cpp
+++ b/tests/unit/operation/valid/ValidClosedRingTest.cpp
@@ -53,7 +53,7 @@ struct test_validclosedring_data {
     {
         GeomPtr geom;
         try {
-            geom.reset(rdr.read(wkt));
+            geom = rdr.read(wkt);
         }
         catch(const GEOSException& ex) {
             cerr << ex.what() << endl;
diff --git a/tests/unit/operation/valid/ValidSelfTouchingRingFormingHoleTest.cpp b/tests/unit/operation/valid/ValidSelfTouchingRingFormingHoleTest.cpp
index 8bb1f40..5918bb2 100644
--- a/tests/unit/operation/valid/ValidSelfTouchingRingFormingHoleTest.cpp
+++ b/tests/unit/operation/valid/ValidSelfTouchingRingFormingHoleTest.cpp
@@ -53,7 +53,7 @@ struct test_ValidSelfTouchingRingFormingHole_data {
     {
         GeomPtr geom;
         try {
-            geom.reset(rdr.read(wkt));
+            geom = rdr.read(wkt);
         }
         catch(const GEOSException& ex) {
             cerr << ex.what() << endl;
diff --git a/tests/unit/triangulate/DelaunayTest.cpp b/tests/unit/triangulate/DelaunayTest.cpp
index 2fef678..aa8b168 100644
--- a/tests/unit/triangulate/DelaunayTest.cpp
+++ b/tests/unit/triangulate/DelaunayTest.cpp
@@ -44,8 +44,8 @@ runDelaunay(const char* sitesWkt, bool computeTriangles, const char* expectedWkt
 {
     WKTReader reader;
     std::unique_ptr<Geometry> results;
-    Geometry* sites = reader.read(sitesWkt);
-    Geometry* expected = reader.read(expectedWkt);
+    auto sites = reader.read(sitesWkt);
+    auto expected = reader.read(expectedWkt);
     DelaunayTriangulationBuilder builder;
     builder.setTolerance(tolerance);
     const GeometryFactory& geomFact(*GeometryFactory::getDefaultInstance());
@@ -61,11 +61,8 @@ runDelaunay(const char* sitesWkt, bool computeTriangles, const char* expectedWkt
     results->normalize();
     expected->normalize();
 
-    ensure(results->toString(), results->equalsExact(expected, 1e-7));
+    ensure(results->toString(), results->equalsExact(expected.get(), 1e-7));
     ensure_equals(results->getCoordinateDimension(), expected->getCoordinateDimension());
-
-    delete sites;
-    delete expected;
 }
 
 //
diff --git a/tests/unit/triangulate/quadedge/QuadEdgeSubdivisionTest.cpp b/tests/unit/triangulate/quadedge/QuadEdgeSubdivisionTest.cpp
index 79f53cd..ec53639 100644
--- a/tests/unit/triangulate/quadedge/QuadEdgeSubdivisionTest.cpp
+++ b/tests/unit/triangulate/quadedge/QuadEdgeSubdivisionTest.cpp
@@ -85,9 +85,8 @@ template<>
 void object::test<2>
 ()
 {
-    Geometry* sites;
     QuadEdgeSubdivision* subdiv;
-    sites = reader.read("MULTIPOINT ((150 200), (180 270), (275 163))");
+    auto sites = reader.read("MULTIPOINT ((150 200), (180 270), (275 163))");
     auto siteCoords = DelaunayTriangulationBuilder::extractUniqueCoordinates(*sites);
     Envelope Env = DelaunayTriangulationBuilder::envelope(*siteCoords);
 
@@ -106,13 +105,11 @@ void object::test<2>
         "GEOMETRYCOLLECTION (POLYGON ((-5849.974929324658 2268.0517257497568, -4529.9920486948895 2247.139449440667, 221.20588235294116 210.91176470588235, -684.4227119984187 -2848.644297291955, -5849.974929324658 2268.0517257497568)), POLYGON ((212.5 -3774.5, -684.4227119984187 -2848.644297291955, 221.20588235294116 210.91176470588235, 2448.7167655626645 2188.608343256571, 6235.0370264064295 2248.0370264064295, 212.5 -3774.5)), POLYGON ((-4529.9920486948895 2247.139449440667, 2448.7167655626645 2188.608343256571, 221.20588235294116 210.91176470588235, -4529.9920486948895 2247.139449440667)))";
 //		std::cout << polys->toString() << std::endl;
 
-    Geometry* expected = reader.read(expected_str);
+    auto expected = reader.read(expected_str);
     polys->normalize();
     expected->normalize();
-    ensure(polys->equalsExact(expected, 1e-7));
-    delete sites;
+    ensure(polys->equalsExact(expected.get(), 1e-7));
     delete subdiv;
-    delete expected;
 //		ensure(polys->getCoordinateDimension() == expected->getCoordinateDimension());
 }
 
diff --git a/tests/xmltester/SimpleWKTTester.cpp b/tests/xmltester/SimpleWKTTester.cpp
index b9bcc3c..55f9441 100644
--- a/tests/xmltester/SimpleWKTTester.cpp
+++ b/tests/xmltester/SimpleWKTTester.cpp
@@ -50,7 +50,7 @@ main(int /*argc*/, char** /*argv*/)
         while(!in.eof()) {
             getline(in, instr);
             if(instr != "") {
-                g = r->read(instr);
+                g = r->read(instr).release();
                 outstr = w->write(g);
                 out << "----------" << endl;
                 out << instr << endl;
diff --git a/tests/xmltester/XMLTester.cpp b/tests/xmltester/XMLTester.cpp
index 9033659..77635e6 100644
--- a/tests/xmltester/XMLTester.cpp
+++ b/tests/xmltester/XMLTester.cpp
@@ -592,7 +592,7 @@ XMLTester::parseGeometry(const std::string& in, const char* label)
     while(is.get(first_char) && std::isspace(first_char));
     is.unget();
 
-    geom::Geometry* ret;
+    std::unique_ptr<geom::Geometry> ret;
 
     switch(first_char) {
     case '0':
@@ -619,12 +619,12 @@ XMLTester::parseGeometry(const std::string& in, const char* label)
     }
 
     if(testValidInput) {
-        testValid(ret, std::string(label));
+        testValid(ret.get(), std::string(label));
     }
 
     //ret->normalize();
 
-    return ret;
+    return ret.release();
 }
 
 std::string

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

Summary of changes:
 capi/geos_ts_c.cpp                                 |  21 ++-
 doc/example.cpp                                    |   2 +-
 include/geos/io/WKBReader.h                        |  35 ++---
 include/geos/io/WKTReader.h                        |  22 ++--
 src/io/WKBReader.cpp                               |  67 +++++-----
 src/io/WKTReader.cpp                               | 119 +++++++----------
 tests/unit/algorithm/InteriorPointAreaTest.cpp     |   2 +-
 tests/unit/algorithm/MinimumBoundingCircleTest.cpp |   4 +-
 tests/unit/capi/GEOSContainsTest.cpp               |  16 +--
 tests/unit/capi/GEOSPreparedGeometryTest.cpp       |  20 +--
 tests/unit/geom/Geometry/coversTest.cpp            |   4 +-
 tests/unit/geom/Geometry/isRectangleTest.cpp       |  42 ++----
 tests/unit/geom/GeometryFactoryTest.cpp            |   4 +-
 tests/unit/geom/LineStringTest.cpp                 |  65 +++-------
 tests/unit/geom/LinearRingTest.cpp                 |  17 +--
 tests/unit/geom/MultiPointTest.cpp                 |  17 +--
 tests/unit/geom/PointTest.cpp                      | 115 +++++------------
 tests/unit/geom/PolygonTest.cpp                    |  32 ++---
 .../geom/prep/PreparedGeometry/touchesTest.cpp     |  41 +++---
 .../unit/geom/prep/PreparedGeometryFactoryTest.cpp | 141 ++++++++++-----------
 tests/unit/io/WKBWriterTest.cpp                    |  29 +----
 tests/unit/io/WKTReaderTest.cpp                    |   4 +-
 .../noding/snapround/MCIndexSnapRounderTest.cpp    |   4 +-
 tests/unit/operation/distance/DistanceOpTest.cpp   |   4 +-
 .../overlay/validate/FuzzyPointLocatorTest.cpp     |   2 +-
 .../overlay/validate/OffsetPointGeneratorTest.cpp  |  10 +-
 tests/unit/operation/polygonize/PolygonizeTest.cpp |  16 +--
 .../operation/union/CascadedPolygonUnionTest.cpp   |   2 +-
 tests/unit/operation/union/CoverageUnionTest.cpp   |   4 +-
 tests/unit/operation/valid/ValidClosedRingTest.cpp |   2 +-
 .../valid/ValidSelfTouchingRingFormingHoleTest.cpp |   2 +-
 tests/unit/triangulate/DelaunayTest.cpp            |   9 +-
 .../quadedge/QuadEdgeSubdivisionTest.cpp           |   9 +-
 tests/xmltester/SimpleWKTTester.cpp                |   2 +-
 tests/xmltester/XMLTester.cpp                      |   6 +-
 35 files changed, 346 insertions(+), 545 deletions(-)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list