[geos-commits] [SCM] GEOS branch 3.7 updated. c1934f5170d3f59dff9f6c37fde721253d5ef5c2
git at osgeo.org
git at osgeo.org
Fri Sep 13 09:55:34 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, 3.7 has been updated
via c1934f5170d3f59dff9f6c37fde721253d5ef5c2 (commit)
from 06e23006f944e691a4018ac0dd77dad413ebf4bd (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 c1934f5170d3f59dff9f6c37fde721253d5ef5c2
Author: Paul Ramsey <pramsey at cleverelephant.ca>
Date: Fri Sep 13 09:54:52 2019 -0700
Use std::array instead of std::vector in TopologyLocation.cpp, for
performance improvement in overlay operations.
diff --git a/NEWS b/NEWS
index 97cbdd9..a29006f 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,7 @@ Changes in 3.7.3dev
- Bug fixes / improvements
- Union performance regression (#867 Paul Ramsey)
+ - Overlay performance improvement (Paul Ramsey)
Changes in 3.7.2
diff --git a/include/geos/geomgraph/TopologyLocation.h b/include/geos/geomgraph/TopologyLocation.h
index 658c7c0..def6186 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 14a6944..68b1f73 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