{"id":15048936,"url":"https://github.com/mirek/rb_tree","last_synced_at":"2025-04-10T01:34:39.182Z","repository":{"id":137252910,"uuid":"4327007","full_name":"mirek/rb_tree","owner":"mirek","description":"Red-black tree C implementation","archived":false,"fork":false,"pushed_at":"2018-12-03T22:25:09.000Z","size":96,"stargazers_count":37,"open_issues_count":2,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-24T03:12:18.829Z","etag":null,"topics":["c-language","library"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mirek.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2012-05-14T17:52:35.000Z","updated_at":"2024-11-30T12:47:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"59e5238f-8918-4425-8f0e-e08fdf2f752a","html_url":"https://github.com/mirek/rb_tree","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirek%2Frb_tree","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirek%2Frb_tree/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirek%2Frb_tree/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mirek%2Frb_tree/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mirek","download_url":"https://codeload.github.com/mirek/rb_tree/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248140941,"owners_count":21054371,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-language","library"],"created_at":"2024-09-24T21:17:14.847Z","updated_at":"2025-04-10T01:34:39.155Z","avatar_url":"https://github.com/mirek.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Red-black tree C implementation\n\nBased on Julienne Walker's \u003chttp://eternallyconfuzzled.com/\u003e red-black tree implementation.\n\n## Usage\n\nFirst, grab the source into your project, you'll need just those two:\n\n    wget https://raw.github.com/mirek/rb_tree/master/rb_tree.h\n    wget https://raw.github.com/mirek/rb_tree/master/rb_tree.c\n\nLet's say you want to store `struct iovec` objects (defined in `sys/uio.h`) with the following definition:\n\n    struct iovec {\n    \t  void  *iov_base; // [XSI] Base address of I/O memory region\n      \tsize_t iov_len;  // [XSI] Size of region iov_base points to\n    };\n\nYou'll need to provide comparison callback for your object. Let's say you want to keep track\nof the length of the iovec buffers, your callback should look similar to:\n\n    int\n    my_cmp_cb (struct rb_tree *self, struct rb_node *node_a, struct rb_node *node_b) {\n        struct iovec *a = (struct iovec *) node_a-\u003evalue;\n        struct iovec *b = (struct iovec *) node_b-\u003evalue;\n        return (a-\u003eiov_len \u003e b-\u003eiov_len) - (a-\u003eiov_len \u003c b-\u003eiov_len);\n    }\n\nTo create your red-black tree:\n\n    struct rb_tree *tree = rb_tree_create(my_cmp_cb);\n    if (tree) {\n        \n        // Use the tree here...\n        for (int i = 0; i \u003c 10; i++) {\n            struct iovec *v = malloc(sizeof *v);\n            v-\u003eiov_base = (void *) i;\n            v-\u003eiov_len = i * i;\n            \n            // Default insert, which allocates internal rb_nodes for you.\n            rb_tree_insert(tree, v);\n        }\n        \n        // To f\n        struct iovec *f = rb_tree_find(tree, \u0026 (struct iovec) { .iov_base = (void *) 7, .iov_len = 0 });\n        if (r) {\n            fprintf(stdout, \"found iovec(.iov_base = %p, .iov_len = %zu)\\n\", f-\u003eiov_base, f-\u003eiov_len)\n        } else {\n            printf(\"not found\\n\");\n        }\n\n        // Dealloc call can take optional parameter to notify on each node\n        // being deleted so you can free the node and/or your object:\n        rb_tree_dealloc(tree, NULL);\n    }\n\nAbove example will leak because malloc is not balanced with free.\n\nIf you want to iterate over elements (here in reverse order):\n\n    struct rb_iter *iter = rb_iter_create();\n    if (iter) {\n        for (struct iovec *v = rb_iter_last(iter, tree); v; v = rb_iter_prev(iter)) {\n            printf(\"- %p %zu\\n\", v-\u003eiov_base, v-\u003eiov_len);\n        }\n        rb_iter_dealloc(iter);\n    }\n\n## License\n\nNone (Public Domain).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirek%2Frb_tree","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmirek%2Frb_tree","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmirek%2Frb_tree/lists"}