|
1 |
| -type BinaryNode{T} |
2 |
| - left::Nullable{T} |
3 |
| - right::Nullable{T} |
| 1 | +mutable struct BinaryNode{T} |
| 2 | + left::Union{Nothing, T} |
| 3 | + right::Union{Nothing, T} |
4 | 4 |
|
5 |
| - (::Type{BinaryNode{T}}){T}() = new{T}(Nullable{T}(), Nullable{T}()) |
6 |
| - (::Type{BinaryNode}){T}(left::T, right::T) = new{T}(Nullable{T}(a), Nullable{T}(b)) |
7 |
| - (::Type{BinaryNode{T}}){T}(left::T, right::T) = new{T}(Nullable{T}(a), Nullable{T}(b)) |
| 5 | + BinaryNode{T}() where {T} = new{T}(nothing, nothing) |
| 6 | + BinaryNode(left::T, right::T) where {T} = new{T}(nothing, nothing) |
| 7 | + BinaryNode{T}(left::T, right::T) where {T} = new{T}(nothing, nothing) |
8 | 8 | end
|
9 |
| -type RectanglePacker{T} |
| 9 | +mutable struct RectanglePacker{T} |
10 | 10 | children::BinaryNode{RectanglePacker{T}}
|
11 | 11 | area::SimpleRectangle{T}
|
12 | 12 | end
|
13 | 13 |
|
14 |
| -left(a::RectanglePacker) = get(a.children.left) |
15 |
| -left{T}(a::RectanglePacker{T}, r::RectanglePacker{T}) = (a.children.left = Nullable(r)) |
16 |
| -right(a::RectanglePacker) = get(a.children.right) |
17 |
| -right{T}(a::RectanglePacker{T}, r::RectanglePacker{T}) = (a.children.right = Nullable(r)) |
18 |
| -RectanglePacker{T}(area::SimpleRectangle{T}) = RectanglePacker{T}(BinaryNode{RectanglePacker{T}}(), area) |
19 |
| -isleaf(a::RectanglePacker) = isnull(a.children.left) && isnull(a.children.right) |
| 14 | +left(a::RectanglePacker) = a.children.left |
| 15 | +left(a::RectanglePacker{T}, r::RectanglePacker{T}) where {T} = (a.children.left = r) |
| 16 | +right(a::RectanglePacker) = a.children.right |
| 17 | +right(a::RectanglePacker{T}, r::RectanglePacker{T}) where {T} = (a.children.right = r) |
| 18 | +RectanglePacker(area::SimpleRectangle{T}) where {T} = RectanglePacker{T}(BinaryNode{RectanglePacker{T}}(), area) |
| 19 | +isleaf(a::RectanglePacker) = (a.children.left) == nothing && (a.children.right == nothing) |
20 | 20 |
|
21 | 21 | # This is rather append, but it seems odd to use another function here.
|
22 | 22 | # Maybe its a bad idea, to call it push regardless!?
|
23 |
| -function Base.push!{T}(node::RectanglePacker{T}, areas::Vector{SimpleRectangle{T}}) |
| 23 | +function Base.push!(node::RectanglePacker{T}, areas::Vector{SimpleRectangle{T}}) where T |
24 | 24 | sort!(areas)
|
25 | 25 | RectanglePacker{T}[push!(node, area) for area in areas]
|
26 | 26 | end
|
27 |
| -function Base.push!{T}(node::RectanglePacker{T}, area::SimpleRectangle{T}) |
| 27 | +function Base.push!(node::RectanglePacker{T}, area::SimpleRectangle{T}) where T |
28 | 28 | if !isleaf(node)
|
29 | 29 | l = push!(left(node), area)
|
30 | 30 | l == nothing && return push!(right(node), area) # if left does not have space, try right
|
|
0 commit comments