Keep sequence projection storage proportional to assigned items
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
package engine
|
||||
|
||||
import "gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
import (
|
||||
"maps"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
)
|
||||
|
||||
// composedDocument is the private handoff between source assembly and later
|
||||
// precedence layers. Claims remain ordered by source and declaration traversal;
|
||||
@@ -89,19 +93,18 @@ type sequenceRange struct {
|
||||
projection sequenceItemProjectionIndex
|
||||
}
|
||||
|
||||
func (assigned sequenceRange) projections() []sequenceItemProjection {
|
||||
if assigned.items != nil {
|
||||
return append([]sequenceItemProjection{}, assigned.items...)
|
||||
}
|
||||
return sequenceItemProjections(assigned.end-assigned.start, assigned.start)
|
||||
}
|
||||
|
||||
func (assigned sequenceRange) outputForInput(inputIndex int) (int, bool) {
|
||||
if assigned.projection.outputByInput != nil {
|
||||
return assigned.projection.outputForInput(inputIndex)
|
||||
}
|
||||
if assigned.items != nil {
|
||||
return newSequenceItemProjectionIndex(assigned.items).outputForInput(inputIndex)
|
||||
output, found := 0, false
|
||||
for _, item := range assigned.items {
|
||||
if item.inputIndex == inputIndex && inputIndex >= 0 && item.outputIndex >= 0 {
|
||||
output, found = item.outputIndex, true
|
||||
}
|
||||
}
|
||||
return output, found
|
||||
}
|
||||
if inputIndex < 0 || inputIndex >= assigned.end-assigned.start {
|
||||
return 0, false
|
||||
@@ -114,7 +117,13 @@ func (assigned sequenceRange) inputForOutput(outputIndex int) (int, bool) {
|
||||
return assigned.projection.inputForOutput(outputIndex)
|
||||
}
|
||||
if assigned.items != nil {
|
||||
return newSequenceItemProjectionIndex(assigned.items).inputForOutput(outputIndex)
|
||||
input, found := 0, false
|
||||
for _, item := range assigned.items {
|
||||
if item.outputIndex == outputIndex && outputIndex >= 0 && item.inputIndex >= 0 {
|
||||
input, found = item.inputIndex, true
|
||||
}
|
||||
}
|
||||
return input, found
|
||||
}
|
||||
if outputIndex < assigned.start || outputIndex >= assigned.end {
|
||||
return 0, false
|
||||
@@ -123,8 +132,8 @@ func (assigned sequenceRange) inputForOutput(outputIndex int) (int, bool) {
|
||||
}
|
||||
|
||||
func indexSequenceRange(assigned sequenceRange) sequenceRange {
|
||||
if assigned.projection.outputByInput == nil && assigned.projection.inputByOutput == nil {
|
||||
assigned.projection = newSequenceItemProjectionIndex(assigned.projections())
|
||||
if assigned.items != nil && assigned.projection.outputByInput == nil && assigned.projection.inputByOutput == nil {
|
||||
assigned.projection = newSequenceItemProjectionIndex(assigned.items)
|
||||
}
|
||||
return assigned
|
||||
}
|
||||
@@ -459,8 +468,8 @@ func cloneSequenceRanges(ranges []sequenceRange) []sequenceRange {
|
||||
if assigned.items != nil {
|
||||
cloned[i].items = append([]sequenceItemProjection{}, assigned.items...)
|
||||
}
|
||||
cloned[i].projection.outputByInput = append([]int(nil), assigned.projection.outputByInput...)
|
||||
cloned[i].projection.inputByOutput = append([]int(nil), assigned.projection.inputByOutput...)
|
||||
cloned[i].projection.outputByInput = maps.Clone(assigned.projection.outputByInput)
|
||||
cloned[i].projection.inputByOutput = maps.Clone(assigned.projection.inputByOutput)
|
||||
}
|
||||
return cloned
|
||||
}
|
||||
@@ -502,9 +511,15 @@ func projectedCompositionOrigins(inputs []*document.Node, ranges []sequenceRange
|
||||
origins := make(map[string]Origin)
|
||||
sequencesBySource := make([][]sequenceHistoryContribution, len(inputs))
|
||||
for _, assigned := range ranges {
|
||||
sequencesBySource[assigned.sourceIndex] = append(sequencesBySource[assigned.sourceIndex], sequenceHistoryContribution{
|
||||
path: assigned.path.clone(), mode: sequenceHistoryMapped, items: assigned.projections(),
|
||||
})
|
||||
contribution := sequenceHistoryContribution{
|
||||
path: assigned.path.clone(), mode: sequenceHistoryAppend,
|
||||
offset: assigned.start, length: assigned.end - assigned.start,
|
||||
}
|
||||
if assigned.items != nil {
|
||||
contribution.mode = sequenceHistoryMapped
|
||||
contribution.items = assigned.items
|
||||
}
|
||||
sequencesBySource[assigned.sourceIndex] = append(sequencesBySource[assigned.sourceIndex], contribution)
|
||||
}
|
||||
for sourceIndex, input := range inputs {
|
||||
application := historyApplication{value: input, sequences: sequencesBySource[sourceIndex]}
|
||||
|
||||
Reference in New Issue
Block a user