Skip to content
This repository has been archived by the owner on Feb 4, 2021. It is now read-only.

Commit

Permalink
Make edge-adding variadic: Graph.AddEdge() -> Graph.AddEdges()
Browse files Browse the repository at this point in the history
  • Loading branch information
sdboyer committed Feb 27, 2014
1 parent 1f600be commit 80a5eb9
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 27 deletions.
27 changes: 15 additions & 12 deletions directed.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ func NewDirected() *Directed {
func NewDirectedFromEdgeSet(set []Edge) *Directed {
g := NewDirected()

for _, edge := range set {
g.addEdge(edge)
}
g.addEdges(set...)

return g
}
Expand Down Expand Up @@ -120,23 +118,28 @@ func (g *Directed) RemoveVertex(vertices ...Vertex) {
return
}

// Adds a new edge to the graph.
func (g *Directed) AddEdge(edge Edge) bool {
// Adds edges to the graph.
func (g *Directed) AddEdges(edges ...Edge) {
if len(edges) == 0 {
return
}

g.mu.Lock()
defer g.mu.Unlock()

return g.addEdge(edge)
g.addEdges(edges...)
}

// Adds a new edge to the graph.
func (g *Directed) addEdge(edge Edge) (exists bool) {
g.ensureVertex(edge.Source(), edge.Target())
func (g *Directed) addEdges(edges ...Edge) {
for _, edge := range edges {
g.ensureVertex(edge.Source(), edge.Target())

if _, exists = g.list[edge.Source()][edge.Target()]; !exists {
g.list[edge.Source()][edge.Target()] = keyExists
g.size++
if _, exists := g.list[edge.Source()][edge.Target()]; !exists {
g.list[edge.Source()][edge.Target()] = keyExists
g.size++
}
}
return !exists
}

// Removes an edge from the graph. This does NOT remove vertex members of the
Expand Down
4 changes: 2 additions & 2 deletions directed_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ func TestDensity(t *testing.T) {
t.Error("On graph initialize, Density should be NaN (divides zero by zero)).")
}

g.AddEdge(&BaseEdge{"foo", "bar"})
g.AddEdges(&BaseEdge{"foo", "bar"})

density = g.Density()
if density != 1 {
t.Error("In undirected graph of V = 2 and E = 1, density should be 1; was", density)
}

g.AddEdge(&BaseEdge{"baz", "qux"})
g.AddEdges(&BaseEdge{"baz", "qux"})

density = g.Density()
if density != float64(1)/float64(3) {
Expand Down
2 changes: 1 addition & 1 deletion graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ type MutableGraph interface {
Graph
EnsureVertex(vertices ...Vertex)
RemoveVertex(vertices ...Vertex)
AddEdge(edge Edge) bool
AddEdges(edges ...Edge)
RemoveEdge(edge Edge)
}

Expand Down
25 changes: 25 additions & 0 deletions graph_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package gogl

import (
"fmt"
"github.com/fatih/set"
. "launchpad.net/gocheck"
"testing"
)
Expand Down Expand Up @@ -149,3 +150,27 @@ func (s *MutableGraphSuite) TestMultiRemoveVertex(c *C) {
c.Assert(s.Graph.HasVertex("bar"), Equals, false)
c.Assert(s.Graph.HasVertex("baz"), Equals, false)
}

func (s *MutableGraphSuite) TestAddEdge(c *C) {
s.Graph.AddEdges(&BaseEdge{1, 2})

f := func(e Edge) {
c.Assert(BaseEdge{e.Source(), e.Target()}, Equals, BaseEdge{1, 2})
}

s.Graph.EachEdge(f)
}

func (s *MutableGraphSuite) TestMultiAddEdge(c *C) {
s.Graph.AddEdges(&BaseEdge{1, 2}, &BaseEdge{2, 3})
set := set.NewNonTS()

f := func(e Edge) {
set.Add(e)
}

s.Graph.EachEdge(f)
c.Assert(set.Has(BaseEdge{1, 2}), Equals, true)
c.Assert(set.Has(BaseEdge{2, 3}), Equals, true)
}

29 changes: 17 additions & 12 deletions undirected.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func NewUndirectedFromEdgeSet(set []Edge) *Undirected {
g := NewUndirected()

for _, edge := range set {
g.addEdge(edge)
g.addEdges(edge)
}

return g
Expand Down Expand Up @@ -103,24 +103,29 @@ func (g *Undirected) RemoveVertex(vertices ...Vertex) {
return
}

// Adds a new edge to the graph.
func (g *Undirected) AddEdge(edge Edge) bool {
// Adds edges to the graph.
func (g *Undirected) AddEdges(edges ...Edge) {
if len(edges) == 0 {
return
}

g.mu.Lock()
defer g.mu.Unlock()

return g.addEdge(edge)
g.addEdges(edges...)
}

// Adds a new edge to the graph.
func (g *Undirected) addEdge(edge Edge) (exists bool) {
g.ensureVertex(edge.Source(), edge.Target())

if _, exists = g.list[edge.Source()][edge.Target()]; !exists {
g.list[edge.Source()][edge.Target()] = keyExists
g.list[edge.Target()][edge.Source()] = keyExists
g.size++
func (g *Undirected) addEdges(edges ...Edge) {
for _, edge := range edges {
g.ensureVertex(edge.Source(), edge.Target())

if _, exists := g.list[edge.Source()][edge.Target()]; !exists {
g.list[edge.Source()][edge.Target()] = keyExists
g.list[edge.Target()][edge.Source()] = keyExists
g.size++
}
}
return !exists
}

// Removes an edge from the graph. This does NOT remove vertex members of the
Expand Down

0 comments on commit 80a5eb9

Please sign in to comment.