[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    =?utf-8?q?=5Bmarble=5D_src/lib/geodata/handlers/kml=3A_Faster_KM?=
From:       Dennis_Nienhüser <earthwings () gentoo ! org>
Date:       2011-04-30 21:42:49
Message-ID: 20110430214249.7FEEDA60A4 () git ! kde ! org
[Download RAW message or body]

Git commit 995b06039a00f9a7d45e32cec0aa5a581578e610 by Dennis Nienhüser.
Committed on 25/04/2011 at 00:11.
Pushed by nienhueser into branch 'master'.

Faster KML coordinate tag parsing.

Speeds up parsing of large routes by a factor of two.
REVIEW: 101227

M  +18   -1    src/lib/geodata/handlers/kml/KmlCoordinatesTagHandler.cpp     

http://commits.kde.org/marble/995b06039a00f9a7d45e32cec0aa5a581578e610

diff --git a/src/lib/geodata/handlers/kml/KmlCoordinatesTagHandler.cpp \
b/src/lib/geodata/handlers/kml/KmlCoordinatesTagHandler.cpp index ad1fed2..25cfadf \
                100644
--- a/src/lib/geodata/handlers/kml/KmlCoordinatesTagHandler.cpp
+++ b/src/lib/geodata/handlers/kml/KmlCoordinatesTagHandler.cpp
@@ -50,7 +50,24 @@ GeoNode* KmlcoordinatesTagHandler::parse( GeoParser& parser ) \
const  || parentItem.represents( kmlTag_LineString )
      || parentItem.represents( kmlTag_MultiGeometry )
      || parentItem.represents( kmlTag_LinearRing ) ) {
-        QStringList  coordinatesLines = parser.readElementText().trimmed().split( \
QRegExp("\\s"), QString::SkipEmptyParts ); +        QStringList  coordinatesLines;// \
= parser.readElementText().trimmed().split( QRegExp("\\s"), QString::SkipEmptyParts \
); +        // Splitting using the "\\s" regexp is slow, split manually instead.
+        QString const text = parser.readElementText().trimmed();
+        int index = 0;
+        bool inside = true;
+        int const size = text.size();
+        for ( int i=0; i<size; ++i ) {
+            if ( text[i].isSpace() ) {
+                if ( inside ) {
+                    coordinatesLines.append( text.mid( index, i-index ) );
+                    inside = false;
+                }
+                index = i+1;
+            } else {
+                inside = true;
+            }
+        }
+        coordinatesLines.append( text.mid( index ) );
         Q_FOREACH( const QString& line, coordinatesLines ) {
             QStringList coordinates = line.trimmed().split( ',' );
             if ( parentItem.represents( kmlTag_Point ) && \
parentItem.is<GeoDataFeature>() ) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic