// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package erofs

// This file contains compression-related functions.
// TODO(lorenz): Fully implement compression. These are currently unused.

import "encoding/binary"

// mapHeader is a legacy but still-used advisory structure at the start of a compressed VLE block. It contains constant
// values as annotated.
type mapHeader struct {
	Reserved      uint32 // 0
	Advise        uint16 // 1
	AlgorithmType uint8  // 0
	ClusterBits   uint8  // 0
}

// encodeSmallVLEBlock encodes two VLE extents into a 8 byte block.
func encodeSmallVLEBlock(vals [2]uint16, blkaddr uint32) [8]byte {
	var out [8]byte
	binary.LittleEndian.PutUint16(out[0:2], vals[0])
	binary.LittleEndian.PutUint16(out[2:4], vals[1])
	binary.LittleEndian.PutUint32(out[4:8], blkaddr)
	return out
}

// encodeBigVLEBlock encodes 16 VLE extents into a 32 byte block.
func encodeBigVLEBlock(vals [16]uint16, blkaddr uint32) [32]byte {
	var out [32]byte
	for i, val := range vals {
		if val > 1<<14 {
			panic("value is bigger than 14 bits, cannot encode")
		}
		// Writes packed 14 bit unsigned integers
		pos := i * 14
		bitStartPos := pos % 8
		byteStartPos := pos / 8
		out[byteStartPos] = out[byteStartPos]&((1<<bitStartPos)-1) | uint8(val<<bitStartPos)
		out[byteStartPos+1] = uint8(val >> (8 - bitStartPos))
		out[byteStartPos+2] = uint8(val >> (16 - bitStartPos))
	}
	binary.LittleEndian.PutUint32(out[28:32], blkaddr)
	return out
}
