OLD | NEW |
| (Empty) |
1 // Copyright (c) 2014, 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 /// Some common utilities used by other libraries in this package. | |
6 library smoke.src.common; | |
7 | |
8 import 'package:smoke/smoke.dart' as smoke show isSubclassOf; | |
9 | |
10 /// Returns [input] adjusted to be within [min] and [max] length. Truncating it | |
11 /// if it's longer, or padding it with nulls if it's shorter. The returned list | |
12 /// is a new copy if any modification is needed, otherwise [input] is returned. | |
13 List adjustList(List input, int min, int max) { | |
14 if (input.length < min) { | |
15 return new List(min)..setRange(0, input.length, input); | |
16 } | |
17 | |
18 if (input.length > max) { | |
19 return new List(max)..setRange(0, max, input); | |
20 } | |
21 return input; | |
22 } | |
23 | |
24 /// Returns whether [metadata] contains any annotation that is either equal to | |
25 /// an annotation in [queryAnnotations] or whose type is listed in | |
26 /// [queryAnnotations]. | |
27 bool matchesAnnotation(Iterable metadata, Iterable queryAnnotations) { | |
28 for (var meta in metadata) { | |
29 for (var queryMeta in queryAnnotations) { | |
30 if (meta == queryMeta) return true; | |
31 if (queryMeta is Type && | |
32 smoke.isSubclassOf(meta.runtimeType, queryMeta)) return true; | |
33 } | |
34 } | |
35 return false; | |
36 } | |
37 | |
38 /// Number of arguments supported by [minArgs] and [maxArgs]. | |
39 const SUPPORTED_ARGS = 3; | |
40 | |
41 typedef _Func0(); | |
42 typedef _Func1(a); | |
43 typedef _Func2(a, b); | |
44 typedef _Func3(a, b, c); | |
45 | |
46 /// Returns the minimum number of arguments that [f] takes as input, in other | |
47 /// words, the total number of required arguments of [f]. If [f] expects more | |
48 /// than [SUPPORTED_ARGS], this function returns `SUPPORTED_ARGS + 1`. | |
49 /// | |
50 /// For instance, the current implementation only supports calculating the | |
51 /// number of arguments between `0` and `3`. If the function takes `4` or more, | |
52 /// this function automatically returns `4`. | |
53 int minArgs(Function f) { | |
54 if (f is _Func0) return 0; | |
55 if (f is _Func1) return 1; | |
56 if (f is _Func2) return 2; | |
57 if (f is _Func3) return 3; | |
58 return SUPPORTED_ARGS + 1; | |
59 } | |
60 | |
61 /// Returns the maximum number of arguments that [f] takes as input, which is | |
62 /// the total number of required and optional arguments of [f]. If | |
63 /// [f] may take more than [SUPPORTED_ARGS] required arguments, this function | |
64 /// returns `-1`. However, if it takes less required arguments, but more than | |
65 /// [SUPPORTED_ARGS] arguments including optional arguments, the result will be | |
66 /// [SUPPORTED_ARGS]. | |
67 /// | |
68 /// For instance, the current implementation only supports calculating the | |
69 /// number of arguments between `0` and `3`. If the function takes `4` | |
70 /// mandatory arguments, this function returns `-1`, but if the funtion takes | |
71 /// `2` mandatory arguments and 10 optional arguments, this function returns | |
72 /// `3`. | |
73 int maxArgs(Function f) { | |
74 if (f is _Func3) return 3; | |
75 if (f is _Func2) return 2; | |
76 if (f is _Func1) return 1; | |
77 if (f is _Func0) return 0; | |
78 return -1; | |
79 } | |
80 | |
81 /// Shallow comparison of two lists. | |
82 bool compareLists(List a, List b, {bool unordered: false}) { | |
83 if (a == null && b != null) return false; | |
84 if (a != null && b == null) return false; | |
85 if (a.length != b.length) return false; | |
86 if (unordered) { | |
87 var countMap = {}; | |
88 for (var x in b) { | |
89 var count = countMap[x]; | |
90 if (count == null) count = 0; | |
91 countMap[x] = count + 1; | |
92 } | |
93 for (var x in a) { | |
94 var count = countMap[x]; | |
95 if (count == null) return false; | |
96 if (count == 1) { | |
97 countMap.remove(x); | |
98 } else { | |
99 countMap[x] = count - 1; | |
100 } | |
101 } | |
102 return countMap.isEmpty; | |
103 } else { | |
104 for (int i = 0; i < a.length; i++) { | |
105 if (a[i] != b[i]) return false; | |
106 } | |
107 } | |
108 return true; | |
109 } | |
110 | |
111 /// Shallow comparison of two maps. | |
112 bool compareMaps(Map a, Map b) { | |
113 if (a == null && b != null) return false; | |
114 if (a != null && b == null) return false; | |
115 if (a.length != b.length) return false; | |
116 for (var k in a.keys) { | |
117 if (!b.containsKey(k) || a[k] != b[k]) return false; | |
118 } | |
119 return true; | |
120 } | |
OLD | NEW |