+
+ # Remove the item at `k1`, `k2` and `k3`
+ fun remove_at(k1: K1, k2: K2, k3: K3)
+ do
+ var level1 = self.level1
+ var level2 = level1.get_or_null(k1)
+ if level2 == null then return
+ level2.remove_at(k2, k3)
+ end
+
+ # Remove all items
+ fun clear do level1.clear
+end
+
+# A map with a default value.
+#
+# ~~~~
+# var dm = new DefaultMap[String, Int](10)
+# assert dm["a"] == 10
+# ~~~~
+#
+# The default value is used when the key is not present.
+# And getting a default value does not register the key.
+#
+# ~~~~
+# assert dm["a"] == 10
+# assert dm.length == 0
+# assert dm.has_key("a") == false
+# ~~~~
+#
+# It also means that removed key retrieve the default value.
+#
+# ~~~~
+# dm["a"] = 2
+# assert dm["a"] == 2
+# dm.keys.remove("a")
+# assert dm["a"] == 10
+# ~~~~
+#
+# Warning: the default value is used as is, so using mutable object might
+# cause side-effects.
+#
+# ~~~~
+# var dma = new DefaultMap[String, Array[Int]](new Array[Int])
+#
+# dma["a"].add(65)
+# assert dma["a"] == [65]
+# assert dma.default == [65]
+# assert dma["c"] == [65]
+#
+# dma["b"] += [66]
+# assert dma["b"] == [65, 66]
+# assert dma.default == [65]
+# ~~~~
+class DefaultMap[K, V]
+ super HashMap[K, V]
+
+ # The default value.
+ var default: V
+
+ redef fun provide_default_value(key) do return default