Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: utils/pub/yaml/deep_equals.dart

Issue 11622011: Restructure YAML package suitable for pub lish (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: add yaml exclude Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « utils/pub/yaml/constructor.dart ('k') | utils/pub/yaml/model.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library deep_equals;
6
7 /// Returns whether two objects are structurally equivalent. This considers NaN
8 /// values to be equivalent. It also handles self-referential structures.
9 bool deepEquals(obj1, obj2, [List parents1, List parents2]) {
10 if (identical(obj1, obj2)) return true;
11 if (parents1 == null) {
12 parents1 = [];
13 parents2 = [];
14 }
15
16 // parents1 and parents2 are guaranteed to be the same size.
17 for (var i = 0; i < parents1.length; i++) {
18 var loop1 = identical(obj1, parents1[i]);
19 var loop2 = identical(obj2, parents2[i]);
20 // If both structures loop in the same place, they're equal at that point in
21 // the structure. If one loops and the other doesn't, they're not equal.
22 if (loop1 && loop2) return true;
23 if (loop1 || loop2) return false;
24 }
25
26 parents1.add(obj1);
27 parents2.add(obj2);
28 try {
29 if (obj1 is List && obj2 is List) {
30 return _listEquals(obj1, obj2, parents1, parents2);
31 } else if (obj1 is Map && obj2 is Map) {
32 return _mapEquals(obj1, obj2, parents1, parents2);
33 } else if (obj1 is double && obj2 is double) {
34 return _doubleEquals(obj1, obj2);
35 } else {
36 return obj1 == obj2;
37 }
38 } finally {
39 parents1.removeLast();
40 parents2.removeLast();
41 }
42 }
43
44 /// Returns whether [list1] and [list2] are structurally equal.
45 bool _listEquals(List list1, List list2, List parents1, List parents2) {
46 if (list1.length != list2.length) return false;
47
48 for (var i = 0; i < list1.length; i++) {
49 if (!deepEquals(list1[i], list2[i], parents1, parents2)) return false;
50 }
51
52 return true;
53 }
54
55 /// Returns whether [map1] and [map2] are structurally equal.
56 bool _mapEquals(Map map1, Map map2, List parents1, List parents2) {
57 if (map1.length != map2.length) return false;
58
59 for (var key in map1.keys) {
60 if (!map2.containsKey(key)) return false;
61 if (!deepEquals(map1[key], map2[key], parents1, parents2)) return false;
62 }
63
64 return true;
65 }
66
67 /// Returns whether two doubles are equivalent. This differs from `d1 == d2` in
68 /// that it considers NaN to be equal to itself.
69 bool _doubleEquals(double d1, double d2) {
70 if (d1.isNaN && d2.isNaN) return true;
71 return d1 == d2;
72 }
OLDNEW
« no previous file with comments | « utils/pub/yaml/constructor.dart ('k') | utils/pub/yaml/model.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698