s0rg/decompose

View on GitHub
internal/graph/conngroup.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package graph

import (
    "cmp"
    "slices"

    "github.com/s0rg/set"
)

type ConnGroup struct {
    listenSeen set.Unordered[uint64]
    connSeen   set.Unordered[uint64]
    listen     []*Connection
    connected  []*Connection
}

func (cg *ConnGroup) Len() (rv int) {
    return len(cg.listen) + len(cg.connected)
}

func (cg *ConnGroup) AddListener(c *Connection) {
    cid, ok := c.UniqID()
    if !ok {
        return
    }

    if cg.listenSeen == nil {
        cg.listenSeen = make(set.Unordered[uint64])
    }

    if !cg.listenSeen.Add(cid) {
        return
    }

    cg.listen = append(cg.listen, c)
}

func (cg *ConnGroup) AddOutbound(c *Connection) {
    cid, ok := c.UniqID()
    if !ok {
        return
    }

    if cg.connSeen == nil {
        cg.connSeen = make(set.Unordered[uint64])
    }

    if !cg.connSeen.Add(cid) {
        return
    }

    cg.connected = append(cg.connected, c)
}

func (cg *ConnGroup) IterOutbounds(it func(*Connection)) {
    for _, con := range cg.connected {
        it(con)
    }
}

func (cg *ConnGroup) IterListeners(it func(*Connection)) {
    for _, con := range cg.listen {
        it(con)
    }
}

func (cg *ConnGroup) Sort() {
    slices.SortFunc(cg.listen, compare)
    slices.SortFunc(cg.connected, compare)
}

func compare(a, b *Connection) int {
    if a.Proto == b.Proto {
        return cmp.Compare(a.SrcPort, b.SrcPort)
    }

    return cmp.Compare(a.Proto, b.Proto)
}