in pkg/tools/buffer/buffer.go [416:462]
func CombineSlices(validated bool, originalBuffer *Buffer, buffers ...*Buffer) *Buffer {
if len(buffers) == 0 {
return nil
}
if len(buffers) == 1 {
return buffers[0]
}
dataEvents := list.New()
for _, b := range buffers {
if b == nil || b.head == nil {
continue
}
if b.head.bufIndex > 0 {
headBuffer := b.dataEvents.Front().Value.(SocketDataBuffer)
dataEvents.PushBack(&SocketDataEventLimited{SocketDataBuffer: headBuffer,
From: b.head.bufIndex, Size: headBuffer.BufferLen()})
for next := b.dataEvents.Front().Next(); next != nil; next = next.Next() {
dataEvents.PushBack(next.Value)
}
} else {
dataEvents.PushBackList(b.dataEvents)
}
}
var endPosition *Position
for i := len(buffers) - 1; i >= 0; i-- {
if buffers[i] == nil {
continue
}
if buffers[i].endPosition != nil {
endPosition = buffers[i].endPosition
break
} else if buffers[i].Position() != nil {
endPosition = buffers[i].Position()
break
}
}
return &Buffer{
dataEvents: dataEvents,
detailEvents: emptyList, // for the combined buffer, the details list should be queried from original buffer
validated: validated,
head: &Position{element: dataEvents.Front(), bufIndex: 0},
current: &Position{element: dataEvents.Front(), bufIndex: 0},
originalBuffer: originalBuffer,
endPosition: endPosition,
}
}