[folks/perf2: 2/2] FolksSmallSet: Add take() method




commit 4faa9508a8a6559affb81b0a4ff1ed1693b4a882
Author: Niels De Graef <nielsdegraef gmail com>
Date:   Tue Oct 20 22:50:27 2020 +0200

    FolksSmallSet: Add take() method

 backends/eds/lib/edsf-persona.vala      | 18 +++++++++---------
 folks/folks-generics.vapi               |  3 +++
 folks/individual.vala                   |  6 +++---
 folks/small-set.c                       | 23 +++++++++++++++++++++++
 tests/eds/add-contacts-stress-test.vala |  2 +-
 5 files changed, 39 insertions(+), 13 deletions(-)
---
diff --git a/backends/eds/lib/edsf-persona.vala b/backends/eds/lib/edsf-persona.vala
index 5f03d248..baab5b7f 100644
--- a/backends/eds/lib/edsf-persona.vala
+++ b/backends/eds/lib/edsf-persona.vala
@@ -1269,7 +1269,7 @@ public class Edsf.Persona : Folks.Persona,
       var default_role_fd = this._get_default_role ();
       if (default_role_fd != null)
         {
-          new_roles.add ((!) default_role_fd);
+          new_roles.take ((!) (owned) default_role_fd);
         }
 
       unowned E.VCard vcard = (E.VCard) this.contact;
@@ -1321,7 +1321,7 @@ public class Edsf.Persona : Folks.Persona,
                 }
             }
 
-            new_roles.add (role_fd);
+            new_roles.take ((owned) role_fd);
         }
 
       if (!Folks.Internal.equal_sets<RoleFieldDetails> (new_roles, this._roles))
@@ -1376,7 +1376,7 @@ public class Edsf.Persona : Folks.Persona,
               if (assistant != null && manager != "")
                 default_role.set_parameter ("assistant", (!) assistant);
 
-              _default_role = default_role;
+              _default_role = (owned) default_role;
             }
         }
 
@@ -1434,7 +1434,7 @@ public class Edsf.Persona : Folks.Persona,
 
           var email_fd = new EmailFieldDetails ((!) val);
           this._update_params (email_fd, attr);
-          new_email_addresses.add (email_fd);
+          new_email_addresses.take ((owned) email_fd);
         }
 
       if (!Folks.Internal.equal_sets<EmailFieldDetails> (new_email_addresses,
@@ -1477,7 +1477,7 @@ public class Edsf.Persona : Folks.Persona,
       if (n != null && n != "")
         {
           var note = new NoteFieldDetails ((!) n);
-          new_notes.add (note);
+          new_notes.take ((owned) note);
         }
 
       if (!Folks.Internal.equal_sets<NoteFieldDetails> (new_notes, this._notes))
@@ -1638,7 +1638,7 @@ public class Edsf.Persona : Folks.Persona,
             {
               var fd_u = new UrlFieldDetails ((!) u);
               fd_u.set_parameter (AbstractFieldDetails.PARAM_TYPE, folks_type);
-              new_urls.add (fd_u);
+              new_urls.take ((owned) fd_u);
             }
         }
 
@@ -1656,7 +1656,7 @@ public class Edsf.Persona : Folks.Persona,
 
               var url_fd = new UrlFieldDetails ((!) val);
               this._update_params (url_fd, attr);
-              new_urls.add (url_fd);
+              new_urls.take ((owned) url_fd);
             }
         }
 
@@ -2006,7 +2006,7 @@ public class Edsf.Persona : Folks.Persona,
 
           var phone_fd = new PhoneFieldDetails ((!) val);
           this._update_params (phone_fd, attr);
-          new_phone_numbers.add (phone_fd);
+          new_phone_numbers.take ((owned) phone_fd);
         }
 
       // Does not use phone comparison because this will try to match only
@@ -2118,7 +2118,7 @@ public class Edsf.Persona : Folks.Persona,
 
           var pa_fd = new PostalAddressFieldDetails (address);
           this._update_params (pa_fd, attr);
-          new_postal_addresses.add (pa_fd);
+          new_postal_addresses.take ((owned) pa_fd);
         }
 
       if (!Folks.Internal.equal_sets<PostalAddressFieldDetails> (
diff --git a/folks/folks-generics.vapi b/folks/folks-generics.vapi
index 0f55c989..3a562a87 100644
--- a/folks/folks-generics.vapi
+++ b/folks/folks-generics.vapi
@@ -44,6 +44,9 @@ namespace Folks
 #if FOLKS_COMPILATION
     [CCode (cheader_filename = "folks/small-set-internal.h")]
     public unowned G @get (int i);
+
+    [CCode (cheader_filename = "folks/small-set-internal.h")]
+    public bool take (owned G item);
 #endif
   }
 }
diff --git a/folks/individual.vala b/folks/individual.vala
index d5daa146..5ce4af6b 100644
--- a/folks/individual.vala
+++ b/folks/individual.vala
@@ -2555,7 +2555,7 @@ public class Folks.Individual : Object,
                                   new UrlFieldDetails (url_fd.value);
                               new_url_fd.extend_parameters (url_fd.parameters);
                               urls_set.set (new_url_fd.value, new_url_fd);
-                              new_urls.add (new_url_fd);
+                              new_urls.take ((owned) new_url_fd);
                             }
                         }
                     }
@@ -2612,7 +2612,7 @@ public class Folks.Individual : Object,
                                   new PhoneFieldDetails (phone_fd.value);
                               new_fd.extend_parameters (phone_fd.parameters);
                               phone_numbers_set.set (new_fd.value, new_fd);
-                              new_phone_numbers.add (new_fd);
+                              new_phone_numbers.take ((owned) new_fd);
                             }
                         }
                     }
@@ -2671,7 +2671,7 @@ public class Folks.Individual : Object,
                                   new EmailFieldDetails (email_fd.value,
                                       email_fd.parameters);
                               emails_set.set (new_email_fd.value, new_email_fd);
-                              new_email_addresses.add (new_email_fd);
+                              new_email_addresses.take ((owned) new_email_fd);
                             }
                         }
                     }
diff --git a/folks/small-set.c b/folks/small-set.c
index b5a19683..9fc4ef78 100644
--- a/folks/small-set.c
+++ b/folks/small-set.c
@@ -549,6 +549,29 @@ folks_small_set_contains (GeeAbstractCollection *collection,
   return _find (self, item, NULL);
 }
 
+/*
+ * folks_small_set_take:
+ * @self: A #FolksSmallSet
+ * @item: (transfer full):
+ *
+ * Adds @item and takes ownership.
+ *
+ * Returns: %TRUE if it was not already there.
+ */
+gboolean
+folks_small_set_take (FolksSmallSet *self,
+    gpointer item)
+{
+  g_return_val_if_fail (self != NULL, FALSE);
+  g_return_val_if_fail ((self->flags & FOLKS_SMALL_SET_FLAG_READ_ONLY) == 0, FALSE);
+
+  if (_find (self, item, NULL))
+    return FALSE;
+
+  g_ptr_array_add (self->items, item);
+  return TRUE;
+}
+
 /*
  * Add @item.
  *
diff --git a/tests/eds/add-contacts-stress-test.vala b/tests/eds/add-contacts-stress-test.vala
index 74b9dab2..7588fc4d 100644
--- a/tests/eds/add-contacts-stress-test.vala
+++ b/tests/eds/add-contacts-stress-test.vala
@@ -28,7 +28,7 @@ public class AddContactsStressTestTests : EdsTest.TestCase
   private Edsf.PersonaStore _pstore;
   private bool _added_contacts = false;
   private HashTable<string, bool> _contacts_found;
-  private int _contacts_cnt = 1000;
+  private int _contacts_cnt = 10000;
   private DateTime _start_time;
 
   public AddContactsStressTestTests ()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]