summaryrefslogtreecommitdiff
path: root/src/string_vec.h
blob: 6f54d56efdd8da6aa0284d040d291ca43988d77d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#ifndef STRING_VEC_H
#define STRING_VEC_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "history.h"

struct scored_string {
	char *string;
	int32_t search_score;
	int32_t history_score;
};

struct string_vec {
	size_t count;
	size_t size;
	struct scored_string *buf;
};

[[nodiscard("memory leaked")]]
struct string_vec string_vec_create(void);

void string_vec_destroy(struct string_vec *restrict vec);

void string_vec_add(struct string_vec *restrict vec, const char *restrict str);

void string_vec_sort(struct string_vec *restrict vec);

struct scored_string *string_vec_find_sorted(struct string_vec *restrict vec, const char *str);


/*
 * Like a string_vec, but only store a reference to the corresponding string
 * rather than copying it. Although compatible with the string_vec struct, we
 * create a new struct to make the compiler complain if we mix them up.
 */
struct scored_string_ref {
	char *string;
	int32_t search_score;
	int32_t history_score;
};

struct string_ref_vec {
	size_t count;
	size_t size;
	struct scored_string_ref *buf;
};

/*
 * Although some of these functions are identical to the corresponding
 * string_vec ones, we create new functions to avoid potentially mixing up
 * the two.
 */
[[nodiscard("memory leaked")]]
struct string_ref_vec string_ref_vec_create(void);

void string_ref_vec_destroy(struct string_ref_vec *restrict vec);

[[nodiscard("memory leaked")]]
struct string_ref_vec string_ref_vec_copy(const struct string_ref_vec *restrict vec);

void string_ref_vec_add(struct string_ref_vec *restrict vec, char *restrict str);

void string_ref_vec_history_sort(struct string_ref_vec *restrict vec, struct history *history);

void string_vec_uniq(struct string_vec *restrict vec);

struct scored_string_ref *string_ref_vec_find_sorted(struct string_ref_vec *restrict vec, const char *str);

[[nodiscard("memory leaked")]]
struct string_ref_vec string_ref_vec_filter(
		const struct string_ref_vec *restrict vec,
		const char *restrict substr,
		bool fuzzy);

[[nodiscard("memory leaked")]]
struct string_ref_vec string_ref_vec_from_buffer(char *buffer);

#endif /* STRING_VEC_H */