/* date = August 19th 2023 1:28 pm */

#ifndef BASE_SMALL_FUNCTIONS_H
#define BASE_SMALL_FUNCTIONS_H

////////////////////////////////
// NOTE(allen): Float Constant Functions

function F32 inf_F32(void);
function F32 neg_inf_F32(void);
function B32 is_inf_or_nan_F32(F32 x);
function F64 inf_F64(void);
function F64 neg_inf_or_nan_F64(void);

////////////////////////////////
// NOTE(allen): Numeric Functions

function F32 abs_F32(F32 x);
function F64 abs_F64(F64 x);
function F32 sign_F32(F32 x);
function F64 sign_F64(F64 x);

// TODO(allen): trig functions based on turns instead of radians?

function F32 sqrt_F32(F32 x);
function F32 sin_F32(F32 x);
function F32 cos_F32(F32 x);
function F32 tan_F32(F32 x);
function F32 atan_F32(F32 x);
function F32 atan2_F32(F32 x, F32 y);
function F32 ln_F32(F32 x);
function F32 pow_F32(F32 base, F32 x);

function F64 sqrt_F64(F64 x);
function F64 sin_F64(F64 x);
function F64 cos_F64(F64 x);
function F64 tan_F64(F64 x);
function F64 atan_F64(F64 x);
function F64 ln_F64(F64 x);
function F64 pow_F64(F64 base, F64 x);

function F32 lerp(F32 a, F32 t, F32 b);
function F32 unlerp(F32 a, F32 x, F32 b);

function F32 lerp_range(RangeF32 range, F32 t);

function F32 trunc_F32(F32 x);
function F32 floor_F32(F32 x);
function F32 ceil_F32(F32 x);

function F32 mod_F32(F32 x, F32 m);

////////////////////////////////
// NOTE(allen): Compound Type Functions

function V2S32 v2s32(S32 x, S32 y);

function V2F32 v2f32(F32 x, F32 y);
function V3F32 v3f32(F32 x, F32 y, F32 z);
function V4F32 v4f32(F32 x, F32 y, F32 z, F32 w);

function RangeF32 rangef32(F32 min, F32 max);

function RectF32 rectf32(F32 x0, F32 y0, F32 x1, F32 y1);
function RectF32 rectf32_vec(V2F32 min, V2F32 max);
function RectF32 rectf32_range(RangeF32 x, RangeF32 y);
function RectF32 rectf32_from_rects32(RectS32 *r);

function V2F32 v2f32_add(V2F32 a, V2F32 b);
function V2F32 v2f32_sub(V2F32 a, V2F32 b);
function V2F32 v2f32_scalar_mul(F32 s, V2F32 v);

function V2F32 v2f32_polar(F32 theta, F32 radius);
function F32   angle_from_v2f32(V2F32 v);

function V2S32 dim_from_rects32(RectS32 r);

////////////////////////////////
// NOTE(allen): Character Functions

function B32 str8_char_is_slash(U8 c);

function U8 str8_char_uppercase(U8 c);
function U8 str8_char_lowercase(U8 c);

////////////////////////////////
// NOTE(allen): String Constructor Functions

function String8 str8(U8 *str, U64 size);
function String8 str8_range(U8 *first, U8 *opl);
function String8 str8_cstring(U8 *cstr);

#define str8_lit(s) str8((U8*)(s), sizeof(s) - 1)
#define str8_typed(s) str8((U8*)(s), sizeof(*(s)))

function String8 str8_prefix(String8 str, U64 size);
function String8 str8_chop(String8 str, U64 amount);
function String8 str8_postfix(String8 str, U64 size);
function String8 str8_skip(String8 str, U64 amount);
function String8 str8_substr_opl(String8 str, U64 first, U64 opl);
function String8 str8_substr_size(String8 str, U64 first, U64 size);

function String16 str16(U16 *str, U64 size);
function String16 str16_cstring(U16 *cstr);

////////////////////////////////
// NOTE(allen): String Path Helpers

function String8 str8_chop_last_slash(String8 string);

////////////////////////////////
// NOTE(allen): Helpers for Serializer/Deserializer Code

function B32 str8_read(String8 data, U64 off, void *dst, U64 size);
#define str8_read_typed(d,o,p) str8_read((d), (o), p, sizeof(*(p)))


#endif //BASE_SMALL_FUNCTIONS_H
