[Marble-commits] KDE/kdeedu/marble/src/lib

Thibaut Gridel tgridel at free.fr
Fri Jul 16 23:09:59 CEST 2010


SVN commit 1150816 by tgridel:

GeoDataMultiGeometry: store GeoDataGeometry* in GeoDataMultiGeometry

 M  +1 -1      MarbleGeometryModel.cpp  
 M  +90 -40    geodata/data/GeoDataMultiGeometry.cpp  
 M  +23 -8     geodata/data/GeoDataMultiGeometry.h  
 M  +6 -1      geodata/data/GeoDataMultiGeometry_p.h  
 M  +7 -0      geodata/data/GeoDataPlacemark.cpp  


--- trunk/KDE/kdeedu/marble/src/lib/MarbleGeometryModel.cpp #1150815:1150816
@@ -52,7 +52,7 @@
         if( !geometry ) return;
 
         GeoDataMultiGeometry* multiGeometry = static_cast<GeoDataMultiGeometry*>( geometry );
-        QVector<GeoDataGeometry> & vec = multiGeometry->vector();
+        QVector<GeoDataGeometry> vec = multiGeometry->vector();
         QVector<GeoDataGeometry>::iterator iterator = vec.begin();
         QVector<GeoDataGeometry>::iterator end = vec.end();
         for(; iterator != end; ++iterator ) {
--- trunk/KDE/kdeedu/marble/src/lib/geodata/data/GeoDataMultiGeometry.cpp #1150815:1150816
@@ -52,94 +52,144 @@
     return p()->m_vector.size();
 }
 
-QVector<GeoDataGeometry>& GeoDataMultiGeometry::vector() const
+QVector<GeoDataGeometry> GeoDataMultiGeometry::vector() const
 {
-    return p()->m_vector;
+    QVector<GeoDataGeometry> results;
+
+    QVector<GeoDataGeometry*>::const_iterator it = p()->m_vector.constBegin();
+    QVector<GeoDataGeometry*>::const_iterator end = p()->m_vector.constEnd();
+
+    for (; it != end; ++it) {
+            GeoDataGeometry f = **it;
+            results.append( f );
 }
 
+    return results;
+}
+
 GeoDataGeometry& GeoDataMultiGeometry::at( int pos )
 {
     mDebug() << "detaching!";
-    GeoDataGeometry::detach();
-    return p()->m_vector[ pos ];
+    detach();
+    return *(p()->m_vector[ pos ]);
 }
 
 const GeoDataGeometry& GeoDataMultiGeometry::at( int pos ) const
 {
-    return p()->m_vector.at( pos );
+    return *(p()->m_vector.at( pos ));
 }
 
 GeoDataGeometry& GeoDataMultiGeometry::operator[]( int pos )
 {
-    GeoDataGeometry::detach();
-    return p()->m_vector[ pos ];
+    detach();
+    return *(p()->m_vector[ pos ]);
 }
 
 const GeoDataGeometry& GeoDataMultiGeometry::operator[]( int pos ) const
 {
-    return p()->m_vector[ pos ];
+    return *(p()->m_vector[ pos ]);
 }
 
 GeoDataGeometry& GeoDataMultiGeometry::last()
 {
-    GeoDataGeometry::detach();
-    return p()->m_vector.last();
+    detach();
+    return *(p()->m_vector.last());
 }
 
 GeoDataGeometry& GeoDataMultiGeometry::first()
 {
-    GeoDataGeometry::detach();
-    return p()->m_vector.first();
+    detach();
+    return *(p()->m_vector.first());
 }
 
 const GeoDataGeometry& GeoDataMultiGeometry::last() const
 {
-    return p()->m_vector.last();
+    return *(p()->m_vector.last());
 }
 
 const GeoDataGeometry& GeoDataMultiGeometry::first() const
 {
-    return p()->m_vector.first();
+    return *(p()->m_vector.first());
 }
 
-QVector<GeoDataGeometry>::Iterator GeoDataMultiGeometry::begin()
+QVector<GeoDataGeometry*>::Iterator GeoDataMultiGeometry::begin()
 {
-    GeoDataGeometry::detach();
+    detach();
     return p()->m_vector.begin();
 }
 
-QVector<GeoDataGeometry>::Iterator GeoDataMultiGeometry::end()
+QVector<GeoDataGeometry*>::Iterator GeoDataMultiGeometry::end()
 {
-    GeoDataGeometry::detach();
+    detach();
     return p()->m_vector.end();
 }
 
-QVector<GeoDataGeometry>::ConstIterator GeoDataMultiGeometry::constBegin() const
+QVector<GeoDataGeometry*>::ConstIterator GeoDataMultiGeometry::constBegin() const
 {
     return p()->m_vector.constBegin();
 }
 
-QVector<GeoDataGeometry>::ConstIterator GeoDataMultiGeometry::constEnd() const
+QVector<GeoDataGeometry*>::ConstIterator GeoDataMultiGeometry::constEnd() const
 {
     return p()->m_vector.constEnd();
 }
 
+/**
+ * @brief  returns the requested child item
+ */
+GeoDataGeometry* GeoDataMultiGeometry::child( int i )
+{
+    return p()->m_vector.at( i );
+}
+
+/**
+ * @brief returns the position of an item in the list
+ */
+int GeoDataMultiGeometry::childPosition( GeoDataGeometry *object)
+{
+    for ( int i=0; i< p()->m_vector.size(); i++ )
+    {
+        if ( p()->m_vector.at( i ) == object )
+        {
+            return i;
+        }
+    }
+    return -1;
+}
+
+/**
+* @brief add an element
+*/
+void GeoDataMultiGeometry::append( GeoDataGeometry *other )
+{
+    detach();
+    other->setParent( this );
+    p()->m_vector.append( other );
+}
+
+
+
 void GeoDataMultiGeometry::append ( const GeoDataGeometry& value )
 {
-    GeoDataGeometry::detach();
-    p()->m_vector.append( value );
+    detach();
+    GeoDataGeometry *g = new GeoDataGeometry( value );
+    g->setParent( this );
+    p()->m_vector.append( g );
 }
 
 GeoDataMultiGeometry& GeoDataMultiGeometry::operator << ( const GeoDataGeometry& value )
 {
-    GeoDataGeometry::detach();
-    p()->m_vector.append( value );
+    detach();
+    GeoDataGeometry *g = new GeoDataGeometry( value );
+    g->setParent( this );
+    p()->m_vector.append( g );
     return *this;
 }
 
 void GeoDataMultiGeometry::clear()
 {
-    GeoDataGeometry::detach();
+    detach();
+    qDeleteAll(p()->m_vector);
     p()->m_vector.clear();
 }
 
@@ -149,19 +199,19 @@
 
     stream << p()->m_vector.size();
     
-    for( QVector<GeoDataGeometry>::const_iterator iterator 
+    for( QVector<GeoDataGeometry*>::const_iterator iterator
           = p()->m_vector.constBegin(); 
          iterator != p()->m_vector.constEnd();
          ++iterator ) {
-        const GeoDataGeometry& geometry = *iterator;
-        stream << geometry.geometryId();
-        geometry.pack( stream );
+        const GeoDataGeometry *geometry = *iterator;
+        stream << geometry->geometryId();
+        geometry->pack( stream );
     }
 }
 
 void GeoDataMultiGeometry::unpack( QDataStream& stream )
 {
-    GeoDataGeometry::detach();
+    detach();
     GeoDataGeometry::unpack( stream );
 
     int size = 0;
@@ -176,36 +226,36 @@
                 break;
             case GeoDataPointId:
                 {
-                GeoDataPoint point;
-                point.unpack( stream );
+                GeoDataPoint *point = new GeoDataPoint;
+                point->unpack( stream );
                 p()->m_vector.append( point );
                 }
                 break;
             case GeoDataLineStringId:
                 {
-                GeoDataLineString lineString;
-                lineString.unpack( stream );
+                GeoDataLineString *lineString = new GeoDataLineString;
+                lineString->unpack( stream );
                 p()->m_vector.append( lineString );
                 }
                 break;
             case GeoDataLinearRingId:
                 {
-                GeoDataLinearRing linearRing;
-                linearRing.unpack( stream );
+                GeoDataLinearRing *linearRing = new GeoDataLinearRing;
+                linearRing->unpack( stream );
                 p()->m_vector.append( linearRing );
                 }
                 break;
             case GeoDataPolygonId:
                 {
-                GeoDataPolygon polygon;
-                polygon.unpack( stream );
+                GeoDataPolygon *polygon = new GeoDataPolygon;
+                polygon->unpack( stream );
                 p()->m_vector.append( polygon );
                 }
                 break;
             case GeoDataMultiGeometryId:
                 {
-                GeoDataMultiGeometry multiGeometry;
-                multiGeometry.unpack( stream );
+                GeoDataMultiGeometry *multiGeometry = new GeoDataMultiGeometry;
+                multiGeometry->unpack( stream );
                 p()->m_vector.append( multiGeometry );
                 }
                 break;
--- trunk/KDE/kdeedu/marble/src/lib/geodata/data/GeoDataMultiGeometry.h #1150815:1150816
@@ -52,19 +52,34 @@
     GeoDataGeometry& last();
     const GeoDataGeometry& last() const;
 
+    /**
+     * @brief  returns the requested child item
+     */
+    GeoDataGeometry* child( int );
+
+    /**
+     * @brief returns the position of an item in the list
+     */
+    int childPosition( GeoDataGeometry *child);
+
+    /**
+    * @brief add an element
+    */
+    void append( GeoDataGeometry *other );
+
     void append ( const GeoDataGeometry& value );
     GeoDataMultiGeometry& operator << ( const GeoDataGeometry& value );
     
-    QVector<GeoDataGeometry>::Iterator begin();
-    QVector<GeoDataGeometry>::Iterator end();
-    QVector<GeoDataGeometry>::ConstIterator constBegin() const;
-    QVector<GeoDataGeometry>::ConstIterator constEnd() const;
+    QVector<GeoDataGeometry*>::Iterator begin();
+    QVector<GeoDataGeometry*>::Iterator end();
+    QVector<GeoDataGeometry*>::ConstIterator constBegin() const;
+    QVector<GeoDataGeometry*>::ConstIterator constEnd() const;
     void clear();
-    QVector<GeoDataGeometry>& vector() const;
+    QVector<GeoDataGeometry> vector() const;
 
-    QVector<GeoDataGeometry>::Iterator erase ( QVector<GeoDataGeometry>::Iterator pos );
-    QVector<GeoDataGeometry>::Iterator erase ( QVector<GeoDataGeometry>::Iterator begin,
-                                                  QVector<GeoDataGeometry>::Iterator end );
+    QVector<GeoDataGeometry*>::Iterator erase ( QVector<GeoDataGeometry*>::Iterator pos );
+    QVector<GeoDataGeometry*>::Iterator erase ( QVector<GeoDataGeometry*>::Iterator begin,
+                                                  QVector<GeoDataGeometry*>::Iterator end );
 
     // Serialize the Placemark to @p stream
     virtual void pack( QDataStream& stream ) const;
--- trunk/KDE/kdeedu/marble/src/lib/geodata/data/GeoDataMultiGeometry_p.h #1150815:1150816
@@ -25,6 +25,11 @@
     {
     }
 
+     ~GeoDataMultiGeometryPrivate()
+     {
+         qDeleteAll(m_vector);
+     }
+
     virtual GeoDataGeometryPrivate* copy()
     { 
          GeoDataMultiGeometryPrivate* copy = new GeoDataMultiGeometryPrivate;
@@ -41,7 +46,7 @@
     {
         return GeoDataMultiGeometryId;
     }
-    QVector<GeoDataGeometry>  m_vector;
+    QVector<GeoDataGeometry*>  m_vector;
 };
 
 } // namespace Marble
--- trunk/KDE/kdeedu/marble/src/lib/geodata/data/GeoDataPlacemark.cpp #1150815:1150816
@@ -106,12 +106,14 @@
 {
     detach();
     p()->m_coordinate = GeoDataPoint( lon, lat, alt );
+    p()->m_coordinate.setParent( this );
 }
 
 void GeoDataPlacemark::setCoordinate( const GeoDataPoint &point )
 {
     detach();
     p()->m_coordinate = GeoDataPoint( point );
+    p()->m_coordinate.setParent( this );
 }
 
 void GeoDataPlacemark::setGeometry( const GeoDataPoint& point )
@@ -119,6 +121,7 @@
     detach();
     delete p()->m_geometry;
     p()->m_geometry = new GeoDataPoint( point );
+    p()->m_geometry->setParent( this );
 }
 
 void GeoDataPlacemark::setGeometry( const GeoDataLineString& point )
@@ -126,6 +129,7 @@
     detach();
     delete p()->m_geometry;
     p()->m_geometry = new GeoDataLineString( point );
+    p()->m_geometry->setParent( this );
 }
 
 void GeoDataPlacemark::setGeometry( const GeoDataLinearRing& point )
@@ -133,6 +137,7 @@
     detach();
     delete p()->m_geometry;
     p()->m_geometry = new GeoDataLinearRing( point );
+    p()->m_geometry->setParent( this );
 }
 
 void GeoDataPlacemark::setGeometry( const GeoDataPolygon& point )
@@ -140,6 +145,7 @@
     detach();
     delete p()->m_geometry;
     p()->m_geometry = new GeoDataPolygon( point );
+    p()->m_geometry->setParent( this );
 }
 
 void GeoDataPlacemark::setGeometry( const GeoDataMultiGeometry& point )
@@ -147,6 +153,7 @@
     detach();
     delete p()->m_geometry;
     p()->m_geometry = new GeoDataMultiGeometry( point );
+    p()->m_geometry->setParent( this );
 }
 
 qreal GeoDataPlacemark::area() const


More information about the Marble-commits mailing list