{"id":13710528,"url":"https://github.com/Aandreba/zigrc","last_synced_at":"2025-05-06T19:32:01.410Z","repository":{"id":169534185,"uuid":"645493888","full_name":"Aandreba/zigrc","owner":"Aandreba","description":"Zig reference-counted pointers inspired by Rust's Rc and Arc","archived":false,"fork":false,"pushed_at":"2025-03-24T22:15:58.000Z","size":79,"stargazers_count":71,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-09T22:18:13.934Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://aandreba.github.io/zigrc/","language":"Zig","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Aandreba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","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},"funding":{"github":"Aandreba"}},"created_at":"2023-05-25T19:28:40.000Z","updated_at":"2025-03-26T04:01:42.000Z","dependencies_parsed_at":"2024-05-08T17:36:03.821Z","dependency_job_id":"d6bfdc1f-45a3-4a66-84ca-dcd69e9f05dd","html_url":"https://github.com/Aandreba/zigrc","commit_stats":null,"previous_names":["aandreba/zig-rc","aandreba/zigrc"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aandreba%2Fzigrc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aandreba%2Fzigrc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aandreba%2Fzigrc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Aandreba%2Fzigrc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Aandreba","download_url":"https://codeload.github.com/Aandreba/zigrc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252753530,"owners_count":21798975,"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":[],"created_at":"2024-08-02T23:00:57.846Z","updated_at":"2025-05-06T19:31:56.394Z","avatar_url":"https://github.com/Aandreba.png","language":"Zig","readme":"![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/Aandreba/zigrc/tests.yml)\r\n[![Docs](https://img.shields.io/badge/docs-zig-blue)](https://aandreba.github.io/zigrc)\r\n\r\n# zigrc\r\n\r\nReference-counted pointers for Zig inspired by Rust's [`Rc`](https://doc.rust-lang.org/stable/std/rc/struct.Rc.html) and [`Arc`](https://doc.rust-lang.org/stable/std/sync/struct.Arc.html)\r\n\r\n## How to use\r\n\r\nTo use `zigrc`, import the `src/root.zig` file into your project, or add it as a module by running command shown below in your project directory.\r\n\r\n```console\r\n# you can fetch via archive\r\nzig fetch \"https://github.com/Aandreba/zigrc/archive/refs/tags/0.4.0.tar.gz\" --save=zigrc\r\n\r\n# or fetch via git\r\nzig fetch \"git+https://github.com/Aandreba/zigrc#\u003cref id\u003e\" --save=zigrc\r\n```\r\n\r\nThen import it in your build file (`build.zig`):\r\n```zig\r\npub fn build(b: *std.Build) void {\r\n// ...\r\n    // Import the dependency\r\n    const zigrc_dep = b.dependency(\"zigrc\", .{});\r\n\r\n    // Extract the module\r\n    const zigrc_mod = \u0026zigrc_dep.artifact(\"zig-rc\").root_module;\r\n\r\n    // Add the dependency as an import to your library/executable\r\n    exe.root_module.addImport(\"zigrc\", zigrc_mod);\r\n    lib.root_module.addImport(\"zigrc\", zigrc_mod);\r\n    unit_tests.root_module.addImport(\"zigrc\", zigrc_mod);\r\n// ...\r\n}\r\n```\r\n\r\n## Example\r\n\r\n```zig\r\nconst std = @import(\"std\");\r\nconst rc = @import(\"zigrc\");\r\n\r\nconst Thread = std.Thread;\r\nconst Mutex = Thread.Mutex;\r\n\r\nconst ArrayList = std.ArrayList;\r\nconst Arc = rc.Arc(Data);\r\n\r\nconst THREADS = 8;\r\n\r\nconst Data = struct {\r\n    mutex: Mutex = Mutex{},\r\n    data: ArrayList(u64) = ArrayList(u64).init(std.testing.allocator),\r\n\r\n    pub fn deinit(self: Data) void {\r\n        self.data.deinit();\r\n    }\r\n};\r\n\r\ntest \"example\" {\r\n    std.debug.print(\"\\n\", .{});\r\n    std.debug.print(\"Data size: {}\\n\", .{@sizeOf(Data)});\r\n    std.debug.print(\"Heap size: {}\\n\\n\", .{Arc.innerSize()});\r\n\r\n    std.debug.print(\"Data align: {}\\n\", .{@alignOf(Data)});\r\n    std.debug.print(\"Heap align: {}\\n\\n\", .{Arc.innerAlign()});\r\n\r\n    var value = try Arc.init(std.testing.allocator, .{});\r\n    errdefer if (value.releaseUnwrap()) |val| val.deinit();\r\n\r\n    var handles: [THREADS]Thread = undefined;\r\n    var i: usize = 0;\r\n    while (i \u003c THREADS) {\r\n        const this_value = value.retain();\r\n        errdefer if (this_value.releaseUnwrap()) |val| val.deinit();\r\n        handles[i] = try Thread.spawn(.{}, thread_exec, .{this_value});\r\n        i += 1;\r\n    }\r\n\r\n    for (handles) |handle| handle.join();\r\n    const owned_value: Data = value.tryUnwrap().?;\r\n    defer owned_value.deinit();\r\n\r\n    std.debug.print(\"{d}\\n\", .{owned_value.data.items});\r\n}\r\n\r\nfn thread_exec(data: Arc) !void {\r\n    defer if (data.releaseUnwrap()) |val| val.deinit();\r\n\r\n    var rng = std.rand.DefaultPrng.init(@as(u64, @bitCast(@as(i64, @truncate(std.time.nanoTimestamp())))));\r\n\r\n    data.value.mutex.lock();\r\n    defer data.value.mutex.unlock();\r\n\r\n    const value = rng.random().int(u64);\r\n    try data.value.data.append(value);\r\n\r\n    std.debug.print(\"{}: {}\\n\", .{ std.time.nanoTimestamp(), value });\r\n}\r\n```\r\n\r\n## Builds\r\n\r\n**Genrate docs**\r\n`zig build`\r\n\r\n**Run tests**\r\n`zig build test`\r\n\r\n**Run examples**\r\n`zig build example`\r\n\r\n**Generate coverage report (requires kcov)**\r\n`zig build test -Dcoverage`\r\n","funding_links":["https://github.com/sponsors/Aandreba"],"categories":["Language Essentials"],"sub_categories":["Memory Allocator and Management"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAandreba%2Fzigrc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAandreba%2Fzigrc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAandreba%2Fzigrc/lists"}