[folks] Modified libfolks to use LinkedHashSet in im_addresses.



commit f1f826688cfec808d98bf3e588735812cde6160c
Author: Eitan Isaacson <eitan monotonous org>
Date:   Sun Jan 16 11:47:50 2011 +0200

    Modified libfolks to use LinkedHashSet in im_addresses.

 NEWS                             |    1 +
 folks/imable.vala                |    4 ++--
 folks/individual-aggregator.vala |   34 ++++++++--------------------------
 folks/individual.vala            |   29 +++++++++--------------------
 4 files changed, 20 insertions(+), 48 deletions(-)
---
diff --git a/NEWS b/NEWS
index b1ea5e5..11652cc 100644
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ Major changes:
 
 API changes:
 * New type: LinkedHashSet, similar to Gee.HashSet, but ordered.
+* IMable.im_addresses is now a mapping of string to LinkedHashSet.
 
 Bugs fixed:
 * Bug 637240 â?? libfolks-telepathy.so exports private symbols
diff --git a/folks/imable.vala b/folks/imable.vala
index 25be0df..298c1d0 100644
--- a/folks/imable.vala
+++ b/folks/imable.vala
@@ -57,9 +57,9 @@ public interface Folks.IMable : Object
    * All the IM addresses must be normalised using
    * { link IMable.normalise_im_address} before being added to this property.
    *
-   * @since 0.1.13
+   * @since 0.3.UNRELEASED
    */
-  public abstract HashTable<string, GenericArray<string>> im_addresses
+  public abstract HashTable<string, LinkedHashSet<string>> im_addresses
     {
       get; set;
     }
diff --git a/folks/individual-aggregator.vala b/folks/individual-aggregator.vala
index a1d6e7c..a284e6f 100644
--- a/folks/individual-aggregator.vala
+++ b/folks/individual-aggregator.vala
@@ -878,14 +878,9 @@ public class Folks.IndividualAggregator : Object
       /* FIXME: We hardcode this to use the key-file backend for now */
       assert (this._writeable_store.type_id == "key-file");
 
-      /* `protocols_addrs_list` will be passed to the new Kf.Persona, whereas
-       * `protocols_addrs_set` is used to ensure we don't get duplicate IM
-       * addresses in the ordered set of addresses for each protocol in
-       * `protocols_addrs_list`. It's temporary. */
-      var protocols_addrs_list =
-          new HashTable<string, GenericArray<string>> (str_hash, str_equal);
+      /* `protocols_addrs_set` will be passed to the new Kf.Persona */
       var protocols_addrs_set =
-          new HashTable<string, HashSet<string>> (str_hash, str_equal);
+          new HashTable<string, LinkedHashSet<string>> (str_hash, str_equal);
 
       foreach (var persona in personas)
         {
@@ -895,37 +890,24 @@ public class Folks.IndividualAggregator : Object
           ((IMable) persona).im_addresses.foreach ((k, v) =>
             {
               unowned string protocol = (string) k;
-              unowned GenericArray<string> addresses = (GenericArray<string>) v;
+              unowned LinkedHashSet<string> addresses =
+                (LinkedHashSet<string>) v;
 
-              var address_list = protocols_addrs_list.lookup (protocol);
               var address_set = protocols_addrs_set.lookup (protocol);
 
-              if (address_list == null || address_set == null)
+              if (address_set == null)
                 {
-                  address_list = new GenericArray<string> ();
-                  address_set = new HashSet<string> ();
+                  address_set = new LinkedHashSet<string> ();
 
-                  protocols_addrs_list.insert (protocol, address_list);
                   protocols_addrs_set.insert (protocol, address_set);
                 }
 
-              addresses.foreach ((a) =>
-                {
-                  unowned string address = (string) a;
-
-                  /* Only add the IM address to the ordered set if it isn't
-                   * already a member. */
-                  if (!address_set.contains (address))
-                    {
-                      address_list.add (address);
-                      address_set.add (address);
-                    }
-                });
+              address_set.add_all (addresses);
             });
         }
 
       var addresses_value = Value (typeof (HashTable));
-      addresses_value.set_boxed (protocols_addrs_list);
+      addresses_value.set_boxed (protocols_addrs_set);
 
       var details = new HashTable<string, Value?> (str_hash, str_equal);
       details.insert ("im-addresses", addresses_value);
diff --git a/folks/individual.vala b/folks/individual.vala
index b07e4b1..64717b1 100644
--- a/folks/individual.vala
+++ b/folks/individual.vala
@@ -88,7 +88,7 @@ public class Folks.Individual : Object,
   /* The number of Personas in this Individual which have
    * Persona.is_user == true. Iff this is > 0, Individual.is_user == true. */
   private uint _persona_user_count = 0;
-  private HashTable<string, GenericArray<string>> _im_addresses;
+  private HashTable<string, LinkedHashSet<string>> _im_addresses;
 
   /**
    * The trust level of the Individual.
@@ -267,7 +267,7 @@ public class Folks.Individual : Object,
   /**
    * { inheritDoc}
    */
-  public HashTable<string, GenericArray<string>> im_addresses
+  public HashTable<string, LinkedHashSet<string>> im_addresses
     {
       get { return this._im_addresses; }
       private set {}
@@ -372,7 +372,7 @@ public class Folks.Individual : Object,
   public Individual (GLib.List<Persona>? personas)
     {
       this._im_addresses =
-          new HashTable<string, GenericArray<string>> (str_hash, str_equal);
+          new HashTable<string, LinkedHashSet<string>> (str_hash, str_equal);
       this._persona_set = new HashSet<Persona> (null, null);
       this._stores = new HashMap<PersonaStore, uint> (null, null);
       this.personas = personas;
@@ -694,27 +694,16 @@ public class Folks.Individual : Object,
               imable.im_addresses.foreach ((k, v) =>
                 {
                   var cur_protocol = (string) k;
-                  var cur_addresses = (GenericArray<string>) v;
-                  var old_im_array = this._im_addresses.lookup (cur_protocol);
-                  var im_array = new GenericArray<string> ();
+                  var cur_addresses = (LinkedHashSet<string>) v;
+                  var im_set = this._im_addresses.lookup (cur_protocol);
 
-                  /* use a set to eliminate duplicates */
-                  var address_set = new HashSet<string> (str_hash, str_equal);
-                  if (old_im_array != null)
+                  if (im_set == null)
                     {
-                      old_im_array.foreach ((old_address) =>
-                        {
-                          address_set.add ((string) old_address);
-                        });
+                      im_set = new LinkedHashSet<string> ();
+                      this._im_addresses.insert (cur_protocol, im_set);
                     }
-                  cur_addresses.foreach ((cur_address) =>
-                    {
-                      address_set.add ((string) cur_address);
-                    });
-                  foreach (string addr in address_set)
-                    im_array.add (addr);
 
-                  this._im_addresses.insert (cur_protocol, im_array);
+                  im_set.add_all (cur_addresses);
                 });
             }
         }



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