Code

A simple layout document as to what, why and how is cppification.
[inkscape.git] / src / document-subset.cpp
index 5fcf1641cf80d26052816317ed244686e845bcd6..a25205db9f5c8df55305a9a5e2943f9a109bfd65 100644 (file)
@@ -60,7 +60,7 @@ struct DocumentSubset::Relations : public GC::Managed<GC::ATOMIC>,
 
                 while ( first != last ) {
                     Siblings::const_iterator mid = first + ( last - first + 1 ) / 2;
-                    int pos = sp_object_compare_position(*mid, obj);
+                    int pos = sp_object_compare_position(*mid,obj);
                     if ( pos < 0 ) {
                         first = mid;
                     } else if ( pos > 0 ) {
@@ -76,7 +76,7 @@ struct DocumentSubset::Relations : public GC::Managed<GC::ATOMIC>,
 
                 if ( first == last ) {
                     // compare to the single possiblity left
-                    int pos = sp_object_compare_position(*last, obj);
+                    int pos = sp_object_compare_position(*last,obj);
                     if ( pos < 0 ) {
                         last++;
                     }
@@ -140,7 +140,12 @@ struct DocumentSubset::Relations : public GC::Managed<GC::ATOMIC>,
         for ( Map::iterator iter=records.begin()
             ; iter != records.end() ; ++iter )
         {
-            sp_object_unref((*iter).first);
+            if ((*iter).first) {
+                sp_object_unref((*iter).first);
+                Record &record=(*iter).second;
+                record.release_connection.disconnect();
+                record.position_changed_connection.disconnect();
+            }
         }
     }
 
@@ -179,9 +184,6 @@ private:
 
     void _doRemove(SPObject *obj) {
         Record &record=records[obj];
-        record.release_connection.disconnect();
-        record.position_changed_connection.disconnect();
-        records.erase(obj);
 
         if ( record.parent == NULL ) {
             Record &root = records[NULL];
@@ -193,6 +195,9 @@ private:
             }
         }
 
+        record.release_connection.disconnect();
+        record.position_changed_connection.disconnect();
+        records.erase(obj);
         removed_signal.emit(obj);
         sp_object_unref(obj);
     }
@@ -296,7 +301,7 @@ void DocumentSubset::Relations::remove(SPObject *obj, bool subtree) {
         /* remove obj's record */
         _doRemove(obj);
     }
-    
+
     changed_signal.emit();
 }