func CombineSlices()

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,
	}
}