Precompute exclusive group member tracks to avoid hot-loop map allocations
This commit is contained in:
@@ -90,19 +90,18 @@ func (c constraint) String() string {
|
|||||||
|
|
||||||
type exclusiveGroup struct {
|
type exclusiveGroup struct {
|
||||||
members []*TimelineCell
|
members []*TimelineCell
|
||||||
|
memberTracks map[*TimelineTrack]bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g exclusiveGroup) satisfied(tracks []*TimelineTrack) bool {
|
func (g exclusiveGroup) satisfied(tracks []*TimelineTrack) bool {
|
||||||
row := g.members[0].row
|
row := g.members[0].row
|
||||||
memberTracks := map[*TimelineTrack]bool{}
|
|
||||||
for _, m := range g.members {
|
for _, m := range g.members {
|
||||||
memberTracks[m.track] = true
|
|
||||||
if m.row != row {
|
if m.row != row {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, t := range tracks {
|
for _, t := range tracks {
|
||||||
if memberTracks[t] {
|
if g.memberTracks[t] {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t.cellTypeAt(row, CellEvent, CellTitle, CellSignal) {
|
if t.cellTypeAt(row, CellEvent, CellTitle, CellSignal) {
|
||||||
@@ -245,7 +244,10 @@ func (tl *Timeline) buildConstraints() {
|
|||||||
for _, trigger := range tl.show.Triggers {
|
for _, trigger := range tl.show.Triggers {
|
||||||
source := tl.findCell(trigger.Source.Block, trigger.Source.Signal)
|
source := tl.findCell(trigger.Source.Block, trigger.Source.Signal)
|
||||||
|
|
||||||
group := exclusiveGroup{members: []*TimelineCell{source}}
|
group := exclusiveGroup{
|
||||||
|
members: []*TimelineCell{source},
|
||||||
|
memberTracks: map[*TimelineTrack]bool{source.track: true},
|
||||||
|
}
|
||||||
|
|
||||||
for _, target := range trigger.Targets {
|
for _, target := range trigger.Targets {
|
||||||
t := tl.findCell(target.Block, target.Hook)
|
t := tl.findCell(target.Block, target.Hook)
|
||||||
@@ -254,6 +256,7 @@ func (tl *Timeline) buildConstraints() {
|
|||||||
source.Type = CellSignal
|
source.Type = CellSignal
|
||||||
}
|
}
|
||||||
group.members = append(group.members, t)
|
group.members = append(group.members, t)
|
||||||
|
group.memberTracks[t.track] = true
|
||||||
}
|
}
|
||||||
tl.exclusives = append(tl.exclusives, group)
|
tl.exclusives = append(tl.exclusives, group)
|
||||||
}
|
}
|
||||||
@@ -308,12 +311,8 @@ func (tl *Timeline) enforceExclusives() bool {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
row := g.members[0].row
|
row := g.members[0].row
|
||||||
memberTracks := map[*TimelineTrack]bool{}
|
|
||||||
for _, m := range g.members {
|
|
||||||
memberTracks[m.track] = true
|
|
||||||
}
|
|
||||||
for _, t := range tl.Tracks {
|
for _, t := range tl.Tracks {
|
||||||
if memberTracks[t] {
|
if g.memberTracks[t] {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !t.cellTypeAt(row, CellEvent, CellTitle, CellSignal) {
|
if !t.cellTypeAt(row, CellEvent, CellTitle, CellSignal) {
|
||||||
|
|||||||
Reference in New Issue
Block a user