Post-release version bump
[platform/upstream/folks.git] / folks / utils.vala
1 /*
2  * Copyright (C) 2011 Collabora Ltd.
3  *
4  * This library is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 2.1 of the License, or
7  * (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this library.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  * Authors:
18  *       Raul Gutierrez Segales <raul.gutierrez.segales@collabora.co.uk>
19  *       Travis Reitter <travis.reitter@collabora.co.uk>
20  */
21
22 using Gee;
23
24 /**
25  * Utility functions to simplify common patterns in Folks client code.
26  *
27  * @since 0.6.0
28  */
29 public class Folks.Utils : Object
30 {
31   internal static bool _str_equal_safe (string a, string b)
32     {
33       return (a != "" && b != "" && a.down () == b.down ());
34     }
35
36   /**
37    * Check whether two multi-maps of strings to strings are equal. This performs
38    * a deep check for equality, checking whether both maps are of the same size,
39    * and that each key maps to the same set of values in both maps.
40    *
41    * @param a a multi-map to compare
42    * @param b another multi-map to compare
43    * @return `true` if the multi-maps are equal, `false` otherwise
44    *
45    * @since 0.6.0
46    */
47   public static bool multi_map_str_str_equal (
48       MultiMap<string, string> a,
49       MultiMap<string, string> b)
50     {
51       if (a == b)
52         return true;
53
54       if (a.size == b.size)
55         {
56           foreach (var key in a.get_keys ())
57             {
58               if (b.contains (key))
59                 {
60                   var a_values = a.get (key);
61                   var b_values = b.get (key);
62                   if (a_values.size != b_values.size)
63                     return false;
64
65                   foreach (var a_value in a_values)
66                     {
67                       if (!b_values.contains (a_value))
68                         return false;
69                     }
70                 }
71               else
72                 {
73                   return false;
74                 }
75             }
76         }
77       else
78         {
79           return false;
80         }
81
82       return true;
83     }
84
85   /**
86    * Check whether two multi-maps of strings to AbstractFieldDetails are equal.
87    *
88    * This performs a deep check for equality, checking whether both maps are of
89    * the same size, and that each key maps to the same set of values in both
90    * maps.
91    *
92    * @param a a multi-map to compare
93    * @param b another multi-map to compare
94    * @return `true` if the multi-maps are equal, `false` otherwise
95    *
96    * @since 0.6.0
97    */
98   public static bool multi_map_str_afd_equal (
99       MultiMap<string, AbstractFieldDetails> a,
100       MultiMap<string, AbstractFieldDetails> b)
101     {
102       if (a == b)
103         return true;
104
105       if (a.size == b.size)
106         {
107           foreach (var key in a.get_keys ())
108             {
109               if (b.contains (key))
110                 {
111                   var a_values = a.get (key);
112                   var b_values = b.get (key);
113                   if (a_values.size != b_values.size)
114                     return false;
115
116                   foreach (var a_value in a_values)
117                     {
118                       if (!b_values.contains (a_value))
119                         return false;
120                     }
121                 }
122               else
123                 {
124                   return false;
125                 }
126             }
127         }
128       else
129         {
130           return false;
131         }
132
133       return true;
134     }
135
136   /**
137    * Check whether a set of strings to AbstractFieldDetails are equal.
138    *
139    * This performs a deep check for equality, checking whether both sets are of
140    * the same size, and that each key maps to the same set of values in both
141    * maps.
142    *
143    * @param a a set to compare
144    * @param b another set to compare
145    * @return `true` if the sets are equal, `false` otherwise
146    *
147    * @since 0.6.0
148    */
149   public static bool set_afd_equal (
150       Set<AbstractFieldDetails> a,
151       Set<AbstractFieldDetails> b)
152     {
153       if (a == b)
154         return true;
155
156       if (a.size == b.size)
157         {
158           foreach (var val in a)
159             {
160               if (!b.contains (val))
161                 {
162                   return false;
163                 }
164             }
165         }
166       else
167         {
168           return false;
169         }
170
171       return true;
172     }
173 }