mt-lang 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/docs/index.html +4 -3
- data/lib/milk_tea/base.rb +1 -1
- data/std/asset_pack.mt +267 -0
- data/std/async/libuv_runtime.mt +539 -0
- data/std/async/mailbox.mt +191 -0
- data/std/async/runtime.mt +87 -0
- data/std/async.mt +87 -0
- data/std/base64.mt +185 -0
- data/std/behavior_tree.mt +396 -0
- data/std/binary.mt +314 -0
- data/std/binary_heap.mt +157 -0
- data/std/bitset.mt +239 -0
- data/std/box2d.mt +535 -0
- data/std/bytes.mt +46 -0
- data/std/c/box2d.mt +1254 -0
- data/std/c/cgltf.mt +647 -0
- data/std/c/cjson.mt +106 -0
- data/std/c/crypto.mt +11 -0
- data/std/c/crypto_support.h +51 -0
- data/std/c/ctype.mt +19 -0
- data/std/c/ctype_bindgen.h +29 -0
- data/std/c/curl.mt +1223 -0
- data/std/c/enet.mt +473 -0
- data/std/c/errno.mt +41 -0
- data/std/c/errno_bindgen.h +53 -0
- data/std/c/flecs.mt +2945 -0
- data/std/c/fs.linux.mt +43 -0
- data/std/c/fs.windows.mt +43 -0
- data/std/c/fs_support.h +954 -0
- data/std/c/gl.mt +2065 -0
- data/std/c/gl_registry_helpers.h +10748 -0
- data/std/c/glfw.mt +499 -0
- data/std/c/libc.mt +167 -0
- data/std/c/libuv.mt +1491 -0
- data/std/c/math.mt +22 -0
- data/std/c/math_bindgen.h +31 -0
- data/std/c/miniaudio.mt +3420 -0
- data/std/c/pcre2.mt +735 -0
- data/std/c/process.mt +58 -0
- data/std/c/process_support.h +1147 -0
- data/std/c/raygui.mt +1602 -0
- data/std/c/raylib.mt +1245 -0
- data/std/c/raymath.mt +163 -0
- data/std/c/rlgl.mt +434 -0
- data/std/c/rpng.mt +60 -0
- data/std/c/rres.mt +187 -0
- data/std/c/sdl3.mt +4132 -0
- data/std/c/sqlite3.mt +951 -0
- data/std/c/stb_image.mt +52 -0
- data/std/c/stb_image_resize2.mt +128 -0
- data/std/c/stb_image_write.mt +19 -0
- data/std/c/stb_rect_pack.mt +38 -0
- data/std/c/stb_truetype.mt +175 -0
- data/std/c/stb_vorbis.mt +31 -0
- data/std/c/stdio.mt +90 -0
- data/std/c/steamworks.h +5769 -0
- data/std/c/steamworks.mt +4771 -0
- data/std/c/string.mt +16 -0
- data/std/c/string_bindgen.h +36 -0
- data/std/c/sync.mt +33 -0
- data/std/c/sync_support.h +219 -0
- data/std/c/terminal.mt +24 -0
- data/std/c/terminal_support.h +408 -0
- data/std/c/time.mt +26 -0
- data/std/c/tls.mt +24 -0
- data/std/c/tls_support.h +626 -0
- data/std/c/tracy.mt +53 -0
- data/std/c/zlib.mt +20 -0
- data/std/c/zlib_support.h +239 -0
- data/std/c/zstd.mt +231 -0
- data/std/cell.mt +60 -0
- data/std/cgltf.mt +115 -0
- data/std/cjson.mt +90 -0
- data/std/cli.mt +768 -0
- data/std/cookie.mt +198 -0
- data/std/counter.mt +160 -0
- data/std/crypto.mt +74 -0
- data/std/cstring.mt +13 -0
- data/std/ctype.mt +52 -0
- data/std/curl/runtime.mt +261 -0
- data/std/curl.mt +38 -0
- data/std/deque.mt +348 -0
- data/std/encoding.mt +93 -0
- data/std/enet.mt +133 -0
- data/std/env.mt +41 -0
- data/std/errno.mt +47 -0
- data/std/flecs.mt +978 -0
- data/std/fmt.mt +271 -0
- data/std/fs.linux.mt +696 -0
- data/std/fs.windows.mt +711 -0
- data/std/fsm.mt +267 -0
- data/std/gl.mt +2062 -0
- data/std/glfw.mt +471 -0
- data/std/goap.mt +342 -0
- data/std/graph.mt +521 -0
- data/std/gzip.mt +77 -0
- data/std/hash.mt +429 -0
- data/std/http/server.mt +810 -0
- data/std/http.mt +1227 -0
- data/std/intern.mt +53 -0
- data/std/jobs.mt +288 -0
- data/std/json.mt +627 -0
- data/std/libc.mt +34 -0
- data/std/libuv.mt +554 -0
- data/std/linear_algebra.mt +243 -0
- data/std/linked_map.mt +372 -0
- data/std/linked_map_view.mt +49 -0
- data/std/linked_set.mt +117 -0
- data/std/log.mt +69 -0
- data/std/map.mt +418 -0
- data/std/math.mt +24 -0
- data/std/mem/arena.mt +137 -0
- data/std/mem/endian.mt +51 -0
- data/std/mem/heap.mt +298 -0
- data/std/mem/pool.mt +164 -0
- data/std/mem/stack.mt +47 -0
- data/std/mem/tracking.mt +119 -0
- data/std/miniaudio.mt +1299 -0
- data/std/multiset.mt +191 -0
- data/std/net/channel.mt +727 -0
- data/std/net/clock.mt +237 -0
- data/std/net/discovery.mt +277 -0
- data/std/net/lobby.mt +813 -0
- data/std/net/manager.mt +539 -0
- data/std/net/mux.mt +839 -0
- data/std/net/nat.mt +122 -0
- data/std/net/packet.mt +219 -0
- data/std/net/punch.mt +162 -0
- data/std/net/rpc.mt +119 -0
- data/std/net/session.mt +1157 -0
- data/std/net/stun.mt +252 -0
- data/std/net/sync.mt +183 -0
- data/std/net/turn.mt +459 -0
- data/std/net.mt +2944 -0
- data/std/oauth2.mt +408 -0
- data/std/option.mt +51 -0
- data/std/ordered_map.mt +497 -0
- data/std/ordered_set.mt +348 -0
- data/std/path.mt +368 -0
- data/std/pcre2/runtime.mt +35 -0
- data/std/pcre2.mt +78 -0
- data/std/priority_queue.mt +55 -0
- data/std/process.mt +837 -0
- data/std/queue.mt +55 -0
- data/std/random.mt +146 -0
- data/std/raygui.mt +99 -0
- data/std/raylib/debug_console.mt +71 -0
- data/std/raylib/easing.mt +388 -0
- data/std/raylib/packed_assets.mt +255 -0
- data/std/raylib/runtime.mt +30 -0
- data/std/raylib/tracy_gpu.mt +37 -0
- data/std/raylib.mt +1510 -0
- data/std/raymath.mt +153 -0
- data/std/result.mt +89 -0
- data/std/rlgl.mt +268 -0
- data/std/rpng.mt +46 -0
- data/std/rres.mt +36 -0
- data/std/sdl3/runtime.mt +54 -0
- data/std/sdl3.mt +1731 -0
- data/std/serialize.mt +68 -0
- data/std/set.mt +124 -0
- data/std/spatial.mt +176 -0
- data/std/sqlite3.mt +151 -0
- data/std/stack.mt +55 -0
- data/std/stb_image.mt +47 -0
- data/std/stb_image_resize2.mt +41 -0
- data/std/stb_image_write.mt +17 -0
- data/std/stb_rect_pack.mt +15 -0
- data/std/stb_truetype.mt +77 -0
- data/std/stb_vorbis.mt +16 -0
- data/std/stdio.mt +88 -0
- data/std/steamworks.mt +1542 -0
- data/std/str.mt +293 -0
- data/std/string.mt +234 -0
- data/std/sync.mt +194 -0
- data/std/tar.mt +704 -0
- data/std/terminal.mt +1002 -0
- data/std/testing.mt +266 -0
- data/std/thread.mt +120 -0
- data/std/time.mt +105 -0
- data/std/tls.mt +616 -0
- data/std/toml.mt +1310 -0
- data/std/tracy.mt +42 -0
- data/std/uri.mt +118 -0
- data/std/url.mt +372 -0
- data/std/vec.mt +433 -0
- data/std/zstd.mt +94 -0
- metadata +187 -2
data/std/ordered_map.mt
ADDED
|
@@ -0,0 +1,497 @@
|
|
|
1
|
+
import std.mem.heap as heap
|
|
2
|
+
|
|
3
|
+
struct Node[K, V]:
|
|
4
|
+
key: K
|
|
5
|
+
value: V
|
|
6
|
+
left: ptr[Node[K, V]]?
|
|
7
|
+
right: ptr[Node[K, V]]?
|
|
8
|
+
parent: ptr[Node[K, V]]?
|
|
9
|
+
height: int
|
|
10
|
+
|
|
11
|
+
struct SearchResult[K, V]:
|
|
12
|
+
node: ptr[Node[K, V]]?
|
|
13
|
+
parent: ptr[Node[K, V]]?
|
|
14
|
+
compare: int
|
|
15
|
+
found: bool
|
|
16
|
+
|
|
17
|
+
public struct Entry[K, V]:
|
|
18
|
+
key: const_ptr[K]
|
|
19
|
+
value: ptr[V]
|
|
20
|
+
|
|
21
|
+
public struct RemovedEntry[K, V]:
|
|
22
|
+
key: K
|
|
23
|
+
value: V
|
|
24
|
+
|
|
25
|
+
public struct Keys[K, V]:
|
|
26
|
+
node: ptr[Node[K, V]]?
|
|
27
|
+
|
|
28
|
+
public struct Values[K, V]:
|
|
29
|
+
node: ptr[Node[K, V]]?
|
|
30
|
+
|
|
31
|
+
public struct Entries[K, V]:
|
|
32
|
+
node: ptr[Node[K, V]]?
|
|
33
|
+
started: bool
|
|
34
|
+
|
|
35
|
+
public struct OrderedMap[K, V]:
|
|
36
|
+
root: ptr[Node[K, V]]?
|
|
37
|
+
len: ptr_uint
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
extending OrderedMap[K, V]:
|
|
41
|
+
public static function create() -> OrderedMap[K, V]:
|
|
42
|
+
return OrderedMap[K, V](root = null, len = 0)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
static function height(node: ptr[Node[K, V]]?) -> int:
|
|
46
|
+
if node == null:
|
|
47
|
+
return 0
|
|
48
|
+
|
|
49
|
+
unsafe:
|
|
50
|
+
return read(ptr[Node[K, V]]<-node).height
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
static function update_height(node: ptr[Node[K, V]]) -> void:
|
|
54
|
+
let left_height = unsafe: OrderedMap[K, V].height(read(node).left)
|
|
55
|
+
let right_height = unsafe: OrderedMap[K, V].height(read(node).right)
|
|
56
|
+
var next_height = left_height
|
|
57
|
+
if right_height > next_height:
|
|
58
|
+
next_height = right_height
|
|
59
|
+
|
|
60
|
+
unsafe:
|
|
61
|
+
read(node).height = next_height + 1
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
static function balance_factor(node: ptr[Node[K, V]]?) -> int:
|
|
65
|
+
if node == null:
|
|
66
|
+
return 0
|
|
67
|
+
|
|
68
|
+
unsafe:
|
|
69
|
+
return OrderedMap[
|
|
70
|
+
K,
|
|
71
|
+
V
|
|
72
|
+
].height(read(ptr[Node[K, V]]<-node).left) - OrderedMap[K, V].height(read(ptr[Node[K, V]]<-node).right)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
static function minimum(node: ptr[Node[K, V]]?) -> ptr[Node[K, V]]?:
|
|
76
|
+
var current = node
|
|
77
|
+
while current != null:
|
|
78
|
+
let left = unsafe: read(ptr[Node[K, V]]<-current).left else:
|
|
79
|
+
return current
|
|
80
|
+
|
|
81
|
+
current = left
|
|
82
|
+
|
|
83
|
+
return null
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
static function successor(node: ptr[Node[K, V]]?) -> ptr[Node[K, V]]?:
|
|
87
|
+
if node == null:
|
|
88
|
+
return null
|
|
89
|
+
|
|
90
|
+
let current = unsafe: ptr[Node[K, V]]<-node
|
|
91
|
+
let right = unsafe: read(current).right
|
|
92
|
+
if right != null:
|
|
93
|
+
return OrderedMap[K, V].minimum(right)
|
|
94
|
+
|
|
95
|
+
var child = node
|
|
96
|
+
var parent = unsafe: read(current).parent
|
|
97
|
+
while parent != null:
|
|
98
|
+
let parent_ptr = unsafe: ptr[Node[K, V]]<-parent
|
|
99
|
+
if unsafe: read(parent_ptr).left == child:
|
|
100
|
+
return parent
|
|
101
|
+
|
|
102
|
+
child = parent
|
|
103
|
+
parent = unsafe: read(parent_ptr).parent
|
|
104
|
+
|
|
105
|
+
return null
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
static function replace_child(
|
|
109
|
+
current: ref[OrderedMap[K, V]],
|
|
110
|
+
parent: ptr[Node[K, V]]?,
|
|
111
|
+
previous: ptr[Node[K, V]],
|
|
112
|
+
replacement: ptr[Node[K, V]]?
|
|
113
|
+
) -> void:
|
|
114
|
+
if parent == null:
|
|
115
|
+
current.root = replacement
|
|
116
|
+
else:
|
|
117
|
+
unsafe:
|
|
118
|
+
let parent_ptr = ptr[Node[K, V]]<-parent
|
|
119
|
+
if read(parent_ptr).left == previous:
|
|
120
|
+
read(parent_ptr).left = replacement
|
|
121
|
+
else if read(parent_ptr).right == previous:
|
|
122
|
+
read(parent_ptr).right = replacement
|
|
123
|
+
else:
|
|
124
|
+
fatal(c"ordered_map.OrderedMap.replace_child missing previous child")
|
|
125
|
+
|
|
126
|
+
if replacement != null:
|
|
127
|
+
unsafe:
|
|
128
|
+
read(ptr[Node[K, V]]<-replacement).parent = parent
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
static function rotate_left(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]:
|
|
132
|
+
let pivot = unsafe: read(node).right else:
|
|
133
|
+
fatal(c"ordered_map.OrderedMap.rotate_left missing pivot")
|
|
134
|
+
|
|
135
|
+
let pivot_ptr = unsafe: ptr[Node[K, V]]<-pivot
|
|
136
|
+
let parent = unsafe: read(node).parent
|
|
137
|
+
let pivot_left = unsafe: read(pivot_ptr).left
|
|
138
|
+
|
|
139
|
+
unsafe:
|
|
140
|
+
read(node).right = pivot_left
|
|
141
|
+
if pivot_left != null:
|
|
142
|
+
unsafe:
|
|
143
|
+
read(ptr[Node[K, V]]<-pivot_left).parent = node
|
|
144
|
+
|
|
145
|
+
OrderedMap[K, V].replace_child(current, parent, node, pivot)
|
|
146
|
+
|
|
147
|
+
unsafe:
|
|
148
|
+
read(pivot_ptr).left = node
|
|
149
|
+
read(node).parent = pivot
|
|
150
|
+
|
|
151
|
+
OrderedMap[K, V].update_height(node)
|
|
152
|
+
OrderedMap[K, V].update_height(pivot_ptr)
|
|
153
|
+
return pivot_ptr
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
static function rotate_right(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]:
|
|
157
|
+
let pivot = unsafe: read(node).left else:
|
|
158
|
+
fatal(c"ordered_map.OrderedMap.rotate_right missing pivot")
|
|
159
|
+
|
|
160
|
+
let pivot_ptr = unsafe: ptr[Node[K, V]]<-pivot
|
|
161
|
+
let parent = unsafe: read(node).parent
|
|
162
|
+
let pivot_right = unsafe: read(pivot_ptr).right
|
|
163
|
+
|
|
164
|
+
unsafe:
|
|
165
|
+
read(node).left = pivot_right
|
|
166
|
+
if pivot_right != null:
|
|
167
|
+
unsafe:
|
|
168
|
+
read(ptr[Node[K, V]]<-pivot_right).parent = node
|
|
169
|
+
|
|
170
|
+
OrderedMap[K, V].replace_child(current, parent, node, pivot)
|
|
171
|
+
|
|
172
|
+
unsafe:
|
|
173
|
+
read(pivot_ptr).right = node
|
|
174
|
+
read(node).parent = pivot
|
|
175
|
+
|
|
176
|
+
OrderedMap[K, V].update_height(node)
|
|
177
|
+
OrderedMap[K, V].update_height(pivot_ptr)
|
|
178
|
+
return pivot_ptr
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
static function rebalance(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]?) -> void:
|
|
182
|
+
var cursor = node
|
|
183
|
+
while cursor != null:
|
|
184
|
+
let cursor_ptr = unsafe: ptr[Node[K, V]]<-cursor
|
|
185
|
+
OrderedMap[K, V].update_height(cursor_ptr)
|
|
186
|
+
|
|
187
|
+
let balance = OrderedMap[K, V].balance_factor(cursor)
|
|
188
|
+
if balance > 1:
|
|
189
|
+
let left = unsafe: read(cursor_ptr).left
|
|
190
|
+
if OrderedMap[K, V].balance_factor(left) < 0:
|
|
191
|
+
if left == null:
|
|
192
|
+
fatal(c"ordered_map.OrderedMap.rebalance missing left child")
|
|
193
|
+
OrderedMap[K, V].rotate_left(current, unsafe: ptr[Node[K, V]]<-left)
|
|
194
|
+
|
|
195
|
+
let rotated = OrderedMap[K, V].rotate_right(current, cursor_ptr)
|
|
196
|
+
cursor = unsafe: read(rotated).parent
|
|
197
|
+
else if balance < -1:
|
|
198
|
+
let right = unsafe: read(cursor_ptr).right
|
|
199
|
+
if OrderedMap[K, V].balance_factor(right) > 0:
|
|
200
|
+
if right == null:
|
|
201
|
+
fatal(c"ordered_map.OrderedMap.rebalance missing right child")
|
|
202
|
+
OrderedMap[K, V].rotate_right(current, unsafe: ptr[Node[K, V]]<-right)
|
|
203
|
+
|
|
204
|
+
let rotated = OrderedMap[K, V].rotate_left(current, cursor_ptr)
|
|
205
|
+
cursor = unsafe: read(rotated).parent
|
|
206
|
+
else:
|
|
207
|
+
cursor = unsafe: read(cursor_ptr).parent
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
static function locate(current: OrderedMap[K, V], key: K) -> SearchResult[K, V]:
|
|
211
|
+
var parent: ptr[Node[K, V]]? = null
|
|
212
|
+
var node = current.root
|
|
213
|
+
var compare = 0
|
|
214
|
+
while node != null:
|
|
215
|
+
let node_ptr = unsafe: ptr[Node[K, V]]<-node
|
|
216
|
+
let stored = unsafe: const_ptr_of(read(node_ptr).key)
|
|
217
|
+
compare = order[K](key, stored)
|
|
218
|
+
if compare < 0:
|
|
219
|
+
parent = node
|
|
220
|
+
unsafe:
|
|
221
|
+
node = read(node_ptr).left
|
|
222
|
+
else if compare > 0:
|
|
223
|
+
parent = node
|
|
224
|
+
unsafe:
|
|
225
|
+
node = read(node_ptr).right
|
|
226
|
+
else:
|
|
227
|
+
return SearchResult[K, V](node = node, parent = parent, compare = 0, found = true)
|
|
228
|
+
|
|
229
|
+
return SearchResult[K, V](node = null, parent = parent, compare = compare, found = false)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
static function release_subtree(node: ptr[Node[K, V]]?) -> void:
|
|
233
|
+
if node == null:
|
|
234
|
+
return
|
|
235
|
+
|
|
236
|
+
let node_ptr = unsafe: ptr[Node[K, V]]<-node
|
|
237
|
+
let left = unsafe: read(node_ptr).left
|
|
238
|
+
let right = unsafe: read(node_ptr).right
|
|
239
|
+
OrderedMap[K, V].release_subtree(left)
|
|
240
|
+
OrderedMap[K, V].release_subtree(right)
|
|
241
|
+
heap.release(node)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
static function detach_node(current: ref[OrderedMap[K, V]], node: ptr[Node[K, V]]) -> ptr[Node[K, V]]?:
|
|
245
|
+
let left = unsafe: read(node).left
|
|
246
|
+
let right = unsafe: read(node).right
|
|
247
|
+
if left != null and right != null:
|
|
248
|
+
let successor = OrderedMap[K, V].minimum(right) else:
|
|
249
|
+
fatal(c"ordered_map.OrderedMap.detach_node missing successor")
|
|
250
|
+
|
|
251
|
+
let successor_ptr = unsafe: ptr[Node[K, V]]<-successor
|
|
252
|
+
unsafe:
|
|
253
|
+
read(node).key = read(successor_ptr).key
|
|
254
|
+
read(node).value = read(successor_ptr).value
|
|
255
|
+
|
|
256
|
+
return OrderedMap[K, V].detach_node(current, successor_ptr)
|
|
257
|
+
|
|
258
|
+
var child = left
|
|
259
|
+
if child == null:
|
|
260
|
+
child = right
|
|
261
|
+
|
|
262
|
+
let parent = unsafe: read(node).parent
|
|
263
|
+
OrderedMap[K, V].replace_child(current, parent, node, child)
|
|
264
|
+
heap.release(node)
|
|
265
|
+
|
|
266
|
+
if parent != null:
|
|
267
|
+
return parent
|
|
268
|
+
|
|
269
|
+
return child
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
public function len() -> ptr_uint:
|
|
273
|
+
return this.len
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
public function is_empty() -> bool:
|
|
277
|
+
return this.len == 0
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
public function get(key: K) -> ptr[V]?:
|
|
281
|
+
let location = OrderedMap[K, V].locate(this, key)
|
|
282
|
+
if not location.found:
|
|
283
|
+
return null
|
|
284
|
+
|
|
285
|
+
let node = location.node else:
|
|
286
|
+
fatal(c"ordered_map.OrderedMap.get missing node")
|
|
287
|
+
|
|
288
|
+
unsafe:
|
|
289
|
+
return ptr_of(read(ptr[Node[K, V]]<-node).value)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
public function at(key: K) -> Option[V]:
|
|
293
|
+
let p = this.get(key) else:
|
|
294
|
+
return Option[V].none
|
|
295
|
+
|
|
296
|
+
unsafe:
|
|
297
|
+
return Option[V].some(value = read(p))
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
public function get_key(key: K) -> const_ptr[K]?:
|
|
301
|
+
let location = OrderedMap[K, V].locate(this, key)
|
|
302
|
+
if not location.found:
|
|
303
|
+
return null
|
|
304
|
+
|
|
305
|
+
let node = location.node else:
|
|
306
|
+
fatal(c"ordered_map.OrderedMap.get_key missing node")
|
|
307
|
+
|
|
308
|
+
unsafe:
|
|
309
|
+
return const_ptr_of(read(ptr[Node[K, V]]<-node).key)
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
public function iter() -> Entries[K, V]:
|
|
313
|
+
return this.entries()
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
public function keys() -> Keys[K, V]:
|
|
317
|
+
return Keys[K, V](node = OrderedMap[K, V].minimum(this.root))
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
public function values() -> Values[K, V]:
|
|
321
|
+
return Values[K, V](node = OrderedMap[K, V].minimum(this.root))
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
public function entries() -> Entries[K, V]:
|
|
325
|
+
return Entries[K, V](node = OrderedMap[K, V].minimum(this.root), started = false)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
public function contains(key: K) -> bool:
|
|
329
|
+
return this.get(key) != null
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
public editable function clear() -> void:
|
|
333
|
+
OrderedMap[K, V].release_subtree(this.root)
|
|
334
|
+
this.root = null
|
|
335
|
+
this.len = 0
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
public editable function release() -> void:
|
|
339
|
+
this.clear()
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
public editable function set(key: K, value: V) -> Option[V]:
|
|
343
|
+
let location = OrderedMap[K, V].locate(this, key)
|
|
344
|
+
if location.found:
|
|
345
|
+
let node = location.node else:
|
|
346
|
+
fatal(c"ordered_map.OrderedMap.set missing node")
|
|
347
|
+
|
|
348
|
+
unsafe:
|
|
349
|
+
let node_ptr = ptr[Node[K, V]]<-node
|
|
350
|
+
let previous = read(node_ptr).value
|
|
351
|
+
read(node_ptr).value = value
|
|
352
|
+
return Option[V].some(value = previous)
|
|
353
|
+
|
|
354
|
+
let node = heap.must_alloc[Node[K, V]](1)
|
|
355
|
+
unsafe:
|
|
356
|
+
read(node) = Node[K, V](
|
|
357
|
+
key = key,
|
|
358
|
+
value = value,
|
|
359
|
+
left = null,
|
|
360
|
+
right = null,
|
|
361
|
+
parent = location.parent,
|
|
362
|
+
height = 1
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
let parent = location.parent
|
|
366
|
+
if parent == null:
|
|
367
|
+
this.root = node
|
|
368
|
+
else:
|
|
369
|
+
unsafe:
|
|
370
|
+
let parent_ptr = ptr[Node[K, V]]<-parent
|
|
371
|
+
if location.compare < 0:
|
|
372
|
+
read(parent_ptr).left = node
|
|
373
|
+
else:
|
|
374
|
+
read(parent_ptr).right = node
|
|
375
|
+
|
|
376
|
+
this.len += 1
|
|
377
|
+
OrderedMap[K, V].rebalance(this, parent)
|
|
378
|
+
return Option[V].none
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
public editable function get_or_insert(key: K, value: V) -> ptr[V]:
|
|
382
|
+
let location = OrderedMap[K, V].locate(this, key)
|
|
383
|
+
if location.found:
|
|
384
|
+
let node = location.node else:
|
|
385
|
+
fatal(c"ordered_map.OrderedMap.get_or_insert missing node")
|
|
386
|
+
|
|
387
|
+
unsafe:
|
|
388
|
+
return ptr_of(read(ptr[Node[K, V]]<-node).value)
|
|
389
|
+
|
|
390
|
+
let node = heap.must_alloc[Node[K, V]](1)
|
|
391
|
+
unsafe:
|
|
392
|
+
read(node) = Node[K, V](
|
|
393
|
+
key = key,
|
|
394
|
+
value = value,
|
|
395
|
+
left = null,
|
|
396
|
+
right = null,
|
|
397
|
+
parent = location.parent,
|
|
398
|
+
height = 1
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
let parent = location.parent
|
|
402
|
+
if parent == null:
|
|
403
|
+
this.root = node
|
|
404
|
+
else:
|
|
405
|
+
unsafe:
|
|
406
|
+
let parent_ptr = ptr[Node[K, V]]<-parent
|
|
407
|
+
if location.compare < 0:
|
|
408
|
+
read(parent_ptr).left = node
|
|
409
|
+
else:
|
|
410
|
+
read(parent_ptr).right = node
|
|
411
|
+
|
|
412
|
+
this.len += 1
|
|
413
|
+
OrderedMap[K, V].rebalance(this, parent)
|
|
414
|
+
|
|
415
|
+
unsafe:
|
|
416
|
+
return ptr_of(read(node).value)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
public editable function remove_entry(key: K) -> Option[RemovedEntry[K, V]]:
|
|
420
|
+
let location = OrderedMap[K, V].locate(this, key)
|
|
421
|
+
if not location.found:
|
|
422
|
+
return Option[RemovedEntry[K, V]].none
|
|
423
|
+
|
|
424
|
+
let node = location.node else:
|
|
425
|
+
fatal(c"ordered_map.OrderedMap.remove_entry missing node")
|
|
426
|
+
|
|
427
|
+
let node_ptr = unsafe: ptr[Node[K, V]]<-node
|
|
428
|
+
let removed = unsafe: RemovedEntry[K, V](key = read(node_ptr).key, value = read(node_ptr).value)
|
|
429
|
+
let rebalance_from = OrderedMap[K, V].detach_node(this, node_ptr)
|
|
430
|
+
this.len -= 1
|
|
431
|
+
OrderedMap[K, V].rebalance(this, rebalance_from)
|
|
432
|
+
return Option[RemovedEntry[K, V]].some(value = removed)
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
public editable function remove(key: K) -> Option[V]:
|
|
436
|
+
let removed = this.remove_entry(key)
|
|
437
|
+
if removed.is_none():
|
|
438
|
+
return Option[V].none
|
|
439
|
+
return Option[V].some(value = removed.unwrap().value)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
extending Keys[K, V]:
|
|
443
|
+
public function iter() -> Keys[K, V]:
|
|
444
|
+
return this
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
public editable function next() -> const_ptr[K]?:
|
|
448
|
+
let current = this.node else:
|
|
449
|
+
return null
|
|
450
|
+
|
|
451
|
+
this.node = OrderedMap[K, V].successor(current)
|
|
452
|
+
|
|
453
|
+
unsafe:
|
|
454
|
+
return const_ptr_of(read(ptr[Node[K, V]]<-current).key)
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
extending Values[K, V]:
|
|
458
|
+
public function iter() -> Values[K, V]:
|
|
459
|
+
return this
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
public editable function next() -> ptr[V]?:
|
|
463
|
+
let current = this.node else:
|
|
464
|
+
return null
|
|
465
|
+
|
|
466
|
+
this.node = OrderedMap[K, V].successor(current)
|
|
467
|
+
|
|
468
|
+
unsafe:
|
|
469
|
+
return ptr_of(read(ptr[Node[K, V]]<-current).value)
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
extending Entries[K, V]:
|
|
473
|
+
public function iter() -> Entries[K, V]:
|
|
474
|
+
return this
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
public editable function next() -> bool:
|
|
478
|
+
let current = this.node else:
|
|
479
|
+
return false
|
|
480
|
+
|
|
481
|
+
if not this.started:
|
|
482
|
+
this.started = true
|
|
483
|
+
return true
|
|
484
|
+
|
|
485
|
+
let next = OrderedMap[K, V].successor(current)
|
|
486
|
+
this.node = next
|
|
487
|
+
return next != null
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
public function current() -> Entry[K, V]:
|
|
491
|
+
let current = this.node
|
|
492
|
+
if current == null or not this.started:
|
|
493
|
+
fatal(c"ordered_map.Entries.current missing current node")
|
|
494
|
+
|
|
495
|
+
unsafe:
|
|
496
|
+
let node_ptr = ptr[Node[K, V]]<-current
|
|
497
|
+
return Entry[K, V](key = const_ptr_of(read(node_ptr).key), value = ptr_of(read(node_ptr).value))
|