core: add rope data structure for efficiently building strings
This commit is contained in:
103
core/include/blue/core/rope.h
Normal file
103
core/include/blue/core/rope.h
Normal file
@@ -0,0 +1,103 @@
|
||||
#ifndef BLUE_CORE_ROPE_H_
|
||||
#define BLUE_CORE_ROPE_H_
|
||||
|
||||
#include <blue/core/hash.h>
|
||||
#include <blue/core/misc.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
struct b_string;
|
||||
|
||||
#define B_ROPE_TYPE(f) ((f) & 0xFF)
|
||||
|
||||
#define B_ROPE_CHAR(c) \
|
||||
\
|
||||
{ \
|
||||
.r_flags = B_ROPE_F_CHAR, .r_len_total = 1, \
|
||||
.r_v = {.v_char = (c) } \
|
||||
}
|
||||
|
||||
#define B_ROPE_CSTR(str) \
|
||||
{ \
|
||||
.r_flags = B_ROPE_F_CSTR_BORROWED, \
|
||||
.r_len_total = strlen(str), \
|
||||
.r_v = { \
|
||||
.v_cstr = { \
|
||||
.s = (str), \
|
||||
.hash = b_hash_string(str), \
|
||||
}, \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define B_ROPE_CSTR_STATIC(str) \
|
||||
{ \
|
||||
.r_flags = B_ROPE_F_CSTR_STATIC, \
|
||||
.r_len_total = strlen(str), \
|
||||
.r_v = { \
|
||||
.v_cstr = { \
|
||||
.s = (str), \
|
||||
.hash = b_hash_string(str), \
|
||||
}, \
|
||||
}, \
|
||||
}
|
||||
#define B_ROPE_INT(v) \
|
||||
\
|
||||
{ \
|
||||
.r_flags = B_ROPE_F_INT, .r_len_total = b_int_length(v), \
|
||||
.r_v = {.v_int = (v) } \
|
||||
}
|
||||
#define B_ROPE_UINT(v) \
|
||||
\
|
||||
{ \
|
||||
.r_flags = B_ROPE_F_UINT, .r_len_total = b_uint_length(v), \
|
||||
.r_v = {.v_uint = (v) } \
|
||||
}
|
||||
|
||||
typedef enum b_rope_flags {
|
||||
B_ROPE_F_NONE = 0x0000u,
|
||||
B_ROPE_F_CHAR = 0x0001u,
|
||||
B_ROPE_F_CSTR = 0x0002u,
|
||||
B_ROPE_F_CSTR_BORROWED = 0x0003u,
|
||||
B_ROPE_F_CSTR_STATIC = 0x0004u,
|
||||
B_ROPE_F_INT = 0x0005u,
|
||||
B_ROPE_F_UINT = 0x0006u,
|
||||
B_ROPE_F_COMPOSITE = 0x0007u,
|
||||
B_ROPE_F_MALLOC = 0x0100u,
|
||||
} b_rope_flags;
|
||||
|
||||
typedef struct b_rope {
|
||||
b_rope_flags r_flags;
|
||||
unsigned long r_len_left, r_len_total;
|
||||
|
||||
union {
|
||||
char v_char;
|
||||
intptr_t v_int;
|
||||
uintptr_t v_uint;
|
||||
|
||||
struct {
|
||||
const char *s;
|
||||
uint64_t hash;
|
||||
} v_cstr;
|
||||
|
||||
struct {
|
||||
const struct b_rope *r_left, *r_right;
|
||||
} v_composite;
|
||||
} r_v;
|
||||
} b_rope;
|
||||
|
||||
BLUE_API void b_rope_init_char(b_rope *rope, char c);
|
||||
BLUE_API void b_rope_init_cstr(b_rope *rope, const char *s);
|
||||
BLUE_API void b_rope_init_cstr_borrowed(b_rope *rope, const char *s);
|
||||
BLUE_API void b_rope_init_cstr_static(b_rope *rope, const char *s);
|
||||
BLUE_API void b_rope_init_int(b_rope *rope, intptr_t v);
|
||||
BLUE_API void b_rope_init_uint(b_rope *rope, uintptr_t v);
|
||||
|
||||
BLUE_API void b_rope_destroy(b_rope *rope);
|
||||
|
||||
BLUE_API size_t b_rope_get_size(const b_rope *rope);
|
||||
BLUE_API void b_rope_concat(b_rope *result, const b_rope *left, const b_rope *right);
|
||||
BLUE_API void b_rope_join(b_rope *result, const b_rope **ropes, size_t nr_ropes);
|
||||
|
||||
BLUE_API void b_rope_to_cstr(const b_rope *rope, char *out, size_t max);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user