Skip to content

Commit 89422d5

Browse files
Add EdgeCount to Store interface (#146)
1 parent 3908bcf commit 89422d5

File tree

3 files changed

+21
-23
lines changed

3 files changed

+21
-23
lines changed

directed.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -273,17 +273,7 @@ func (d *directed[K, T]) Order() (int, error) {
273273
}
274274

275275
func (d *directed[K, T]) Size() (int, error) {
276-
size := 0
277-
outEdges, err := d.AdjacencyMap()
278-
if err != nil {
279-
return 0, fmt.Errorf("failed to get adjacency map: %w", err)
280-
}
281-
282-
for _, outEdges := range outEdges {
283-
size += len(outEdges)
284-
}
285-
286-
return size, nil
276+
return d.store.EdgeCount()
287277
}
288278

289279
func (d *directed[K, T]) edgesAreEqual(a, b Edge[T]) bool {

store.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ type Store[K comparable, T any] interface {
6262

6363
// ListEdges should return all edges in the graph in a slice.
6464
ListEdges() ([]Edge[K], error)
65+
66+
// EdgeCount should return the number of edges in the graph. This should be equal to the
67+
// length of the slice returned by ListEdges.
68+
EdgeCount() (int, error)
6569
}
6670

6771
type memoryStore[K comparable, T any] struct {
@@ -73,6 +77,7 @@ type memoryStore[K comparable, T any] struct {
7377
// these edges themselves are stored in maps whose keys are the hashes of the target vertices.
7478
outEdges map[K]map[K]Edge[K] // source -> target
7579
inEdges map[K]map[K]Edge[K] // target -> source
80+
edgeCount int
7681
}
7782

7883
func newMemoryStore[K comparable, T any]() Store[K, T] {
@@ -175,6 +180,8 @@ func (s *memoryStore[K, T]) AddEdge(sourceHash, targetHash K, edge Edge[K]) erro
175180

176181
s.inEdges[targetHash][sourceHash] = edge
177182

183+
s.edgeCount++
184+
178185
return nil
179186
}
180187

@@ -198,6 +205,9 @@ func (s *memoryStore[K, T]) RemoveEdge(sourceHash, targetHash K) error {
198205

199206
delete(s.inEdges[targetHash], sourceHash)
200207
delete(s.outEdges[sourceHash], targetHash)
208+
209+
s.edgeCount--
210+
201211
return nil
202212
}
203213

@@ -218,11 +228,18 @@ func (s *memoryStore[K, T]) Edge(sourceHash, targetHash K) (Edge[K], error) {
218228
return edge, nil
219229
}
220230

231+
func (s *memoryStore[K, T]) EdgeCount() (int, error) {
232+
s.lock.RLock()
233+
defer s.lock.RUnlock()
234+
235+
return s.edgeCount, nil
236+
}
237+
221238
func (s *memoryStore[K, T]) ListEdges() ([]Edge[K], error) {
222239
s.lock.RLock()
223240
defer s.lock.RUnlock()
224241

225-
res := make([]Edge[K], 0)
242+
res := make([]Edge[K], 0, s.edgeCount)
226243
for _, edges := range s.outEdges {
227244
for _, edge := range edges {
228245
res = append(res, edge)

undirected.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -311,20 +311,11 @@ func (u *undirected[K, T]) Order() (int, error) {
311311
}
312312

313313
func (u *undirected[K, T]) Size() (int, error) {
314-
size := 0
315-
316-
outEdges, err := u.AdjacencyMap()
317-
if err != nil {
318-
return 0, fmt.Errorf("failed to get adjacency map: %w", err)
319-
}
320-
321-
for _, outEdges := range outEdges {
322-
size += len(outEdges)
323-
}
314+
edgeCount, err := u.store.EdgeCount()
324315

325316
// Divide by 2 since every add edge operation on undirected graph is counted
326317
// twice.
327-
return size / 2, nil
318+
return edgeCount / 2, err
328319
}
329320

330321
func (u *undirected[K, T]) edgesAreEqual(a, b Edge[T]) bool {

0 commit comments

Comments
 (0)