Skip to content

Commit b09f65f

Browse files
committed
Used @eval loop instead of union type to define Graph/DiGraph shared methods.
1 parent f704028 commit b09f65f

2 files changed

Lines changed: 125 additions & 90 deletions

File tree

src/edgedatagraph.jl

Lines changed: 65 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -39,74 +39,92 @@ EdgeDataDiGraph{I, T}(data) where {I, T} = EdgeDataDiGraph{I, T, vertextype(I)}(
3939

4040
Graphs.is_directed(::Type{<:EdgeDataDiGraph}) = true
4141

42-
const GenericEdgeDataGraph{I, T, V} =
43-
Union{EdgeDataGraph{I, T, V}, EdgeDataDiGraph{I, T, V}}
44-
45-
function (GType::Type{<:GenericEdgeDataGraph{I, T, V}})(data) where {I, T, V}
46-
edges = keys(data)
47-
vertices = union(src.(edges), dst.(edges))
48-
graph = GType(undef, vertices)
49-
copyto!(graph, data)
50-
return graph
42+
for GType in (:EdgeDataGraph, :EdgeDataDiGraph)
43+
@eval begin
44+
function $GType{E, T, V}(data) where {V, E <: NamedEdge{V}, T}
45+
edges = keys(data)
46+
vertices = union(src.(edges), dst.(edges))
47+
graph = $GType{E, T, V}(undef, vertices)
48+
copyto!(graph, data)
49+
return graph
50+
end
51+
end
5152
end
5253

5354
# ====================================== Graphs.jl ======================================= #
54-
Graphs.edgetype(::Type{<:GenericEdgeDataGraph{I, T}}) where {I, T} = I
55-
56-
function Graphs.has_vertex(graph::GenericEdgeDataGraph, vertex)
57-
return has_vertex(graph.underlying_graph, vertex)
58-
end
59-
function Graphs.has_edge(graph::GenericEdgeDataGraph, edge::NamedEdge)
60-
return has_edge(graph.underlying_graph, edge)
61-
end
6255

63-
function Graphs.rem_edge!(graph::GenericEdgeDataGraph, edge)
64-
unset!(graph.edge_data, edge)
65-
rem_edge!(graph.underlying_graph, edge)
66-
return graph
67-
end
68-
69-
function Graphs.rem_vertex!(graph::GenericEdgeDataGraph, vertex)
70-
for edge in incident_edges(graph, vertex)
71-
unset!(graph.edge_data, edge)
56+
for GType in (:EdgeDataGraph, :EdgeDataDiGraph)
57+
@eval begin
58+
Graphs.edgetype(::Type{<:$GType{I, T, V}}) where {I, T, V} = I
59+
60+
function Graphs.has_vertex(graph::$GType, vertex)
61+
return has_vertex(graph.underlying_graph, vertex)
62+
end
63+
function Graphs.has_edge(graph::$GType, edge::NamedEdge)
64+
return has_edge(graph.underlying_graph, edge)
65+
end
66+
67+
function Graphs.rem_edge!(graph::$GType, edge)
68+
unset!(graph.edge_data, edge)
69+
rem_edge!(graph.underlying_graph, edge)
70+
return graph
71+
end
72+
73+
function Graphs.rem_vertex!(graph::$GType, vertex)
74+
for edge in incident_edges(graph, vertex)
75+
unset!(graph.edge_data, edge)
76+
end
77+
rem_vertex!(graph.underlying_graph, vertex)
78+
return graph
79+
end
80+
81+
Graphs.vertices(graph::$GType) = vertices(graph.underlying_graph)
7282
end
73-
rem_vertex!(graph.underlying_graph, vertex)
74-
return graph
7583
end
7684

77-
Graphs.vertices(graph::GenericEdgeDataGraph) = vertices(graph.underlying_graph)
78-
7985
# ==================================== NamedGraphs.jl ==================================== #
8086

81-
function NamedGraphs.vertex_positions(graph::GenericEdgeDataGraph)
82-
return vertex_positions(graph.underlying_graph)
83-
end
87+
for GType in (:EdgeDataGraph, :EdgeDataDiGraph)
88+
@eval begin
89+
function NamedGraphs.vertex_positions(graph::$GType)
90+
return vertex_positions(graph.underlying_graph)
91+
end
8492

85-
function NamedGraphs.ordered_vertices(graph::GenericEdgeDataGraph)
86-
return ordered_vertices(graph.underlying_graph)
87-
end
93+
function NamedGraphs.ordered_vertices(graph::$GType)
94+
return ordered_vertices(graph.underlying_graph)
95+
end
8896

89-
function NamedGraphs.position_graph(graph::GenericEdgeDataGraph)
90-
return position_graph(graph.underlying_graph)
97+
function NamedGraphs.position_graph(graph::$GType)
98+
return position_graph(graph.underlying_graph)
99+
end
100+
end
91101
end
92102

93103
# ==================================== DataGraphs.jl ===================================== #
94104

95-
edge_data_type(::Type{<:GenericEdgeDataGraph{I, T}}) where {I, T} = T
105+
for GType in (:EdgeDataGraph, :EdgeDataDiGraph)
106+
@eval begin
107+
edge_data_type(::Type{<:$GType{I, T, V}}) where {I, T, V} = T
96108

97-
function set_edge_data!(graph::GenericEdgeDataGraph, data, edge)
98-
graph.edge_data[edge] = data
99-
return graph
100-
end
109+
function set_edge_data!(graph::$GType, data, edge)
110+
graph.edge_data[edge] = data
111+
return graph
112+
end
101113

102-
get_edge_data(graph::GenericEdgeDataGraph, edge) = graph.edge_data[edge]
114+
get_edge_data(graph::$GType, edge) = graph.edge_data[edge]
103115

104-
is_vertex_assigned(::GenericEdgeDataGraph, _vertex) = false
105-
is_edge_assigned(graph::GenericEdgeDataGraph, edge) = isassigned(graph.edge_data, edge)
116+
is_vertex_assigned(::$GType, _vertex) = false
117+
is_edge_assigned(graph::$GType, edge) = isassigned(graph.edge_data, edge)
118+
end
119+
end
106120

107121
# =================================== Dictionaries.jl ==================================== #
108122

109-
Dictionaries.isinsertable(::Type{<:GenericEdgeDataGraph}, _edge) = true
123+
for GType in (:EdgeDataGraph, :EdgeDataDiGraph)
124+
@eval begin
125+
Dictionaries.isinsertable(::Type{<:$GType}, _edge) = true
126+
end
127+
end
110128

111129
function insert_edge_data!(graph::AbstractEdgeDataGraph, edge::AbstractEdge, data)
112130
if has_edge(graph, edge)

src/vertexdatagraph.jl

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -35,74 +35,91 @@ end
3535
VertexDataDiGraph(data) = VertexDataDiGraph{keytype(data)}(data)
3636
VertexDataDiGraph{V}(data) where {V} = VertexDataDiGraph{V, valtype(data)}(data)
3737

38-
const GenericVertexDataGraph{V, T} = Union{VertexDataGraph{V, T}, VertexDataDiGraph{V, T}}
39-
40-
function (GType::Type{<:GenericVertexDataGraph{V, T}})(data) where {V, T}
41-
vertices = keys(data)
42-
cache = GType(undef, vertices)
43-
return copyto!(cache, data)
44-
end
45-
4638
Graphs.is_directed(::Type{<:VertexDataGraph}) = false
4739
Graphs.is_directed(::Type{<:VertexDataDiGraph}) = true
4840

41+
for GType in (:VertexDataGraph, :VertexDataDiGraph)
42+
@eval begin
43+
function $GType{V, T}(data) where {V, T}
44+
vertices = keys(data)
45+
cache = $GType{V, T}(undef, vertices)
46+
return copyto!(cache, data)
47+
end
48+
end
49+
end
50+
4951
# ====================================== Graphs.jl ======================================= #
5052

51-
Graphs.edgetype(::Type{<:GenericVertexDataGraph{V, T}}) where {V, T} = NamedEdge{V}
53+
for GType in (:VertexDataGraph, :VertexDataDiGraph)
54+
@eval begin
55+
Graphs.edgetype(::Type{<:$GType{V, T}}) where {V, T} = NamedEdge{V}
5256

53-
function Graphs.has_vertex(graph::GenericVertexDataGraph, vertex)
54-
return has_vertex(graph.underlying_graph, vertex)
55-
end
56-
function Graphs.has_edge(graph::GenericVertexDataGraph, edge::NamedEdge)
57-
return has_edge(graph.underlying_graph, edge)
58-
end
57+
function Graphs.has_vertex(graph::$GType, vertex)
58+
return has_vertex(graph.underlying_graph, vertex)
59+
end
60+
function Graphs.has_edge(graph::$GType, edge::NamedEdge)
61+
return has_edge(graph.underlying_graph, edge)
62+
end
5963

60-
function Graphs.rem_vertex!(graph::GenericVertexDataGraph, vertex)
61-
unset!(graph.vertex_data, vertex)
62-
rem_vertex!(graph.underlying_graph, vertex)
63-
return graph
64-
end
64+
function Graphs.rem_vertex!(graph::$GType, vertex)
65+
unset!(graph.vertex_data, vertex)
66+
rem_vertex!(graph.underlying_graph, vertex)
67+
return graph
68+
end
6569

66-
Graphs.vertices(graph::GenericVertexDataGraph) = vertices(graph.underlying_graph)
70+
Graphs.vertices(graph::$GType) = vertices(graph.underlying_graph)
71+
end
72+
end
6773

6874
# ==================================== NamedGraphs.jl ==================================== #
6975

70-
function NamedGraphs.vertex_positions(graph::GenericVertexDataGraph)
71-
return vertex_positions(graph.underlying_graph)
72-
end
76+
for GType in (:VertexDataGraph, :VertexDataDiGraph)
77+
@eval begin
78+
function NamedGraphs.vertex_positions(graph::$GType)
79+
return vertex_positions(graph.underlying_graph)
80+
end
7381

74-
function NamedGraphs.ordered_vertices(graph::GenericVertexDataGraph)
75-
return ordered_vertices(graph.underlying_graph)
76-
end
82+
function NamedGraphs.ordered_vertices(graph::$GType)
83+
return ordered_vertices(graph.underlying_graph)
84+
end
7785

78-
function NamedGraphs.position_graph(graph::GenericVertexDataGraph)
79-
return position_graph(graph.underlying_graph)
86+
function NamedGraphs.position_graph(graph::$GType)
87+
return position_graph(graph.underlying_graph)
88+
end
89+
end
8090
end
8191

8292
# ==================================== DataGraphs.jl ===================================== #
8393

84-
underlying_graph(graph::VertexDataGraph) = getfield(graph, :underlying_graph)
85-
underlying_graph(graph::VertexDataDiGraph) = getfield(graph, :underlying_graph)
94+
for GType in (:VertexDataGraph, :VertexDataDiGraph)
95+
@eval begin
96+
underlying_graph(graph::$GType) = getfield(graph, :underlying_graph)
8697

87-
vertex_data_type(::Type{<:GenericVertexDataGraph{V, T}}) where {V, T} = T
98+
vertex_data_type(::Type{<:$GType{V, T}}) where {V, T} = T
8899

89-
function set_vertex_data!(graph::GenericVertexDataGraph, data, vertex)
90-
# We use an upsert here as we have already checked if the vertex (i.e. key) exists,
91-
# but it might not exist in the internal `Dictionary`, so add it if not.
92-
set!(graph.vertex_data, vertex, data)
93-
return graph
94-
end
100+
function set_vertex_data!(graph::$GType, data, vertex)
101+
# We use an upsert here as we have already checked if the vertex (i.e. key) exists,
102+
# but it might not exist in the internal `Dictionary`, so add it if not.
103+
set!(graph.vertex_data, vertex, data)
104+
return graph
105+
end
95106

96-
get_vertex_data(graph::GenericVertexDataGraph, vertex) = graph.vertex_data[vertex]
107+
get_vertex_data(graph::$GType, vertex) = graph.vertex_data[vertex]
97108

98-
function is_vertex_assigned(graph::GenericVertexDataGraph, vertex)
99-
return isassigned(graph.vertex_data, vertex)
109+
function is_vertex_assigned(graph::$GType, vertex)
110+
return isassigned(graph.vertex_data, vertex)
111+
end
112+
is_edge_assigned(::$GType, _edge) = false
113+
end
100114
end
101-
is_edge_assigned(::GenericVertexDataGraph, _edge) = false
102115

103116
# =================================== Dictionaries.jl ==================================== #
104117

105-
Dictionaries.isinsertable(::Type{<:GenericVertexDataGraph}, _edge) = true
118+
for GType in (:VertexDataGraph, :VertexDataDiGraph)
119+
@eval begin
120+
Dictionaries.isinsertable(::Type{<:$GType}, _edge) = true
121+
end
122+
end
106123

107124
function insert_vertex_data!(graph::AbstractVertexDataGraph, vertex, data)
108125
if has_vertex(graph, vertex)

0 commit comments

Comments
 (0)