func BenchmarkSparseBitVector(b *testing.B) { prng := rand.New(rand.NewSource(0)) for tries := 0; tries < b.N; tries++ { var x, y, z intsets.Sparse for i := 0; i < 1000; i++ { n := int(prng.Int()) % 100000 if i%2 == 0 { x.Insert(n) } else { y.Insert(n) } } z.Union(&x, &y) z.Difference(&x, &y) } }
func computeChainFrom(from, to canvas.Node) (chain []canvas.NodeIfc) { // For each link, there is a chain of modules to be invoked: the // ingress policy modules, the egress policy modules, and the final // forwarding nexthop. // // To compute the chain in each direction, the following algorithm is // followed: // Let T and F represent the set of groups for the 'to' and 'from' // nodes, respectively. // The leaving set L is the set difference between F and T. // L := F - T // The entering set E is the set difference between T and F // E := T - F // // For the directed edge from:to, the chain is built as follows: // For each module e in E, invoke the ingress policy (e.ifc[1]) // For each module l in L, invoke the egress policy (l.ifc[2]) // // The directed edge to:from is calculated by calling this function // with to/from reversed. var e, l, x intsets.Sparse l.Difference(from.Groups(), to.Groups()) e.Difference(to.Groups(), from.Groups()) var id int x.Copy(&e) for x.TakeMin(&id) { chain = append(chain, canvas.NodeIfc{id, 1}) } x.Copy(&l) for x.TakeMin(&id) { chain = append(chain, canvas.NodeIfc{id, 2}) } return chain }