@@ -2,38 +2,24 @@ 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 }}
36
- return ReadOnlyNode (out)
21
+ if out isa AbstractExpressionNode
22
+ return constructorof ( typeof (n)) (out)
37
23
else
38
24
return out
39
25
end
44
30
function Base. setproperty! (:: AbstractReadOnlyNode , :: Symbol , v)
45
31
return error (" Cannot set properties on a ReadOnlyNode" )
46
32
end
47
- Base. propertynames (n:: AbstractReadOnlyNode ) = propertynames (getfield (n, :_inner ))
48
- Base. copy (n:: AbstractReadOnlyNode ) = ReadOnlyNode (copy (getfield (n, :_inner )))
33
+ Base. propertynames (n:: AbstractReadOnlyNode ) = propertynames (inner (n ))
34
+ Base. copy (n:: AbstractReadOnlyNode ) = ReadOnlyNode (copy (inner (n )))
49
35
50
36
end
0 commit comments