Skip to content

Commit a9400a7

Browse files
committed
Monkey patch metadata to extend better
1 parent 414710c commit a9400a7

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

src/lavinmq/logging.cr

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,68 @@
11
require "./logging/*"
2+
require "log/metadata"
23

34
# Add some methods to support more data types in Log::Metadata
45
class Log::Metadata
6+
# Override some stuff in Metadata to get the same behaviour
7+
# as in https://github.com/crystal-lang/crystal/pull/16098
8+
#
9+
# @overridden_size will be used as @parent_size in the PR
10+
#
11+
def setup
12+
previous_def
13+
@overridden_size = 0
14+
parent_size = (@parent.try(&.max_total_size) || 0)
15+
@max_total_size = @size + parent_size
16+
end
17+
18+
protected def defrag
19+
parent = @parent
20+
return if parent.nil?
21+
22+
ptr_entries = pointerof(@first)
23+
next_free_entry = ptr_entries + @size
24+
total_size = @size
25+
26+
# Copy parent entries that ain't overwritten
27+
parent_size = 0
28+
parent.each do |(key, value)|
29+
overwritten = false
30+
@size.times do |i|
31+
if ptr_entries[i][:key] == key
32+
overwritten = true
33+
break
34+
end
35+
end
36+
next if overwritten
37+
next_free_entry.value = {key: key, value: value}
38+
parent_size += 1
39+
next_free_entry += 1
40+
total_size += 1
41+
end
42+
43+
@size = total_size
44+
@max_total_size = total_size
45+
@overridden_size = parent_size
46+
@parent = nil
47+
end
48+
49+
def each(& : {Symbol, Value} ->)
50+
defrag
51+
ptr_entries = pointerof(@first)
52+
parent_size = @overridden_size
53+
local_size = @size - parent_size
54+
55+
parent_size.times do |i|
56+
entry = ptr_entries[i + local_size]
57+
yield({entry[:key], entry[:value]})
58+
end
59+
60+
local_size.times do |i|
61+
entry = ptr_entries[i]
62+
yield({entry[:key], entry[:value]})
63+
end
64+
end
65+
566
struct Value
667
def self.new(value : UInt8 | UInt16)
768
new(value.to_u32)

0 commit comments

Comments
 (0)