@@ -2,37 +2,23 @@ module ReadOnlyNodeModule
2
2
3
3
using DispatchDoctor: @unstable
4
4
5
- using .. NodeModule: AbstractExpressionNode, Node
5
+ using .. NodeModule: AbstractExpressionNode, Node, max_degree
6
6
import .. NodeModule: default_allocator, with_type_parameters, constructorof, get_children
7
7
8
- abstract type AbstractReadOnlyNode{T,D,N<: AbstractExpressionNode{T,D} ,IS_REF } < :
8
+ abstract type AbstractReadOnlyNode{T,D,N<: AbstractExpressionNode{T,D} } < :
9
9
AbstractExpressionNode{T,D} end
10
10
11
11
""" A type of expression node that prevents writing to the inner node"""
12
- struct ReadOnlyNode{T,D,N,IS_REF } <: AbstractReadOnlyNode{T,D,N,IS_REF }
12
+ struct ReadOnlyNode{T,D,N} <: AbstractReadOnlyNode{T,D,N}
13
13
_inner:: N
14
14
15
- function ReadOnlyNode (
16
- n:: N , :: Val{IS_REF}
17
- ) where {T,D,N<: AbstractExpressionNode{T,D} ,IS_REF}
18
- return new {T,D,N,IS_REF} (n)
19
- end
20
- function ReadOnlyNode (n:: N ) where {T,D,N<: AbstractExpressionNode{T,D} }
21
- return ReadOnlyNode (n, Val (false ))
22
- end
23
- function ReadOnlyNode (n:: AbstractReadOnlyNode )
24
- return n
25
- end
26
- function ReadOnlyNode (n:: Ref{<:AbstractExpressionNode} )
27
- return ReadOnlyNode (n[], Val (true ))
28
- end
15
+ ReadOnlyNode (n:: N ) where {T,N<: AbstractExpressionNode{T} } = new {T,max_degree(N),N} (n)
29
16
end
30
17
@inline inner (n:: AbstractReadOnlyNode ) = getfield (n, :_inner )
31
18
@unstable constructorof (:: Type{<:ReadOnlyNode} ) = ReadOnlyNode
32
- Base. getindex (n:: AbstractReadOnlyNode{T,D,N,true} where {T,D,N}) = n
33
19
@inline function Base. getproperty (n:: AbstractReadOnlyNode , s:: Symbol )
34
20
out = getproperty (inner (n), s)
35
- if out isa Union{ AbstractExpressionNode,Ref{ <: AbstractExpressionNode }}
21
+ if out isa AbstractExpressionNode
36
22
return ReadOnlyNode (out)
37
23
else
38
24
return out
0 commit comments