//
//  tb_codec.h
//  Tightbeam


#ifndef __TIGHTBEAM_CODEC_H
#define __TIGHTBEAM_CODEC_H

#include <sys/cdefs.h>
__ptrcheck_abi_assume_single()

#include <Tightbeam/tightbeam.h>

TB_ASSUME_NONNULL_BEGIN
__TB_BEGIN_DECLS

TB_EXPORT
void
tb_message_encode_buf(tb_message_t msg, const void *_Nonnull __sized_by(size) ptr, size_t size);

TB_EXPORT
void
tb_message_raw_encode_buf(tb_message_t msg, const void *_Nonnull __sized_by(size) ptr, size_t size);

TB_EXPORT
void
tb_message_decode_buf(tb_message_t msg, void *_Nonnull __sized_by(size) ptr, size_t size);

TB_EXPORT
void
tb_message_raw_decode_buf(tb_message_t msg, void *_Nonnull __sized_by(size) ptr, size_t size);

TB_EXPORT
size_t
tb_message_size_bool(void);

TB_EXPORT
void
tb_message_encode_bool(tb_message_t msg, bool val);

TB_EXPORT
void
tb_message_raw_encode_bool(tb_message_t msg, bool val);

TB_EXPORT
void
tb_message_raw_encode_range_bool(tb_message_t msg, bool __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_bool(tb_message_t msg, bool *val);

TB_EXPORT
void
tb_message_raw_decode_bool(tb_message_t msg, bool *val);

TB_EXPORT
void
tb_message_raw_decode_range_bool(tb_message_t msg, bool __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_u8(void);

TB_EXPORT
void
tb_message_encode_u8(tb_message_t msg, uint8_t val);

TB_EXPORT
void
tb_message_raw_encode_u8(tb_message_t msg, uint8_t val);

TB_EXPORT
void
tb_message_raw_encode_range_u8(tb_message_t msg, uint8_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_u8(tb_message_t msg, uint8_t *val);

TB_EXPORT
void
tb_message_raw_decode_u8(tb_message_t msg, uint8_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_u8(tb_message_t msg, uint8_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_u16(void);

TB_EXPORT
void
tb_message_encode_u16(tb_message_t msg, uint16_t val);

TB_EXPORT
void
tb_message_raw_encode_u16(tb_message_t msg, uint16_t val);

TB_EXPORT
void
tb_message_raw_encode_range_u16(tb_message_t msg, uint16_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_u16(tb_message_t msg, uint16_t *val);

TB_EXPORT
void
tb_message_raw_decode_u16(tb_message_t msg, uint16_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_u16(tb_message_t msg, uint16_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_u32(void);

TB_EXPORT
void
tb_message_encode_u32(tb_message_t msg, uint32_t val);

TB_EXPORT
void
tb_message_raw_encode_u32(tb_message_t msg, uint32_t val);

TB_EXPORT
void
tb_message_raw_encode_range_u32(tb_message_t msg, uint32_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_u32(tb_message_t msg, uint32_t *val);

TB_EXPORT
void
tb_message_raw_decode_u32(tb_message_t msg, uint32_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_u32(tb_message_t msg, uint32_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_u64(void);

TB_EXPORT
void
tb_message_encode_u64(tb_message_t msg, uint64_t val);

TB_EXPORT
void
tb_message_raw_encode_u64(tb_message_t msg, uint64_t val);

TB_EXPORT
void
tb_message_raw_encode_range_u64(tb_message_t msg, uint64_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_u64(tb_message_t msg, uint64_t *val);

TB_EXPORT
void
tb_message_raw_decode_u64(tb_message_t msg, uint64_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_u64(tb_message_t msg, uint64_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_s8(void);

TB_EXPORT
void
tb_message_encode_s8(tb_message_t msg, int8_t val);

TB_EXPORT
void
tb_message_raw_encode_s8(tb_message_t msg, int8_t val);

TB_EXPORT
void
tb_message_raw_encode_range_s8(tb_message_t msg, int8_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_s8(tb_message_t msg, int8_t *val);

TB_EXPORT
void
tb_message_raw_decode_s8(tb_message_t msg, int8_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_s8(tb_message_t msg, int8_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_s16(void);

TB_EXPORT
void
tb_message_encode_s16(tb_message_t msg, int16_t val);

TB_EXPORT
void
tb_message_raw_encode_s16(tb_message_t msg, int16_t val);

TB_EXPORT
void
tb_message_raw_encode_range_s16(tb_message_t msg, int16_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_s16(tb_message_t msg, int16_t *val);

TB_EXPORT
void
tb_message_raw_decode_s16(tb_message_t msg, int16_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_s16(tb_message_t msg, int16_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_s32(void);

TB_EXPORT
void
tb_message_encode_s32(tb_message_t msg, int32_t val);

TB_EXPORT
void
tb_message_raw_encode_s32(tb_message_t msg, int32_t val);

TB_EXPORT
void
tb_message_raw_encode_range_s32(tb_message_t msg, int32_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_s32(tb_message_t msg, int32_t *val);

TB_EXPORT
void
tb_message_raw_decode_s32(tb_message_t msg, int32_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_s32(tb_message_t msg, int32_t __counted_by(count) *dst, size_t count);

TB_EXPORT
size_t
tb_message_size_s64(void);

TB_EXPORT
void
tb_message_encode_s64(tb_message_t msg, int64_t val);

TB_EXPORT
void
tb_message_raw_encode_s64(tb_message_t msg, int64_t val);

TB_EXPORT
void
tb_message_raw_encode_range_s64(tb_message_t msg, int64_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_s64(tb_message_t msg, int64_t *val);

TB_EXPORT
void
tb_message_raw_decode_s64(tb_message_t msg, int64_t *val);

TB_EXPORT
void
tb_message_raw_decode_range_s64(tb_message_t msg, int64_t __counted_by(count) *dst, size_t count);

#if TB_HAS_FP32
TB_EXPORT
size_t
tb_message_size_f32(void);

TB_EXPORT
void
tb_validate_f32(tb_float32_t val);

TB_EXPORT
tb_error_t
tb_validate_f32_v2(tb_float32_t val);

TB_EXPORT
void
tb_message_encode_f32(tb_message_t msg, tb_float32_t val);

TB_EXPORT
tb_error_t
tb_message_encode_f32_v2(tb_message_t msg, tb_float32_t val);

TB_EXPORT
void
tb_message_raw_encode_f32(tb_message_t msg, tb_float32_t val);

TB_EXPORT
tb_error_t
tb_message_raw_encode_f32_v2(tb_message_t msg, tb_float32_t val);

TB_EXPORT
tb_error_t
tb_message_raw_encode_range_f32(tb_message_t msg, tb_float32_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_f32(tb_message_t msg, tb_float32_t *val);

TB_EXPORT
tb_error_t
tb_message_decode_f32_v2(tb_message_t msg, tb_float32_t *val);

TB_EXPORT
void
tb_message_raw_decode_f32(tb_message_t msg, tb_float32_t *val);

TB_EXPORT
tb_error_t
tb_message_raw_decode_f32_v2(tb_message_t msg, tb_float32_t *val);

TB_EXPORT
tb_error_t
tb_message_raw_decode_range_f32(tb_message_t msg, tb_float32_t __counted_by(count) *dst, size_t count);
#endif // TB_HAS_FP32

#if TB_HAS_FP64
TB_EXPORT
size_t
tb_message_size_f64(void);

TB_EXPORT
void
tb_validate_f64(tb_float64_t val);

TB_EXPORT
tb_error_t
tb_validate_f64_v2(tb_float64_t val);

TB_EXPORT
void
tb_message_encode_f64(tb_message_t msg, tb_float64_t val);

TB_EXPORT
tb_error_t
tb_message_encode_f64_v2(tb_message_t msg, tb_float64_t val);

TB_EXPORT
void
tb_message_raw_encode_f64(tb_message_t msg, tb_float64_t val);

TB_EXPORT
tb_error_t
tb_message_raw_encode_f64_v2(tb_message_t msg, tb_float64_t val);

TB_EXPORT
tb_error_t
tb_message_raw_encode_range_f64(tb_message_t msg, tb_float64_t __counted_by(count) *src, size_t count);

TB_EXPORT
void
tb_message_decode_f64(tb_message_t msg, tb_float64_t *val);

TB_EXPORT
tb_error_t
tb_message_decode_f64_v2(tb_message_t msg, tb_float64_t *val);

TB_EXPORT
void
tb_message_raw_decode_f64(tb_message_t msg, tb_float64_t *val);

TB_EXPORT
tb_error_t
tb_message_raw_decode_f64_v2(tb_message_t msg, tb_float64_t *val);

TB_EXPORT
tb_error_t
tb_message_raw_decode_range_f64(tb_message_t msg, tb_float64_t __counted_by(count) *dst, size_t count);
#endif // TB_HAS_FP64

__TB_END_DECLS
TB_ASSUME_NONNULL_END

#endif // __TIGHTBEAM_CODEC_H
