// #string_builder
// #limitations This won't be as fast as Jon's String_Builder in jai because we're backing it with an 
// Arena, which calls VirtualAlloc, which is much slower than just using stack space to start. 
// It also has a max capacity depending on what Arena_Reserve we choose. 
// That being said, the implementation is much simpler, and we can keep it around for a bit.
// We can make it a lot faster by always having a string builder available in the thread_context, 
// and just fetching that when we need it.

typedef ArenaArray<u8> String_Builder; // struct String_Builder


force_inline String_Builder* new_string_builder (Arena_Reserve new_reserve=Arena_Reserve::Size_64K, string label="");
force_inline void append (String_Builder* sb, string s);
void append (String_Builder* sb, ArrayView<string> strings); 
// This should probably be called append_but_do_not_increment_count
internal force_inline void append_no_add (String_Builder* sb, string s); // for appending null terminators, does not increment count.
void print_to_builder (String_Builder* sb, string format, ...);
void print_to_builder_internal (String_Builder* sb, string format, va_list args);
string string_view (String_Builder* sb);
internal force_inline void reset_string_builder (String_Builder* sb, bool keep_memory=false);

force_inline string builder_to_string (String_Builder* sb); // returns copy and frees string_builder
internal force_inline void free_string_builder (String_Builder* sb);


