////////////////////////////////////////////////
////////////////////////////////////////////////
///////////////   INTRODUCTION   ///////////////
////////////////////////////////////////////////
////////////////////////////////////////////////

// TODO(allen): fix it
#if !defined(MR4TH_BASE_H)
# error mr4th_buffer_operators.h should be included after mr4th_base.h
#endif


////////////////////////////////////////////////
////////////////////////////////////////////////
///////////////   DECLARATIONS   ///////////////
////////////////////////////////////////////////
////////////////////////////////////////////////

#if !defined(MR4TH_BUFFER_OPERATORS_DECL)
#define MR4TH_BUFFER_OPERATORS_DECL 1

////////////////////////////////
// Buffer Operator Types

typedef struct BOP_Data{
  U8 *data;
  U64 el_size;
  U64 el_count;
} BOP_Data;

////////////////////////////////
// Buffer Operator Functions

// construct

MR4TH_SYMBOL BOP_Data* bop_alloc(Arena *arena, U64 el_size, U64 el_count);
MR4TH_SYMBOL BOP_Data* bop_ptr(Arena *arena, U64 el_size, U64 el_count, void *ptr);

#define BOP_ALLOC_TYPE(a,T,c) bop_alloc((a),sizeof(T),(c))

MR4TH_SYMBOL BOP_Data* bop_subrange(Arena *arena, BOP_Data *data, U64 el_first, U64 el_count);

// interleave

MR4TH_SYMBOL void bop_interleave(BOP_Data *dst, BOP_Data **src, U64 lane_count);
MR4TH_SYMBOL void bop_uninterleave(BOP_Data **dst, BOP_Data *src, U64 lane_count);

// convert

MR4TH_SYMBOL void bop_f32_from_s24(BOP_Data *dst, BOP_Data *src);
MR4TH_SYMBOL void bop_s24_from_f32(BOP_Data *dst, BOP_Data *src);
MR4TH_SYMBOL void bop_s16_from_f32(BOP_Data *dst, BOP_Data *src);
MR4TH_SYMBOL void bop_f32_from_s16(BOP_Data *dst, BOP_Data *src);

MR4TH_SYMBOL void bop_f32_from_signed(BOP_Data *dst, BOP_Data *src, U32 numbits);

MR4TH_SYMBOL void bop_f32_from_f64(BOP_Data *dst, BOP_Data *src);

#endif /* MR4TH_BUFFER_OPERATORS_DECL */


