#pragma once
// base_strings.h - Simple length-delimited string type
// Inspired by raddebugger's String8

#include "base/base_core.h"

////////////////////////////////
// String types

struct Str8 {
    const char *str;
    U64         size;
};

struct Str8Node {
    Str8Node *next;
    Str8      string;
};

struct Str8List {
    Str8Node *first;
    Str8Node *last;
    U64       count;
    U64       total_size;
};

////////////////////////////////
// Forward declaration for Arena
struct Arena;

////////////////////////////////
// Constructors

static inline Str8 str8(const char *s, U64 len)  { return {s, len}; }
static inline Str8 str8_cstr(const char *s)       { return {s, s ? (U64)strlen(s) : 0}; }
static inline Str8 str8_lit(const char *s)         { return {s, s ? (U64)strlen(s) : 0}; }
static inline B32  str8_match(Str8 a, Str8 b) {
    if (a.size != b.size) return 0;
    return MemoryCompare(a.str, b.str, a.size) == 0;
}
static inline B32 str8_is_empty(Str8 s) { return s.size == 0 || s.str == nullptr; }

////////////////////////////////
// String operations (require arena)

Str8 str8_pushf(Arena *arena, const char *fmt, ...);
Str8 str8_push_copy(Arena *arena, Str8 s);

void str8_list_push(Arena *arena, Str8List *list, Str8 s);
