Skip to content

v1.0.1

Choose a tag to compare

@alexbishop alexbishop released this 02 May 15:06
· 12 commits to main since this release

Warning

You should use version 1.0.2 instead of this version.

Changes

This release fixes issues with the functions postfixPrev, prefixNext, and prefixPrev; and issues with cached nodes.
This version all adds new tests to confirm that these new versions of the functions are correctly implemented.

How to Use

To use this package, add it as a dependency by running the following command.

zig fetch --save https://github.com/alexbishop/zig-rbtree/archive/refs/tags/v1.0.1.zip

This will update your build.zig.zon file with the correct url and hash for the package.

You can then import this package as a module by adding the following to the main function of you build.zig file

const rbtree = b.dependency("rbtree", .{
    .target = target,
    .optimize = optimize,
});
const rbtree_module = rbtree.module("rbtree");

For each dependency, you may then ads this module as follows:

dep.root_module.addImport("rbtree", rbtree_module);

Example

Add the module to the appropriate libraries and executables in build.zig. For example:

const std = @import("std");

pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});

    // get the module for red-black trees
    const rbtree = b.dependency("rbtree", .{
        .target = target,
        .optimize = optimize,
    });
    const rbtree_module = rbtree.module("rbtree");

    const exe = b.addExecutable(.{
        .name = "example-exe",
        .root_source_file = b.path("src/main.zig"),
        .target = target,
        .optimize = optimize,
    });
    // add the module
    exe.root_module.addImport("rbtree", rbtree_module);
    b.installArtifact(exe);
}

You can now import it as rbtree: For example, the contents of src/main.zig could be

const std = @import("std");
const rbtreelib = @import("rbtree");

pub const DefaultRBTree = rbtreelib.DefaultRBTree;

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    const allocator = gpa.allocator();

    const Tree = DefaultRBTree(i32, f32);

    var tree = Tree.init(allocator, void{});
    defer tree.deinit();

    // insert some stuff into the tree
    var index: i32 = -19;
    while (index < 20) : (index += 1) {
        const value = std.math.pow(
            f32,
            0.5,
            @floatFromInt(index),
        );
        try tree.put(index, value);
    }

    // print the contents of the tree
    {
        std.debug.print("First print\n", .{});
        var current: ?*Tree.Node = tree.findMin();
        while (current) |c| : (current = c.next()) {
            std.debug.print("Node {} -> {}\n", .{ c.key, c.value });
        }
    }

    // remove some entries from the tree
    _ = tree.remove(7);
    _ = tree.remove(3);
    _ = tree.remove(5);

    // print it again
    {
        std.debug.print("\nSecond print\n", .{});
        var current: ?*Tree.Node = tree.findMin();
        while (current) |c| : (current = c.next()) {
            std.debug.print("Node {} -> {}\n", .{ c.key, c.value });
        }
    }
}