diff --git a/src/lib/salad/rope.c b/src/lib/salad/rope.c index e5d720e3855a380a1decee68afeb200b0f28898f..deb553ff442f5b722d95014764660c5c46c27db9 100644 --- a/src/lib/salad/rope.c +++ b/src/lib/salad/rope.c @@ -71,7 +71,7 @@ rope_relink(struct rope_node *node) } static inline struct rope_node * -rope_node_new(struct rope *rope, void *data, rsize_t size) +rope_node_new(struct rope *rope, void *data, rope_size_t size) { struct rope_node *node = (struct rope_node *) rope->alloc(rope->alloc_ctx, @@ -112,9 +112,9 @@ rope_clear(struct rope *rope) } static struct rope_node * -rope_node_split(struct rope *rope, struct rope_node *node, rsize_t offset) +rope_node_split(struct rope *rope, struct rope_node *node, rope_size_t offset) { - rsize_t old_size = node->leaf_size; + rope_size_t old_size = node->leaf_size; node->leaf_size = offset; void *data = rope->split(rope->split_ctx, node->data, old_size, offset); @@ -260,16 +260,16 @@ avl_rebalance_after_delete(struct rope_node ***path, * @return the end of the route. */ static inline struct rope_node *** -avl_route_to_offset(struct rope_node ***path, rsize_t *p_offset, +avl_route_to_offset(struct rope_node ***path, rope_size_t *p_offset, ssize_t adjust_size) { - rsize_t offset = *p_offset; + rope_size_t offset = *p_offset; while (**path) { struct rope_node *node = **path; node->tree_size += adjust_size; - rsize_t left_size = rope_node_size(node->link[0]); + rope_size_t left_size = rope_node_size(node->link[0]); if (offset < left_size) { /* The offset lays in the left subtree. */ @@ -301,7 +301,7 @@ avl_route_to_offset(struct rope_node ***path, rsize_t *p_offset, * (previous node) or leftmost leaf of the right child. */ static inline struct rope_node *** -avl_route_to_next(struct rope_node ***path, int dir, rssize_t adjust_size) +avl_route_to_next(struct rope_node ***path, int dir, rope_ssize_t adjust_size) { struct rope_node *node = **path; *++path = &node->link[dir]; @@ -334,7 +334,7 @@ avl_route_to_next(struct rope_node ***path, int dir, rssize_t adjust_size) * heights and sizes of all modified nodes. */ int -rope_insert(struct rope *rope, rsize_t offset, void *data, rsize_t size) +rope_insert(struct rope *rope, rope_size_t offset, void *data, rope_size_t size) { if (offset > rope_size(rope)) offset = rope_size(rope); @@ -380,7 +380,7 @@ rope_insert(struct rope *rope, rsize_t offset, void *data, rsize_t size) /** Make sure there is a rope node at the given offset. */ struct rope_node * -rope_extract_node(struct rope *rope, rsize_t offset) +rope_extract_node(struct rope *rope, rope_size_t offset) { assert(offset < rope_size(rope)); @@ -419,7 +419,7 @@ rope_extract_node(struct rope *rope, rsize_t offset) * from rope_insert(). */ int -rope_erase(struct rope *rope, rsize_t offset) +rope_erase(struct rope *rope, rope_size_t offset) { assert(offset < rope_size(rope)); @@ -439,7 +439,7 @@ rope_erase(struct rope *rope, rsize_t offset) node->leaf_size -= 1; return 0; } - rsize_t size = node->leaf_size; + rope_size_t size = node->leaf_size; /* Cut the tail */ void *next = rope->split(rope->split_ctx, node->data, node->leaf_size, offset); @@ -622,7 +622,7 @@ rope_node_print(struct rope_node *node, const char *padding[] = { "│ ", " " }; - rsize_t child_prefix_len = strlen(prefix) + strlen(padding[0]) + 1; + rope_size_t child_prefix_len = strlen(prefix) + strlen(padding[0]) + 1; char *child_prefix = malloc(child_prefix_len); if (node && (node->link[0] || node->link[1])) { diff --git a/src/lib/salad/rope.h b/src/lib/salad/rope.h index d4418c588edcf50dc22b31134e290b195caaf4db..8908d074d8c8d5e0ad992ca31984484630b9d592 100644 --- a/src/lib/salad/rope.h +++ b/src/lib/salad/rope.h @@ -28,6 +28,7 @@ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ +#include <stdint.h> #include <stddef.h> #include <stdbool.h> @@ -35,8 +36,8 @@ extern "C" { #endif /* defined(__cplusplus) */ -typedef unsigned int rsize_t; -typedef int rssize_t; +typedef uint32_t rope_size_t; +typedef int32_t rope_ssize_t; typedef void *(*rope_split_func)(void *, void *, size_t, size_t); typedef void *(*rope_alloc_func)(void *, size_t); typedef void (*rope_free_func)(void *, void *); @@ -48,9 +49,9 @@ struct rope_node { /** Node height, see rope_node_height(), used for AVL balance. */ int height; /** Subtree size. */ - rsize_t tree_size; + rope_size_t tree_size; /* Substring size. */ - rsize_t leaf_size; + rope_size_t leaf_size; /* Substring. */ void *data; /* Left (0) and right (1) links */ @@ -81,13 +82,13 @@ struct rope_iter { struct rope_node *path[ROPE_HEIGHT_MAX]; }; -static inline rsize_t +static inline rope_size_t rope_node_size(struct rope_node *node) { return node ? node->tree_size : 0; } -static inline rsize_t +static inline rope_size_t rope_leaf_size(struct rope_node *node) { return node->leaf_size; @@ -99,7 +100,7 @@ rope_leaf_data(struct rope_node *node) return node->data; } -static inline rsize_t +static inline rope_size_t rope_size(struct rope *rope) { return rope_node_size(rope->root); @@ -171,8 +172,8 @@ rope_delete(struct rope *rope) * tree node */ int -rope_insert(struct rope *rope, rsize_t offset, void *data, - rsize_t size); +rope_insert(struct rope *rope, rope_size_t offset, void *data, + rope_size_t size); /** Append a substring at rope tail. */ static inline int @@ -189,10 +190,10 @@ rope_append(struct rope *rope, void *data, size_t size) * tree node */ struct rope_node * -rope_extract_node(struct rope *rope, rsize_t offset); +rope_extract_node(struct rope *rope, rope_size_t offset); static inline void * -rope_extract(struct rope *rope, rsize_t offset) +rope_extract(struct rope *rope, rope_size_t offset) { return rope_leaf_data(rope_extract_node(rope, offset)); } @@ -204,7 +205,7 @@ rope_extract(struct rope *rope, rsize_t offset) * @pre offset < rope_size(rope) */ int -rope_erase(struct rope *rope, rsize_t offset); +rope_erase(struct rope *rope, rope_size_t offset); /** Initialize an iterator. */ static inline void diff --git a/test/unit/rope.c b/test/unit/rope.c index 029aedc863571b6c378166ccb9ee103de9f9b871..e19dcaa1097b4c5fd792c601d6777050eeb5842d 100644 --- a/test/unit/rope.c +++ b/test/unit/rope.c @@ -3,7 +3,7 @@ #include "rope_common.h" static void -test_rope_extract(struct rope *rope, rsize_t pos) +test_rope_extract(struct rope *rope, rope_size_t pos) { printf("extract pos = %zu: ", (size_t) pos); struct rope_node *node = rope_extract_node(rope, pos); @@ -13,7 +13,7 @@ test_rope_extract(struct rope *rope, rsize_t pos) } static inline void -test_rope_cut(struct rope *rope, rsize_t offset, rsize_t size) +test_rope_cut(struct rope *rope, rope_size_t offset, rope_size_t size) { printf("erase offset = %zu, size = %zu \n", (size_t) offset, (size_t) size); while (size-- > 0) diff --git a/test/unit/rope_common.h b/test/unit/rope_common.h index 7a2fd751cb7e09f3264ffcba05671cda8d02327d..6c52153b2e3a406bdd6fcfde32c0f88d38ac66b2 100644 --- a/test/unit/rope_common.h +++ b/test/unit/rope_common.h @@ -37,7 +37,7 @@ test_rope_new() } static inline void -test_rope_insert(struct rope *rope, rsize_t offset, char *str) +test_rope_insert(struct rope *rope, rope_size_t offset, char *str) { printf("insert offset = %zu, str = '%s'\n", (size_t) offset, str); rope_insert(rope, offset, str, strlen(str)); @@ -46,7 +46,7 @@ test_rope_insert(struct rope *rope, rsize_t offset, char *str) } static inline void -test_rope_erase(struct rope *rope, rsize_t offset) +test_rope_erase(struct rope *rope, rope_size_t offset) { printf("erase offset = %zu\n", (size_t) offset); rope_erase(rope, offset); diff --git a/test/unit/rope_stress.c b/test/unit/rope_stress.c index 35c43a7a7cb15e65af36ec4cdb9db1ad484a40b5..dc3f2817e21a24ce28edfe4b75dd53ce4ab97897 100644 --- a/test/unit/rope_stress.c +++ b/test/unit/rope_stress.c @@ -14,15 +14,15 @@ test_rope_stress_small() const int iterations = 500; int i = 0; for (i = 0; i < iterations; ++i) { - char *d = data[((rsize_t) rand())%5]; + char *d = data[((rope_size_t) rand())%5]; int len = strlen(d); - rsize_t size = rope_size(rope); - rsize_t offset = ((rsize_t) rand()) % (size + 1); + rope_size_t size = rope_size(rope); + rope_size_t offset = ((rope_size_t) rand()) % (size + 1); rope_insert(rope, offset, d, len); fail_unless(size + len == rope_size(rope)); rope_check(rope); size = rope_size(rope); - offset = ((rsize_t) rand()) % size; + offset = ((rope_size_t) rand()) % size; if (offset == size) offset--; rope_erase(rope, offset); @@ -43,14 +43,14 @@ test_rope_stress_large() const int iterations = 50000; int i = 0; for (i = 0; i < iterations; ++i) { - char *d = data[((rsize_t) rand())%5]; + char *d = data[((rope_size_t) rand())%5]; int len = strlen(d); - rsize_t size = rope_size(rope); - rsize_t offset = ((rsize_t) rand()) % (size + 1); + rope_size_t size = rope_size(rope); + rope_size_t offset = ((rope_size_t) rand()) % (size + 1); rope_insert(rope, offset, d, len); fail_unless(size + len == rope_size(rope)); size = rope_size(rope); - offset = ((rsize_t) rand()) % size; + offset = ((rope_size_t) rand()) % size; if (offset == size) offset--; rope_erase(rope, offset);