lib: remove warnings on hash_debug, more_collections, ordered_tree, and poset
[nit.git] / lib / more_collections.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Highly specific, but useful, collections-related classes.
16 module more_collections
17
18 # Simple way to store an `HashMap[K, Array[V]]`
19 #
20 # Unlike standard HashMap, MultiHashMap provides a new
21 # empty array on the first access on a unknown key.
22 #
23 # var m = new MultiHashMap[String, Char]
24 # assert not m.has_key("four")
25 # m["four"].add('i')
26 # m["four"].add('i')
27 # m["four"].add('i')
28 # m["four"].add('i')
29 # assert m.has_key("four")
30 # assert m["four"] == ['i', 'i', 'i', 'i']
31 # assert m["zzz"] == new Array[Char]
32 class MultiHashMap[K: Object, V]
33 super HashMap[K, Array[V]]
34
35 # Add `v` to the array associated with `k`.
36 # If there is no array associated, then create it.
37 fun add_one(k: K, v: V)
38 do
39 if self.has_key(k) then
40 self[k].add(v)
41 else
42 self[k] = [v]
43 end
44 end
45
46 redef fun provide_default_value(key) do
47 var res = new Array[V]
48 self[key] = res
49 return res
50 end
51 end
52
53 # Simple way to store an `HashMap[K1, HashMap[K2, V]]`
54 class HashMap2[K1: Object, K2: Object, V]
55 private var level1 = new HashMap[K1, HashMap[K2, V]]
56
57 # Return the value associated to the keys `k1` and `k2`.
58 # Return `null` if no such a value.
59 fun [](k1: K1, k2: K2): nullable V
60 do
61 var level1 = self.level1
62 if not level1.has_key(k1) then return null
63 var level2 = level1[k1]
64 if not level2.has_key(k2) then return null
65 return level2[k2]
66 end
67
68 # Set `v` the value associated to the keys `k1` and `k2`.
69 fun []=(k1: K1, k2: K2, v: V)
70 do
71 var level1 = self.level1
72 var level2: HashMap[K2, V]
73 if not level1.has_key(k1) then
74 level2 = new HashMap[K2, V]
75 level1[k1] = level2
76 else
77 level2 = level1[k1]
78 end
79 level2[k2] = v
80 end
81 end
82
83 # Simple way to store an `HashMap[K1, HashMap[K2, HashMap[K3, V]]]`
84 class HashMap3[K1: Object, K2: Object, K3: Object, V]
85 private var level1 = new HashMap[K1, HashMap2[K2, K3, V]]
86
87 # Return the value associated to the keys `k1`, `k2`, and `k3`.
88 # Return `null` if no such a value.
89 fun [](k1: K1, k2: K2, k3: K3): nullable V
90 do
91 var level1 = self.level1
92 if not level1.has_key(k1) then return null
93 var level2 = level1[k1]
94 return level2[k2, k3]
95 end
96
97 # Set `v` the value associated to the keys `k1`, `k2`, and `k3`.
98 fun []=(k1: K1, k2: K2, k3: K3, v: V)
99 do
100 var level1 = self.level1
101 var level2: HashMap2[K2, K3, V]
102 if not level1.has_key(k1) then
103 level2 = new HashMap2[K2, K3, V]
104 level1[k1] = level2
105 else
106 level2 = level1[k1]
107 end
108 level2[k2, k3] = v
109 end
110 end
111
112 # A map with a default value.
113 class DefaultMap[K: Object, V]
114 super HashMap[K, V]
115
116 # The default value.
117 var default: V
118
119 redef fun provide_default_value(key) do return default
120 end