[geos-commits] [SCM] GEOS branch svn-3.5 updated. 0ac91e57f40335a7ef2bf331aa37e87b5dfe194e

git at osgeo.org git at osgeo.org
Fri Sep 13 10:06:57 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, svn-3.5 has been updated
       via  0ac91e57f40335a7ef2bf331aa37e87b5dfe194e (commit)
      from  7705a2489b3bf745dd61e076a089c0a9b6a98dc5 (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 0ac91e57f40335a7ef2bf331aa37e87b5dfe194e
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date:   Fri Sep 13 10:06:44 2019 -0700

    Use std::array instead of std::vector in TopologyLocation.cpp

diff --git a/NEWS b/NEWS
index 5d9a602..c7592a9 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,7 @@ Changes in 3.5.3
 -Bug fixes / improvements
   - Fix crash in GEOSUnaryUnion with empty LineString (#928, Sergey Fedoseev)
   - Polygon build failure in Overlay difference (#789 Paul Ramsey)
+  - Performance improvement in overlay (Paul Ramsey)
 
 
 Changes in 3.5.2
diff --git a/include/geos/geomgraph/TopologyLocation.h b/include/geos/geomgraph/TopologyLocation.h
index 9b1fcd0..f0b5f8d 100644
--- a/include/geos/geomgraph/TopologyLocation.h
+++ b/include/geos/geomgraph/TopologyLocation.h
@@ -25,6 +25,7 @@
 #include <geos/inline.h>
 
 #include <vector>
+#include <array>
 #include <string>
 
 #ifdef _MSC_VER
@@ -65,8 +66,6 @@ public:
 
 	~TopologyLocation();
 
-	TopologyLocation(const std::vector<int> &newLocation);
-
 	/** \brief
 	 * Constructs a TopologyLocation specifying how points on, to the
 	 * left of, and to the right of some GraphComponent relate to some
@@ -115,7 +114,7 @@ public:
 	void setLocation(int locValue);
 
 	/// Warning: returns reference to owned memory
-	const std::vector<int> &getLocations() const;
+	const std::array<int, 3>& getLocations() const;
 
 	void setLocations(int on, int left, int right);
 
@@ -131,7 +130,8 @@ public:
 
 private:
 
-	std::vector<int> location;
+	std::array<int, 3> location;
+	std::size_t locationSize;
 };
 
 std::ostream& operator<< (std::ostream&, const TopologyLocation&);
diff --git a/src/geomgraph/TopologyLocation.cpp b/src/geomgraph/TopologyLocation.cpp
index 175fcbd..873ccb2 100644
--- a/src/geomgraph/TopologyLocation.cpp
+++ b/src/geomgraph/TopologyLocation.cpp
@@ -26,17 +26,11 @@
 #include <iostream>
 #include <cassert>
 
-using namespace std;
 using namespace geos::geom;
 
 namespace geos {
 namespace geomgraph { // geos.geomgraph
 
-/*public*/
-TopologyLocation::TopologyLocation(const vector<int> &newLocation):
-	location(newLocation.size(), Location::UNDEF)
-{
-}
 
 /*public*/
 TopologyLocation::TopologyLocation()
@@ -50,7 +44,7 @@ TopologyLocation::~TopologyLocation()
 
 /*public*/
 TopologyLocation::TopologyLocation(int on, int left, int right):
-	location(3)
+	locationSize(3)
 {
 	location[Position::ON]=on;
 	location[Position::LEFT]=left;
@@ -59,15 +53,17 @@ TopologyLocation::TopologyLocation(int on, int left, int right):
 
 /*public*/
 TopologyLocation::TopologyLocation(int on):
-	location(1, on)
+	locationSize(1)
 {
-	//(*location)[Position::ON]=on;
+	location.fill(Location::UNDEF);
+	location[Position::ON] = on;
 }
 
 /*public*/
 TopologyLocation::TopologyLocation(const TopologyLocation &gl)
   :
-	location(gl.location)
+	location(gl.location),
+	locationSize(gl.locationSize)
 {
 }
 
@@ -76,6 +72,7 @@ TopologyLocation&
 TopologyLocation::operator= (const TopologyLocation &gl)
 {
 	location = gl.location;
+	locationSize = gl.locationSize;
   return *this;
 }
 
@@ -84,7 +81,7 @@ int
 TopologyLocation::get(size_t posIndex) const
 {
 	// should be an assert() instead ?
-	if (posIndex<location.size()) return location[posIndex];
+	if (posIndex<locationSize) return location[posIndex];
 	return Location::UNDEF;
 }
 
@@ -92,7 +89,7 @@ TopologyLocation::get(size_t posIndex) const
 bool
 TopologyLocation::isNull() const
 {
-	for (size_t i=0, sz=location.size(); i<sz; ++i) {
+	for (size_t i=0; i<locationSize; ++i) {
 		if (location[i]!=Location::UNDEF) return false;
 	}
 	return true;
@@ -102,7 +99,7 @@ TopologyLocation::isNull() const
 bool
 TopologyLocation::isAnyNull() const
 {
-	for (size_t i=0, sz=location.size(); i<sz; ++i) {
+	for (size_t i=0; i<locationSize; ++i) {
 		if (location[i]==Location::UNDEF) return true;
 	}
 	return false;
@@ -119,21 +116,21 @@ TopologyLocation::isEqualOnSide(const TopologyLocation &le, int locIndex) const
 bool
 TopologyLocation::isArea() const
 {
-	return location.size()>1;
+	return locationSize>1;
 }
 
 /*public*/
 bool
 TopologyLocation::isLine() const
 {
-	return location.size()==1;
+	return locationSize==1;
 }
 
 /*public*/
 void
 TopologyLocation::flip()
 {
-	if (location.size()<=1) return;
+	if (locationSize<=1) return;
 	int temp=location[Position::LEFT];
 	location[Position::LEFT]=location[Position::RIGHT];
 	location[Position::RIGHT] = temp;
@@ -143,16 +140,14 @@ TopologyLocation::flip()
 void
 TopologyLocation::setAllLocations(int locValue)
 {
-	for (size_t i=0, sz=location.size(); i<sz; ++i) {
-		location[i]=locValue;
-	}
+	location.fill(locValue);
 }
 
 /*public*/
 void
 TopologyLocation::setAllLocationsIfNull(int locValue)
 {
-	for (size_t i=0, sz=location.size(); i<sz; ++i) {
+	for (size_t i=0; i<locationSize; ++i) {
 		if (location[i]==Location::UNDEF) location[i]=locValue;
 	}
 }
@@ -172,7 +167,7 @@ TopologyLocation::setLocation(int locValue)
 }
 
 /*public*/
-const vector<int> &
+const std::array<int, 3>&
 TopologyLocation::getLocations() const
 {
 	return location;
@@ -182,7 +177,7 @@ TopologyLocation::getLocations() const
 void
 TopologyLocation::setLocations(int on, int left, int right)
 {
-	assert(location.size() >= 3);
+	assert(locationSize >= 3);
 	location[Position::ON]=on;
 	location[Position::LEFT]=left;
 	location[Position::RIGHT]=right;
@@ -192,7 +187,7 @@ TopologyLocation::setLocations(int on, int left, int right)
 bool
 TopologyLocation::allPositionsEqual(int loc) const
 {
-	for (size_t i=0, sz=location.size(); i<sz; ++i) {
+	for (size_t i=0; i<locationSize; ++i) {
 		if (location[i]!=loc) return false;
 	}
 	return true;
@@ -203,32 +198,32 @@ void
 TopologyLocation::merge(const TopologyLocation &gl)
 {
 	// if the src is an Area label & and the dest is not, increase the dest to be an Area
-	size_t sz=location.size();
-	size_t glsz=gl.location.size();
+	size_t sz=locationSize;
+	size_t glsz=gl.locationSize;
 	if (glsz>sz) {
-		location.resize(3);
+		locationSize = 3;
 		location[Position::LEFT]=Location::UNDEF;
 		location[Position::RIGHT]=Location::UNDEF;
 	}
-	for (size_t i=0; i<sz; ++i) {
+	for (size_t i=0; i<locationSize; ++i) {
 		if (location[i]==Location::UNDEF && i<glsz)
 			location[i]=gl.location[i];
 	}
 }
 
-string
+std::string
 TopologyLocation::toString() const
 {
-	stringstream ss;
+	std::stringstream ss;
 	ss << *this;
 	return ss.str();
 }
 
 std::ostream& operator<< (std::ostream& os, const TopologyLocation& tl)
 {
-	if (tl.location.size()>1) os << Location::toLocationSymbol(tl.location[Position::LEFT]);
+	if (tl.locationSize>1) os << Location::toLocationSymbol(tl.location[Position::LEFT]);
 	os << Location::toLocationSymbol(tl.location[Position::ON]);
-	if (tl.location.size()>1) os << Location::toLocationSymbol(tl.location[Position::RIGHT]);
+	if (tl.locationSize>1) os << Location::toLocationSymbol(tl.location[Position::RIGHT]);
 	return os;
 }
 

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

Summary of changes:
 NEWS                                      |  1 +
 include/geos/geomgraph/TopologyLocation.h |  8 ++---
 src/geomgraph/TopologyLocation.cpp        | 57 ++++++++++++++-----------------
 3 files changed, 31 insertions(+), 35 deletions(-)


hooks/post-receive
-- 
GEOS


More information about the geos-commits mailing list