@@ -80,7 +80,7 @@ struct ArrayNode{T,D,S} <: AbstractExpressionNode{T,D}
8080 idx:: UInt16
8181end
8282
83- function Base. getproperty (n:: ArrayNode{T,D,S} , k:: Symbol ) where {T,D,S}
83+ @inline function Base. getproperty (n:: ArrayNode{T,D,S} , k:: Symbol ) where {T,D,S}
8484 tree = getfield (n, :tree )
8585 idx = getfield (n, :idx )
8686 nodes = getfield (tree, :nodes )
@@ -109,18 +109,20 @@ function Base.getproperty(n::ArrayNode{T,D,S}, k::Symbol) where {T,D,S}
109109 Nullable (false , ArrayNode {T,D,S} (tree, child_idx))
110110 end
111111 end
112- elseif k == :l # Left child for compatibility
112+ elseif k == :l
113113 child_idx = @inbounds nodes. children[idx][1 ]
114- return child_idx == 0 ? error (" No left child" ) : ArrayNode {T,D,S} (tree, child_idx)
115- elseif k == :r # Right child for compatibility
114+ child_idx == 0 && error (" No left child" )
115+ return ArrayNode {T,D,S} (tree, child_idx)
116+ elseif k == :r
116117 child_idx = @inbounds nodes. children[idx][2 ]
117- return child_idx == 0 ? error (" No right child" ) : ArrayNode {T,D,S} (tree, child_idx)
118+ child_idx == 0 && error (" No right child" )
119+ return ArrayNode {T,D,S} (tree, child_idx)
118120 else
119121 error (" Unknown field $k " )
120122 end
121123end
122124
123- function Base. setproperty! (n:: ArrayNode{T,D,S} , k:: Symbol , v) where {T,D,S}
125+ @inline function Base. setproperty! (n:: ArrayNode{T,D,S} , k:: Symbol , v) where {T,D,S}
124126 tree = getfield (n, :tree )
125127 idx = getfield (n, :idx )
126128 nodes = getfield (tree, :nodes )
@@ -136,11 +138,11 @@ function Base.setproperty!(n::ArrayNode{T,D,S}, k::Symbol, v) where {T,D,S}
136138 elseif k == :op
137139 @inbounds nodes. op[idx] = v
138140 elseif k == :l
139- isa (v, ArrayNode) || error (" Cannot set left child to non-ArrayNode" )
141+ ! isa (v, ArrayNode) && error (" Cannot set left child to non-ArrayNode" )
140142 children = nodes. children[idx]
141143 @inbounds nodes. children[idx] = (getfield (v, :idx ), children[2 : end ]. .. )
142144 elseif k == :r
143- isa (v, ArrayNode) || error (" Cannot set right child to non-ArrayNode" )
145+ ! isa (v, ArrayNode) && error (" Cannot set right child to non-ArrayNode" )
144146 children = nodes. children[idx]
145147 @inbounds nodes. children[idx] = (children[1 ], getfield (v, :idx ), children[3 : end ]. .. )
146148 else
@@ -150,15 +152,15 @@ function Base.setproperty!(n::ArrayNode{T,D,S}, k::Symbol, v) where {T,D,S}
150152end
151153
152154# Allocation management
153- function allocate_node! (tree:: ArrayTree )
155+ @inline function allocate_node! (tree:: ArrayTree )
154156 tree. free_count == 0 && error (" ArrayTree full" )
155157 idx = tree. free_list[tree. free_count]
156158 tree. free_count -= 1
157159 tree. n_nodes += 1
158160 return idx
159161end
160162
161- function free_node! (tree:: ArrayTree , idx:: UInt16 )
163+ @inline function free_node! (tree:: ArrayTree , idx:: UInt16 )
162164 tree. free_count += 1
163165 tree. free_list[tree. free_count] = idx
164166 return tree. n_nodes -= 1
@@ -300,16 +302,6 @@ function copy_subtree!(dst::ArrayTree{T,D}, src::ArrayTree{T,D}, src_idx::UInt16
300302 return dst_idx
301303end
302304
303- # Core interface implementations
304- Base. eltype (:: Type{<:ArrayNode{T}} ) where {T} = T
305- Base. eltype (:: ArrayNode{T} ) where {T} = T
306-
307- max_degree (:: Type{<:ArrayNode} ) = 2
308- max_degree (:: Type{<:ArrayNode{T,D}} ) where {T,D} = D
309- max_degree (n:: ArrayNode ) = max_degree (typeof (n))
310-
311- preserve_sharing (:: Type{<:ArrayNode} ) = false
312-
313305constructorof (:: Type{<:ArrayNode} ) = ArrayNode
314306with_type_parameters (:: Type{<:ArrayNode} , :: Type{T} ) where {T} = ArrayNode{T,2 }
315307with_max_degree (:: Type{<:ArrayNode{T,D}} , :: Val{D2} ) where {T,D,D2} = ArrayNode{T,D2}
@@ -508,10 +500,10 @@ function tree_mapreduce(
508500 return mapreduce_impl (f, op, tree, getfield (n, :idx ))
509501end
510502
511- function mapreduce_impl (f:: F , op:: G , tree:: ArrayTree{T,D,S} , idx:: UInt16 ) where {F,G,T,D,S}
503+ @inline function mapreduce_impl (f:: F , op:: G , tree:: ArrayTree{T,D,S} , idx:: UInt16 ) where {F,G,T,D,S}
512504 degree = @inbounds tree. nodes. degree[idx]
513505 node = ArrayNode {T,D,S} (tree, idx)
514- result = f (node)
506+ result = @inline f (node)
515507
516508 if degree > 0
517509 child_results = ntuple (
0 commit comments