package hopp import "fmt" type anyInt16 interface { ~uint16 | ~int16 } type anyInt64 interface { ~uint64 | ~int64 } // decodeI16 decodes a 16 bit integer from the given data. func decodeI16[T anyInt16](data []byte) (T, error) { if len(data) != 2 { return 0, fmt.Errorf("decoding int16: %w", ErrWrongBufferLength) } return T(data[0]) << 8 | T(data[1]), nil } // encodeI16 encodes a 16 bit integer into the given buffer. func encodeI16[T anyInt16](buffer []byte, value T) error { if len(buffer) != 2 { return fmt.Errorf("encoding int16: %w", ErrWrongBufferLength) } buffer[0] = byte(value >> 8) buffer[1] = byte(value) return nil } // decodeI64 decodes a 64 bit integer from the given data. func decodeI64[T anyInt64](data []byte) (T, error) { if len(data) != 8 { return 0, fmt.Errorf("decoding int64: %w", ErrWrongBufferLength) } return T(data[0]) << 56 | T(data[1]) << 48 | T(data[2]) << 40 | T(data[3]) << 32 | T(data[4]) << 24 | T(data[5]) << 16 | T(data[6]) << 8 | T(data[7]), nil } // encodeI64 encodes a 64 bit integer into the given buffer. func encodeI64[T anyInt64](buffer []byte, value T) error { if len(buffer) != 8 { return fmt.Errorf("encoding int64: %w", ErrWrongBufferLength) } buffer[0] = byte(value >> 56) buffer[1] = byte(value >> 48) buffer[2] = byte(value >> 40) buffer[3] = byte(value >> 32) buffer[4] = byte(value >> 24) buffer[5] = byte(value >> 16) buffer[6] = byte(value >> 8) buffer[7] = byte(value) return nil }