func putPinnedSlidingMerged()

in cpc/utils.go [691:749]


func putPinnedSlidingMerged(mem []byte, lgK int, fiCol int, numCoupons int, numSv int, svLengthInts int, wLengthInts int, seedHash int16, svStream []int, wStream []int) error {
	// Set the format.
	format := CpcFormatPinnedSlidingMerged
	preInts := byte(getDefinedPreInts(format))
	flags := byte((int(format) << 2) | compressedFlagMask)

	// Check that the memory slice has enough capacity.
	if err := checkCapacity(len(mem), 4*(int(preInts)+svLengthInts+wLengthInts)); err != nil {
		return err
	}
	// Write the low preamble fields.
	if err := putFirst8(mem, preInts, byte(lgK), byte(fiCol), flags, seedHash); err != nil {
		return err
	}

	// Write high preamble fields.
	offset, err := getHiFieldOffset(format, hiFieldNumCoupons)
	if err != nil {
		return err
	}
	binary.LittleEndian.PutUint32(mem[offset:], uint32(numCoupons))

	offset, err = getHiFieldOffset(format, hiFieldNumSV)
	if err != nil {
		return err
	}
	binary.LittleEndian.PutUint32(mem[offset:], uint32(numSv))

	offset, err = getHiFieldOffset(format, hiFieldSVLengthInts)
	if err != nil {
		return err
	}
	binary.LittleEndian.PutUint32(mem[offset:], uint32(svLengthInts))

	offset, err = getHiFieldOffset(format, hiFieldWLengthInts)
	if err != nil {
		return err
	}
	binary.LittleEndian.PutUint32(mem[offset:], uint32(wLengthInts))

	// Write the SV stream array.
	offset, err = getSvStreamOffset(mem)
	if err != nil {
		return err
	}
	for i := 0; i < svLengthInts; i++ {
		binary.LittleEndian.PutUint32(mem[offset+4*i:], uint32(svStream[i]))
	}

	// Write the W stream array.
	offset, err = getWStreamOffset(mem)
	if err != nil {
		return err
	}
	for i := 0; i < wLengthInts; i++ {
		binary.LittleEndian.PutUint32(mem[offset+4*i:], uint32(wStream[i]))
	}
	return nil
}